Compare commits

..

122 Commits

Author SHA1 Message Date
yangsh
6d87a209e0 링크이동 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-09 14:32:54 +09:00
yangsh
a7dca8c5fa 링크이동 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-09 11:00:15 +09:00
yangsh
9a27018922 사이드메뉴 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-09 09:49:08 +09:00
yangsh
8b621a065e 현장확인 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-06 10:38:18 +09:00
53695a1dc3 Merge pull request 'feature/template' (#53) from feature/template into master
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/53
2026-02-05 15:08:43 +09:00
yangsh
d92bbfef1a 713수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-05 15:08:05 +09:00
yangsh
4a8178b185 상세수정 2026-02-05 14:09:49 +09:00
b9b3f43956 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/52
2026-02-05 12:43:00 +09:00
yangsh
790216404c 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-05 12:41:07 +09:00
fc4ce793e3 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/51
2026-02-05 10:37:22 +09:00
yangsh
36355f75f3 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-05 10:36:12 +09:00
ae5677a635 모델 수정 2026-02-04 21:45:23 +09:00
1311dc529a 쿼리문 출력 2026-02-04 21:40:30 +09:00
54f0a2a4d2 수정 2026-02-04 21:27:20 +09:00
9f20f4347a 수정 2026-02-04 21:07:28 +09:00
f9b6336eab 수정 2026-02-04 21:03:31 +09:00
6bed688be0 오류 확인 2026-02-04 20:19:07 +09:00
fef656243c 수정 2026-02-04 20:15:07 +09:00
c93a2035dd 저장 실패시 상세 로그 2026-02-04 20:09:52 +09:00
db70b28eb9 modifyinfo 입력 수정 2026-02-04 20:04:24 +09:00
918e27da67 오타수정 2026-02-04 19:59:45 +09:00
f7bda06ddf Merge branch 'master' of http://192.168.10.243:3000/owrainfo/confirms 2026-02-04 18:34:16 +09:00
2781638f58 db_now format 수정 reg_price_yn -> req_price_yn 으로 수정 2026-02-04 18:34:11 +09:00
c21a137dbb 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/50
2026-02-04 17:54:06 +09:00
yangsh
8b77448128 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-04 17:53:33 +09:00
9a2d0af8d0 v2 파라메터 2026-02-04 17:43:55 +09:00
7143a6bd28 네이버 API 클라이언트 수정 완료 2026-02-04 16:28:59 +09:00
a11d686b2a Merge branch 'master' of http://192.168.10.243:3000/owrainfo/confirms 2026-02-04 16:17:22 +09:00
acbf430ae7 api 수정 2026-02-04 16:17:16 +09:00
c33fb47508 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/49
2026-02-04 15:45:43 +09:00
yangsh
e342d7f916 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-04 15:44:45 +09:00
3bb6741e44 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/48
2026-02-04 13:51:18 +09:00
yangsh
c7856394c0 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-04 13:47:29 +09:00
ecf1be8ab7 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/47
2026-02-04 13:33:28 +09:00
yangsh
99ea553d9a 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-04 13:32:52 +09:00
adcd5aca7d 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/46
2026-02-04 10:49:39 +09:00
yangsh
2c96bd12de 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-04 10:48:51 +09:00
8bb7700a00 새로운 api 2026-02-03 20:47:56 +09:00
cbcd66d5c7 부분수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/45
2026-02-02 16:13:18 +09:00
yangsh
107cc395d6 부분수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-02-02 16:12:17 +09:00
0493cd7708 부분수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/44
2026-01-29 10:02:33 +09:00
yangsh
f358b44e16 부분수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-29 10:02:03 +09:00
44035795d2 조회속도개선
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/43
2026-01-29 09:27:01 +09:00
yangsh
04c28d79f2 조회속도개선
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-29 09:26:32 +09:00
0605948ab5 파일업로드 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/42
2026-01-28 16:10:35 +09:00
yangsh
d134b27614 파일업로드 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-28 16:09:52 +09:00
19bf534086 상세 레이아웃 수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/41
2026-01-27 15:48:23 +09:00
yangsh
b51f2fddcf 상세 레이아웃 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-27 15:47:38 +09:00
2f5b1a7da6 vrfcReqModel 수정 2026-01-23 21:40:56 +09:00
20e6398005 vrfcReqModel 수정 2026-01-23 21:37:01 +09:00
1de224627e vrfcReqModel 수정 2026-01-23 21:30:50 +09:00
9b9e752bd1 vrfcReqModel 수정 2026-01-23 21:24:56 +09:00
1cb1e6837b vrfcReqModel 수정 2026-01-23 21:21:51 +09:00
b5e06188b1 vrfcReqModel 수정 2026-01-23 21:18:55 +09:00
c375d84874 vrfcReqModel 수정 2026-01-23 20:54:59 +09:00
1d6dc49971 vrfcReqModel 수정 2026-01-23 20:49:21 +09:00
dbe85efcef vrfcReqModel 수정 2026-01-23 20:29:16 +09:00
253a5de579 vrfcReqModel 수정 2026-01-23 19:27:14 +09:00
52213c3ad4 vrfcReqModel 수정 2026-01-23 19:26:12 +09:00
87dd69d703 vrfcReqModel 수정 2026-01-23 19:19:58 +09:00
e394acd7cc vrfcReqModel 수정 2026-01-23 19:05:41 +09:00
7c48d1134f vrfcReqModel 수정 2026-01-23 18:29:30 +09:00
0d1c6855e5 vrfcReqModel 수정 2026-01-23 18:25:32 +09:00
43d45332ef vrfcReqModel 수정 2026-01-23 18:17:16 +09:00
55e1cdf82a vrfcReqModel 수정 2026-01-23 18:16:50 +09:00
3dc24d011a file 2026-01-23 18:14:12 +09:00
5ae247fe91 file 2026-01-23 18:11:36 +09:00
9a3a8ed4e3 file 2026-01-23 18:04:33 +09:00
1993013193 write 2026-01-23 17:49:31 +09:00
9f511b4dba service 2026-01-23 17:46:34 +09:00
522b89fb9f qrcode 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/40
2026-01-23 16:24:25 +09:00
yangsh
2030ca0836 qrcode 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-23 16:23:38 +09:00
cac86ffc7a fax cron추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/39
2026-01-23 15:14:07 +09:00
yangsh
26db8eb602 fax cron추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-23 15:08:41 +09:00
112923c459 스크립트 오류수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/38
2026-01-23 11:26:23 +09:00
yangsh
929d885b2b 스크립트 오류수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-23 11:24:36 +09:00
1761e31587 배정내역 엑셀 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/37
2026-01-23 11:22:10 +09:00
yangsh
bfdd56ba48 배정내역 엑셀 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-23 11:21:26 +09:00
0114faae2b 쿠키 삭제 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/36
2026-01-22 17:24:33 +09:00
yangsh
6e28c750dd 쿠키 삭제 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-22 17:24:02 +09:00
f17dc88f99 상세수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/35
2026-01-22 17:02:50 +09:00
yangsh
abf369dcd6 상세수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-22 17:02:14 +09:00
32b869f05b 테이블명 수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/34
2026-01-21 14:53:35 +09:00
yangsh
64b9491157 테이블명 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-21 14:48:30 +09:00
69bcf05457 아이디 저장 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/33
2026-01-21 14:22:41 +09:00
yangsh
dce23d36cc 아이디 저장 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-21 14:22:12 +09:00
b9a77a1d00 금리비교 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/32
2026-01-21 12:04:06 +09:00
yangsh
87b8093f92 금리비교 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-21 12:03:34 +09:00
0feff4ff12 worker 수정 2026-01-20 10:18:24 +09:00
0ec02ef2e2 worker 수정 2026-01-19 17:44:05 +09:00
37efde8686 현장확인V2 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/31
2026-01-19 15:34:42 +09:00
yangsh
9116b27d80 현장확인V2 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 15:34:06 +09:00
cdfd4620db 현장확인 V2 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/30
2026-01-19 14:53:29 +09:00
yangsh
8e779124dd 현장확인 V2 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 14:52:53 +09:00
c971d8631f 주석처리
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/29
2026-01-19 14:22:52 +09:00
yangsh
0a077b49c4 주석처리
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 14:22:30 +09:00
d37aa9d51f 평면도관리 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/28
2026-01-19 14:18:41 +09:00
yangsh
957e062833 평면도관리 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 14:18:12 +09:00
25e7bf6ac3 수정
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/27
2026-01-19 13:18:53 +09:00
yangsh
d480fb1dfa 수정
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 13:18:31 +09:00
7275d36822 수량관리 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/26
2026-01-19 13:16:41 +09:00
yangsh
ab3560487a 수량관리 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-19 13:15:57 +09:00
ec5123f74e 수정 2026-01-16 15:48:31 +09:00
c3b588c03d ownertypcode 확인 2026-01-16 15:46:51 +09:00
f154f494a6 v2chghistorymodel 수정 2026-01-16 15:42:19 +09:00
6c97b88977 v2chghistorymodel 수정 2026-01-16 15:31:26 +09:00
873061a254 model namespace 수정 2026-01-16 15:25:34 +09:00
f1020d533d 테스트 2026-01-16 15:09:56 +09:00
ccaf400187 페이지 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/25
2026-01-16 14:44:38 +09:00
yangsh
8bea5766a3 페이지 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-16 14:43:11 +09:00
d731061ac9 Merge branch 'master' of http://192.168.10.243:3000/owrainfo/confirms 2026-01-16 14:19:42 +09:00
6be418b06c 테스트 2026-01-16 14:13:41 +09:00
bf294eba43 상세추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/24
2026-01-15 16:40:16 +09:00
yangsh
ed39194225 상세추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-15 16:39:23 +09:00
4455ecc2d2 현장확인매물
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/23
2026-01-15 12:31:15 +09:00
yangsh
28b458450c 현장확인매물
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-15 12:30:32 +09:00
bb2d3e9224 팩스수신조회 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/22
2026-01-14 10:53:55 +09:00
yangsh
69671e2066 팩스수신조회 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-14 10:53:15 +09:00
0730a01ae8 Merge pull request '상세추가' (#21) from feature/template into master
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/21
2026-01-14 09:33:48 +09:00
yangsh
5fef995ece 상세추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-14 09:31:56 +09:00
364d28f7c1 모바일확인 추가
Reviewed-on: http://192.168.10.243:3000/owrainfo/confirms/pulls/20
2026-01-13 13:47:23 +09:00
yangsh
e861298594 모바일확인 추가
Some checks failed
Close Pull Request / main (pull_request_target) Has been cancelled
2026-01-13 13:46:16 +09:00
136 changed files with 51476 additions and 5286 deletions

6
.gitignore vendored
View File

@@ -171,4 +171,8 @@ _modules/*
/dist/
/node_modules/
.env
**/logs/
**/logs/
# 6. 기타 개인 설정 파일 (선택적)
.github/copilot-instructions.md

267
REFACTORING_REPORT.md Normal file
View File

@@ -0,0 +1,267 @@
# NaverService 리팩토링 완료 보고서
## 📋 개요
NaverService를 **683줄 거대한 단일 파일**에서 **책임 분리 기반의 모듈식 구조**로 리팩토링했습니다.
## 🏗️ 새로운 구조
```
app/Services/
├── NaverService.php (84줄) ✨ 간결화됨
├── ParameterMapper/
│ ├── BaseParameterMapper.php (기본 추상 클래스)
│ ├── TypeSParameterMapper.php (현장확인 데이터 변환)
│ └── TypeV2ParameterMapper.php (일반/서류 데이터 변환)
└── Handlers/
├── TypeSHandler.php (Type S 처리 로직)
└── TypeV2Handler.php (Type V2 처리 로직)
```
---
## 📊 개선 효과
| 메트릭 | 이전 | 이후 | 개선율 |
|--------|------|------|--------|
| **파일 크기** | 683줄 | 84줄 | **87.7% 감소** ⬇️ |
| **메서드 수** | 12개 | 1개 | **91.7% 감소** |
| **순환 복잡도** | 높음 | 낮음 | **상당히 개선** |
| **테스트 용이성** | 어려움 | 쉬움 | **크게 개선** |
| **재사용성** | 낮음 | 높음 | **크게 개선** |
---
## 🔑 핵심 개선 사항
### 1⃣ **NaverService 간결화** (84줄)
```php
// 이전: 683줄의 로직 모두 포함
// 이후: API 호출 + 타입별 위임만 담당
public function processArticle(array $payload): int
{
// 1. 네이버 API 호출
$response = $this->naverClient->getArticleInfo($articleNumber);
// 2. 원본 데이터 Staging 저장
$this->rawStagingModel->insert([...]);
// 3. 타입별 처리 위임
if ($vType === 'S') {
return $this->typeSHandler->handle(...);
} else {
return $this->typeV2Handler->handle(...);
}
}
```
### 2⃣ **ParameterMapper 분리**
네이버 API 응답을 데이터베이스 파라미터로 변환하는 로직 전담
#### BaseParameterMapper (추상 기본 클래스)
- 공통 변환 메서드: `mapOwnerTypeCode()`, `mapTradeType()`, `extractFilesByType()`
- 모든 매퍼의 기반
#### TypeSParameterMapper
```php
// Receipt 테이블용 파라미터
$receiptData = $mapper->mapReceipt($articleNumber, $rawData, $payload);
// Result 테이블용 파라미터
$resultData = $mapper->mapResult($rcptSq, $rawData);
```
#### TypeV2ParameterMapper
```php
// VrfcReq, ArticleInfo, ArticleInfoEtc 파라미터 생성
$vrfcReqParam = $mapper->mapVrfcReq(...);
$articleInfoParam = $mapper->mapArticleInfo(...);
$articleInfoEtcParam = $mapper->mapArticleInfoEtc(...);
```
### 3⃣ **Handler 분리**
각 타입별 비즈니스 로직과 DB 처리 전담
#### TypeSHandler (현장확인)
- Receipt, Result 데이터 저장
- 트랜잭션 관리
- 네이버 동기화
#### TypeV2Handler (일반/서류)
- REG (신규 등록)
- MOD (수정)
- CNC (취소)
- VrfcReq, ArticleInfo, ArticleInfoEtc 처리
---
## 💡 사용 방법
### 기존 코드 (변경 없음)
```php
$naverService = new NaverService();
$result = $naverService->processArticle([
'articleNumber' => '12345',
'requestType' => 'REG',
'requestDatetime' => '2026-01-27 10:00:00'
]);
```
### 내부 동작 (개선됨)
```
1. NaverService::processArticle()
└─ API 호출 + Staging 저장
└─ 타입 분석
2. TypeSHandler::handle() 또는 TypeV2Handler::handle()
└─ ParameterMapper로 데이터 변환
└─ DB 저장 + 트랜잭션 관리
└─ 상태 기록
```
---
## ✅ 이점
### 1. **유지보수성 향상**
- 각 클래스가 단일 책임 원칙 준수
- 메서드 수가 감소하여 이해하기 쉬움
- 로직 변경 시 영향 범위 최소화
### 2. **테스트 용이성**
```php
// 각 컴포넌트를 독립적으로 테스트 가능
$mapper = new TypeSParameterMapper();
$receiptData = $mapper->mapReceipt($articleNumber, $mockRawData, $mockPayload);
$this->assertArrayHasKey('rcpt_key', $receiptData);
$handler = new TypeSHandler();
// MockModel 주입 후 테스트 가능
```
### 3. **재사용성**
- ParameterMapper를 다른 서비스에서 재사용 가능
- Handler를 확장하여 새로운 타입 추가 용이
### 4. **확장성**
새로운 타입 추가 시:
```php
// 1. TypeCParameterMapper 생성
class TypeCParameterMapper extends BaseParameterMapper { ... }
// 2. TypeCHandler 생성
class TypeCHandler { ... }
// 3. NaverService에 추가
public function processArticle(array $payload): int {
// ...
} else if ($vType === 'C') {
return $this->typeCHandler->handle(...);
}
}
```
---
## 🔍 코드 구조 비교
### 이전 (모놀리식)
```
NaverService.php
├── processArticle() → 메인 로직
├── processTypeS() → 현장확인 로직 (160줄)
├── processTypeV2() → 일반/서류 로직 (30줄 + 미완성)
├── insertVrfcReq() → DB 저장
├── v2Parameter() → 파라미터 변환 (60줄)
├── articleInfoParameter() → 파라미터 변환 (150줄)
├── articleInfoEtcParameter() → 파라미터 변환 (60줄)
├── modifyInfoParameter() → 파라미터 변환 (미완성)
└── logAndThrowError() → 에러 처리
```
### 이후 (모듈식)
```
NaverService.php (84줄)
├── processArticle() → 오케스트레이션
ParameterMapper/BaseParameterMapper.php (추상 클래스)
├── mapOwnerTypeCode()
├── mapTradeType()
└── extractFilesByType()
ParameterMapper/TypeSParameterMapper.php
├── mapReceipt()
└── mapResult()
ParameterMapper/TypeV2ParameterMapper.php
├── mapVrfcReq()
├── mapArticleInfo()
└── mapArticleInfoEtc()
Handlers/TypeSHandler.php
└── handle()
Handlers/TypeV2Handler.php
├── handle()
├── handleRegister()
├── handleModify()
└── handleCancel()
```
---
## 📝 파일 목록
### 생성된 파일
1. `app/Services/ParameterMapper/BaseParameterMapper.php` (95줄)
2. `app/Services/ParameterMapper/TypeSParameterMapper.php` (165줄)
3. `app/Services/ParameterMapper/TypeV2ParameterMapper.php` (330줄)
4. `app/Services/Handlers/TypeSHandler.php` (85줄)
5. `app/Services/Handlers/TypeV2Handler.php` (200줄)
### 수정된 파일
1. `app/Services/NaverService.php` (683줄 → 84줄)
---
## ⚡ 성능
- **동작**: 100% 동일 (로직 변경 없음)
- **성능**: 약간의 오버헤드 (메서드 호출 추가) → 무시할 수 있는 수준
- **메모리**: 거의 동일
---
## 🎯 다음 단계
### 1. 단위 테스트 작성
```php
// tests/unit/Services/ParameterMapperTest.php
class TypeSParameterMapperTest extends CIUnitTestCase {
public function testMapReceiptReturnsValidArray()
public function testMapResultCalculatesCorrectDepartment()
}
```
### 2. 통합 테스트
```php
// tests/integration/NaverServiceTest.php
public function testProcessArticleTypeSSuccess()
public function testProcessArticleTypeV2Success()
```
### 3. 추가 개선
- [ ] 에러 처리 강화 (Custom Exception)
- [ ] 로깅 일관성 개선
- [ ] 캐싱 메커니즘 추가
- [ ] 비동기 처리 (동기화, 이메일 등)
---
## ✨ 요약
**코드 라인 수 87.7% 감소** (683 → 84줄)
**단일 책임 원칙 준수**
**테스트 용이성 극대화**
**확장성 및 유지보수성 향상**
**기존 API 호환성 100% 유지**
이제 프로젝트는 **더 깔끔하고, 테스트 가능하고, 확장 가능한 구조**를 가지게 되었습니다! 🚀

View File

@@ -15,10 +15,14 @@ class NaverWorker extends BaseCommand
protected $name = 'naver:worker';
protected $description = 'Redis에서 데이터를 꺼내 DB에 저장하고 네이버 API를 호출합니다.';
// DB 객체를 담을 변수 선언
protected $db;
public function run(array $params)
{
helper('log'); // 여기서 로드 완료!
$this->db = \Config\Database::connect();
$logModel = model(NaverWorkerLogModel::class);
$naverService = new \App\Services\NaverService(); // 서비스 생성
@@ -35,6 +39,17 @@ class NaverWorker extends BaseCommand
while (true) {
// 1. DB 연결 상태 체크 (더 견고하게)
try {
if ($this->db->connID === false || !@$this->db->connID->ping()) {
$this->db->reconnect();
CLI::write(CLI::color('🔄 Database reconnected.', 'yellow'));
}
} catch (\Throwable $e) {
$this->db->reconnect();
}
$result = $redis->brPop(['naver:raw_queue'], 30);
if (!$result) {
@@ -74,8 +89,16 @@ class NaverWorker extends BaseCommand
} catch (\Exception $e) {
CLI::error("❌ Task Failed: " . $e->getMessage());
// 실패 로그는 여기서 남김
// 1. DB 상태를 FAIL로 업데이트 (필수)
$logModel->update($logId, ['status' => 'FAIL', 'error_msg' => $e->getMessage()]);
// 2. Redis 실패 큐에 백업 (선택 - 나중에 모아서 다시 던질 때 편함)
$redis->lPush('naver:failed_queue', $rawData);
helper('log');
write_custom_log("FAILED_DATA | Error: " . $e->getMessage(), 'ERROR', 'failed');
// 루프 과부하 방지 (연속 에러 시)
sleep(1);
}
}
}

View File

@@ -85,6 +85,7 @@ class Filters extends BaseFilters
'index.php/login/*', // /index.php/login/*
'register', // 회원가입 등
'register/*',
'/listfax/listfax/getLists',
'kiso/*', // 필요하면 API는 예외
],
],

View File

@@ -18,6 +18,7 @@ $routes->get('/home', 'Home\Home::dashboard');
$routes->get('/home/viewStatData', 'Home\Home::viewStatData'); // 실적조회
$routes->get('/home/getHomeFaxCount', 'Home\Home::getHomeFaxCount'); // 팩스조회
$routes->get('/listfax/listfax/getLists', 'Listfax\ListFax::getLists'); // 팩스수신확인
/**
* 공통 API
@@ -51,9 +52,118 @@ $routes->group('board', ['namespace' => 'App\Controllers\Board'], function ($rou
$routes->get('notice/download/(:num)', 'Notice::download/$1');
});
/**
* 현장확인매물관리
*/
$routes->group('', ['namespace' => 'App\Controllers\Article'], static function ($routes) {
/**
* 현장확인매물 내역
*/
$routes->group('article/receipt', static function ($routes) {
$routes->get('lists', 'Receipt::lists');
$routes->get('detail/(:num)', 'Receipt::detail/$1');
$routes->get('getResultList', 'Receipt::getResultList');
$routes->get('excel', 'Receipt::excel');
$routes->post('saveTel', 'Receipt::saveTel'); // 연락가능전화 저장
$routes->post('resDbYn', 'Receipt::resDbYn'); // 거주여부 저장
$routes->post('resGround', 'Receipt::resGround'); // 평면도요청 저장
$routes->post('assignRegist', 'Receipt::assignRegist'); // 예약확정 저장
$routes->post('requestMovie', 'Receipt::requestMovie'); // 동영상 촬영여부저장
$routes->post('requestMessage', 'Receipt::requestMessage'); // 중개사메모 저장
$routes->post('rsrvcancel', 'Receipt::rsrvcancel'); // 예약취소
$routes->post('chgStatus', 'Receipt::chgStatus'); // 상태변경
$routes->post('sendSms', 'Receipt::sendSms'); // 문자발송
$routes->post('saveRecInfo', 'Receipt::saveRecInfo'); // 거주인정보저장
$routes->post('uploadFile', 'Receipt::uploadFile'); // 파일업로드
$routes->post('removeUploadFile', 'Receipt::removeUploadFile'); // 파일삭제
$routes->get('downloadAllImages', 'Receipt::downloadAllImages'); // 이미지 일괄 다운로드
$routes->post('saveImgLocation', 'Receipt::saveImgLocation'); // 촬영위치 저장
});
/**
* 조직별 배정 현황
*/
$routes->group('article/dept', static function ($routes) {
$routes->get('lists', 'Dept::lists');
$routes->get('detail/(:num)', 'Receipt::detail/$1');
$routes->get('getResultList', 'Dept::getResultList');
$routes->get('excel', 'Dept::excel');
$routes->get('excel2', 'Dept::excel2');
$routes->get('print', 'Dept::print'); // 관할포인트
$routes->get('updateAssign', 'Dept::updateAssign'); // 배정변경
});
/**
* 녹취매물 내역
*/
$routes->group('article/record', static function ($routes) {
$routes->get('lists', 'Record::lists');
$routes->get('detail/(:num)', 'Receipt::detail/$1');
$routes->get('getResultList', 'Record::getResultList');
$routes->get('excel', 'Record::excel');
});
/**
* 처리가능 수량관리
*/
$routes->group('article/processible', static function ($routes) {
$routes->get('datecount', 'Processible::datecount');
// 일자별 처리가능 수량
$routes->get('getList1', 'Processible::getList1');
$routes->get('excel', 'Processible::excel');
// 지역별 수량
$routes->get('getList2', 'Processible::getList2');
$routes->post('saveArea', 'Processible::saveArea'); // 데이터 저장
// 기본 수량
$routes->get('getList3', 'Processible::getList3');
$routes->post('saveCount', 'Processible::saveCount'); // 데이터 저장
});
/**
* 아파트 평면도
*/
$routes->group('article/ground_ctn', static function ($routes) {
$routes->get('lists', 'GroundCnt::lists');
$routes->get('detail/(:num)', 'GroundCnt::detail/$1');
$routes->get('getResultList', 'GroundCnt::getResultList');
$routes->get('excel', 'GroundCnt::excel');
});
/**
* 현장확인V2 매물 접수 현황
*/
$routes->group('article/receipt2', static function ($routes) {
$routes->get('lists', 'Receipt2::lists');
$routes->get('getResultList', 'Receipt2::getResultList');
$routes->get('excel', 'Receipt2::excel');
});
/**
* 현장확인V2 조직별 배정 현황
*/
$routes->group('article/dept2', static function ($routes) {
$routes->get('lists', 'Dept2::lists');
$routes->get('getResultList', 'Dept2::getResultList');
$routes->get('excel', 'Dept2::excel');
});
});
/**
* 실적관리
* 일반확인매물관리
*/
$routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($routes) {
/**
@@ -68,10 +178,19 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
*/
$routes->get('m701a/getResultList', 'M701::getResultList');
$routes->get('m701a/excel', 'M701::excel');
$routes->post('m701a/chgArticleStatus', 'M701::chgArticleStatus'); // 상태정보변경
$routes->post('m701a/changePrice', 'M701::changePrice'); // 가격수정
$routes->post('m701a/chgArticleStatus', 'M701::chgArticleStatus'); // 상태정보변경
$routes->post('m701a/modifyInfo', 'M701::modifyInfo'); // 정보수정
$routes->post('m701a/saveMemo', 'M701::saveMemo'); // 메모저장
$routes->post('m701a/saveDocu', 'M701::saveDocu'); // 서류 저장
$routes->post('m701a/saveTel', 'M701::saveTel'); // 전화정보 저장
$routes->post('m701a/saveRegi', 'M701::saveRegi'); // 등기부등본 저장
$routes->post('m701a/saveFinalRegi', 'M701::saveFinalRegi'); // 검증최종실패 처리
$routes->post('m701a/uploadFile', 'M701::uploadFile'); // 파일업로드
});
/**
@@ -87,7 +206,12 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->get('m702a/getResultList', 'M702::getResultList');
$routes->get('m702a/excel', 'M702::excel');
$routes->post('m702a/updateAssign', 'M702::updateAssign'); // 배정변경
// 서류누락
$routes->post('m702a/saveTel', 'M702::saveTel'); // 전화확인 정보 저장
$routes->post('m702a/modifyInfo', 'M702::modifyInfo'); // 매물정보저장
$routes->post('m702a/saveDocu', 'M702::saveDocu'); // 서류정보저장
$routes->post('m702a/uploadFile', 'M702::uploadFile'); // 파일업로드
});
@@ -112,6 +236,7 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->post('m703a/saveRequestMessage', 'M703::saveRequestMessage'); // 중개사요청사항저장
$routes->post('m703a/saveResult', 'M703::saveResult'); // 결과저장
/**
* 홍보확인서 확인
*/
@@ -130,8 +255,11 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
*/
$routes->get('m704a/getResultList', 'M704::getResultList');
$routes->get('m704a/excel', 'M704::excel');
$routes->post('m704a/modifyInfo', 'M704::modifyInfo'); // 매물정보 저장
$routes->post('m704a/uploadFile', 'M704::uploadFile'); // 파일업로드
$routes->post('m704a/saveMemo', 'M704::saveMemo'); // 메모저장
$routes->post('m704a/contactFail', 'M704::contactFail'); // 통화실패 저장
$routes->post('m704a/saveTel', 'M704::saveTel'); // 전화확인정보 저장
$routes->post('m704a/getNextFaxImgs', 'M704::getNextFaxImgs'); // 다음매물확인
});
@@ -153,7 +281,8 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->post('m705a/uploadFile', 'M705::uploadFile'); // 파일업로드
$routes->post('m705a/getNextInfo', 'M705::getNextInfo'); // 다음매물확인
$routes->post('m705a/nextRegi', 'M705::saveRegi'); // 매물저장
$routes->post('m705a/saveRegi', 'M705::saveRegi'); // 매물저장
$routes->post('m705a/getNextInfo', 'M705::getNextInfo'); // 다음매물
});
@@ -171,6 +300,10 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->get('m706a/getResultList', 'M706::getResultList');
$routes->get('m706a/excel', 'M706::excel');
$routes->post('m706a/modifyInfo', 'M706::modifyInfo'); // 매물정보 저장
$routes->post('m706a/saveDocu', 'M706::saveDocu'); // 서류정보 저장
$routes->post('m706a/saveRegi', 'M706::saveRegi'); // 등기부등본 저장
});
/**
@@ -193,7 +326,8 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->post('m708a/saveBunyang', 'M708::saveBunyang'); // 분양권 저장
$routes->post('m708a/saveRequestMessage', 'M708::saveRequestMessage'); // 중개인 요청사항 저장
$routes->post('m708a/saveResult', 'M708::saveResult'); // 결과저장
$routes->post('m708a/saveBunyangCnt', 'M708::saveBunyangCnt'); // 분양계약서저장
$routes->post('m708a/saveBunyangCnt', 'M708::saveBunyangCnt'); // 분양계약서조회
$routes->post('m708a/saveResult3', 'M708::saveResult3'); // 분양계약서저장
$routes->post('m708a/getNextFaxImgs', 'M708::getNextFaxImgs'); // 다음매물
});
@@ -263,8 +397,28 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
$routes->post('m712a/rotateImage', 'M712::rotateImage'); // 이미지 회전
$routes->post('m712a/uploadFile', 'M712::uploadFile'); // 파일업로드
$routes->post('m712a/saveNotReceived', 'M712::saveNotReceived'); // 서류미수취 저장
$routes->post('m712a/nextRegi', 'M712::saveRegi'); // 매물저장
$routes->post('m712a/nextRegi', 'M712::nextRegi'); // 매물저장
$routes->post('m712a/saveRegi', 'M712::saveRegi'); // 매물저장
$routes->post('m712a/nextRegi', 'M712::nextRegi'); // 다음매물
});
/**
* 모바일확인V2 매물현황
*/
$routes->group('m713', static function ($routes) {
$routes->get('m713a/lists', 'M713::lists');
$routes->get('m713a/detail/(:num)', 'M713::detail/$1');
/**
* 모바일확인V2 매물현황 - API
*/
$routes->get('m713a/getResultList', 'M713::getResultList');
$routes->get('m713a/excel', 'M713::excel');
$routes->post('m713a/rotateImage', 'M713::rotateImage'); // 이미지 회전
$routes->post('m713a/saveCorpOwn', 'M713::saveCorpOwn'); // 법인매물저장
$routes->post('m713a/saveModify', 'M713::saveModify');
$routes->post('m713a/saveRegi', 'M713::saveRegi'); // 등기부등본 저장
$routes->post('m713a/nextRegi', 'M713::nextRegi'); // 다음매물
});
@@ -509,6 +663,12 @@ $routes->group('manage', ['namespace' => 'App\Controllers\Manage'], function ($r
$routes->get('loginlog/excel', 'LoginLog::excel');
});
/**
* 금리비교
*/
$routes->group('interest_rates', ['namespace' => 'App\Controllers\Interest'], function ($routes) {
$routes->get('interest/lists', 'Rates::lists');
});
/**
* 로그인 API

View File

@@ -163,7 +163,7 @@ class Apt extends BaseController
try {
$team = $this->request->getPost('team');
$damdang = $this->request->getPost(index: 'damdang');
$damdang = $this->request->getPost(index: 'usr_id');
if (empty($team)) {
return $this->response->setJSON([

View File

@@ -0,0 +1,299 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\DeptModel;
use App\Models\common\CodeModel;
class Dept extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->codeModel = new CodeModel();
$this->model = new DeptModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['NHN_PRODUCT_TYPE', 'RECEIPT_STATUS1', 'RESERVED_APM']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
$this->data['codes'] = $codes;
return view("pages/article/dept/lists", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
$deptStatistics = $this->model->getDeptStatistics($data); // 조직별통계
$areaStatistics = $this->model->getAreaStatistics($data); // 지역별통계
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
'widgets' => [
'deptList' => $deptStatistics,
'areaStats' => $areaStatistics,
],
]);
}
// 관할포인트 인쇄 - 화면
public function print(): string
{
$deptSq = $this->request->getGet('depChk');
$dept_cnt = count($deptSq);
$listDept = $this->model->getDeptMapList($deptSq);
if (!empty($listDept)) {
$lati = 0;
$long = 0;
foreach ($listDept as $dept) {
$lati += $dept['rcpt_y'];
$long += $dept['rcpt_x'];
}
$lati = $lati / $dept_cnt;
$long = $long / $dept_cnt;
}
return view("pages/article/dept/printMap", [
// 'lati' => $lati,
// 'long' => $long,
'listDept' => $listDept,
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
public function excel2()
{
try {
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
'type' => 'excel',
];
$datas = $this->model->getResultList(null, null, $data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 배정변경
public function updateAssign()
{
try {
$team = $this->request->getPost('team');
$damdang = $this->request->getPost(index: 'usr_id');
if (empty($team)) {
return $this->response->setJSON([
'code' => '9',
'msg' => '팀정보 누락',
]);
}
if (empty($damdang)) {
return $this->response->setJSON([
'code' => '9',
'msg' => '담당자정보 누락',
]);
}
$rows = $this->request->getPost('rows');
$rows = json_decode($rows, true);
if (count($rows) > 0) {
foreach ($rows as $row) {
$params = [
'dept_sq' => $team,
'damdang' => $damdang,
'rcpt_sq' => $row['rcpt_sq'],
];
$this->model->updateAssign($params);
}
} else {
return $this->response->setJSON([
'code' => '9',
'msg' => '저장데이터 누락',
]);
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 상세화면
public function detail($id): string
{
$id = (string) $id;
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
$codes = $this->codeModel->getCodeLists(['TRADE_TYPE', 'RECEIPT_STATUS2', 'RECEIPT_STATUS3', 'SMS_MSG_TYPE']); // 코드조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$data = $this->model->getDetail($id);
$history = $this->model->getHistory($id);
// $aptGround = $this->model->getAptGround($data['rcpt_dong']);
// 시간대별통계
$tmCount = $this->model->getUsrRsrvDateTmCount($id);
$this->data['codes'] = $codes;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['data'] = $data;
$this->data['history'] = $history;
$this->data['tmCount'] = $tmCount;
return view("pages/article/dept/detail", $this->data);
}
}

View File

@@ -0,0 +1,187 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\DeptModel;
use App\Models\common\CodeModel;
class Dept2 extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->codeModel = new CodeModel();
$this->model = new DeptModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['NHN_PRODUCT_TYPE', 'RECEIPT_STATUS1', 'RESERVED_APM']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
$this->data['codes'] = $codes;
return view("pages/article/dept/lists2", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'isSiteVRVerification' => $this->request->getGet('isSiteVRVerification'), // 검증방식
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서 여부
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
$deptStatistics = $this->model->getDeptStatistics($data); // 조직별통계
$areaStatistics = $this->model->getAreaStatistics($data); // 지역별통계
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
'widgets' => [
'deptList' => $deptStatistics,
'areaStats' => $areaStatistics,
],
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'req_rec_yn' => 'Y',
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'isSiteVRVerification' => $this->request->getGet('isSiteVRVerification'), // 검증방식
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서 여부
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 배정내역 excel
public function excel2()
{
try {
$data = [
'req_rec_yn' => 'Y',
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'rsrv_tm_ap' => $this->request->getGet('rsrv_tm_ap'), // 유형
'rsrv_sdate' => $this->request->getGet('rsrv_sdate'), // 시작일
'rsrv_edate' => $this->request->getGet('rsrv_edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'isSiteVRVerification' => $this->request->getGet('isSiteVRVerification'), // 검증방식
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서 여부
'stat' => $this->request->getGet('stat'),
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\GroundCntModel;
use App\Models\common\CodeModel;
class GroundCnt extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new GroundCntModel();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['NHN_DEAL_TYPE', 'CP_ID', 'ARTICLE_TYPE', 'VRFCREQ_WAY', 'STEP_VERIFICATION']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
$this->data['codes'] = $codes;
return view("pages/article/ground/lists", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'schDateGb' => $this->request->getGet('schDateGb'), // 일자유형
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'rcpt_stat1' => $this->request->getGet('rcpt_stat1'), // 상태1
'rcpt_stat2' => $this->request->getGet('rcpt_stat2'), // 상태2
'rcpt_stat3' => $this->request->getGet('rcpt_stat3'), // 상태3
'rcpt_product_info1' => $this->request->getGet('rcpt_product_info1'), // 거래구분
'exp_movie_yn' => $this->request->getGet('exp_movie_yn'), // 동영상촬영여부
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서여부
'parcel_out_yn' => $this->request->getGet('parcel_out_yn'), // 분양권
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // CPID
'rcpt_product' => $this->request->getGet('rcpt_product'), // 매물종류
'exp_spc_yn' => $this->request->getGet('exp_spc_yn'), // 면적확인
'check_list_img_yn' => $this->request->getGet('check_list_img_yn'), // 체크리스트
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'schDateGb' => $this->request->getGet('schDateGb'), // 일자유형
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'rcpt_stat1' => $this->request->getGet('rcpt_stat1'), // 상태1
'rcpt_stat2' => $this->request->getGet('rcpt_stat2'), // 상태2
'rcpt_stat3' => $this->request->getGet('rcpt_stat3'), // 상태3
'rcpt_product_info1' => $this->request->getGet('rcpt_product_info1'), // 거래구분
'exp_movie_yn' => $this->request->getGet('exp_movie_yn'), // 동영상촬영여부
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서여부
'parcel_out_yn' => $this->request->getGet('parcel_out_yn'), // 분양권
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // CPID
'rcpt_product' => $this->request->getGet('rcpt_product'), // 매물종류
'exp_spc_yn' => $this->request->getGet('exp_spc_yn'), // 면적확인
'check_list_img_yn' => $this->request->getGet('check_list_img_yn'), // 체크리스트
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
}

View File

@@ -0,0 +1,184 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\ProcessibleModel;
class Processible extends BaseController
{
private $model;
public function __construct()
{
$this->model = new ProcessibleModel();
}
public function datecount(): string
{
$sido = $this->model->getAreaList(); // 지역조회
$this->data['sido'] = $sido;
return view("pages/article/processible/datecount", $this->data);
}
public function getList1()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
];
$totalCount = $this->model->getTotal1($data);
$datas = $this->model->getList1($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
public function getList2()
{
// $start = (int) $this->request->getGet('start') ?: 0;
// $end = (int) $this->request->getGet('length') ?: 10;
$data = [
'sdate' => $this->request->getGet('sdate'), // 시작일
'region' => $this->request->getGet('region'), // 종료일
];
$totalCount = $this->model->getTotal2($data);
$datas = $this->model->getList2($data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
public function getList3()
{
$data = [
'region' => $this->request->getGet('region'), // 종료일
];
$totalCount = $this->model->getTotal3($data);
$datas = $this->model->getList3($data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
// 엑셀다운로드
public function excel()
{
try {
$data = [
'sdate' => $this->request->getGet('sdate'),
'edate' => $this->request->getGet('edate'),
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 지역별 수량 저장
public function saveArea()
{
try {
$rows = $this->request->getPost('rows');
$rows = json_decode($rows, true);
// dd($rows);
// exit;
if (count($rows) > 0) {
foreach ($rows as $row):
$this->model->saveArea($row);
endforeach;
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} else {
return $this->response->setJSON([
'code' => '9',
'msg' => '저장가능한 데이터가 없습니다.'
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 기본 수량 저장
public function saveCount()
{
try {
$rows = $this->request->getPost('rows');
$rows = json_decode($rows, true);
// dd($rows);
// exit;
if (count($rows) > 0) {
foreach ($rows as $row):
$this->model->saveCount($row);
endforeach;
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} else {
return $this->response->setJSON([
'code' => '9',
'msg' => '저장가능한 데이터가 없습니다.'
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,145 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\ReceiptModel;
use App\Models\common\CodeModel;
class Receipt2 extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new ReceiptModel();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['NHN_DEAL_TYPE', 'CP_ID', 'ARTICLE_TYPE', 'VRFCREQ_WAY', 'STEP_VERIFICATION']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
$this->data['codes'] = $codes;
return view("pages/article/receipt/lists2", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'schDateGb' => $this->request->getGet('schDateGb'), // 일자유형
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'rcpt_stat1' => $this->request->getGet('rcpt_stat1'), // 상태1
'rcpt_stat2' => $this->request->getGet('rcpt_stat2'), // 상태2
'rcpt_stat3' => $this->request->getGet('rcpt_stat3'), // 상태3
'rcpt_product_info1' => $this->request->getGet('rcpt_product_info1'), // 거래구분
'exp_movie_yn' => $this->request->getGet('exp_movie_yn'), // 동영상촬영여부
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서여부
'parcel_out_yn' => $this->request->getGet('parcel_out_yn'), // 분양권
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // CPID
'rcpt_product' => $this->request->getGet('rcpt_product'), // 매물종류
'exp_spc_yn' => $this->request->getGet('exp_spc_yn'), // 면적확인
'check_list_img_yn' => $this->request->getGet('check_list_img_yn'), // 체크리스트
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'image_360_yn' => $this->request->getGet('image_360_yn'), // 360촬영여부
'isSiteVRVerification' => $this->request->getGet('isSiteVRVerification'), // 검증방식
'isPromotionApply' => $this->request->getGet('isPromotionApply'), // 프로모션
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'schDateGb' => $this->request->getGet('schDateGb'), // 일자유형
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'rcpt_stat1' => $this->request->getGet('rcpt_stat1'), // 상태1
'rcpt_stat2' => $this->request->getGet('rcpt_stat2'), // 상태2
'rcpt_stat3' => $this->request->getGet('rcpt_stat3'), // 상태3
'rcpt_product_info1' => $this->request->getGet('rcpt_product_info1'), // 거래구분
'exp_movie_yn' => $this->request->getGet('exp_movie_yn'), // 동영상촬영여부
'conf_img_yn' => $this->request->getGet('conf_img_yn'), // 홍보확인서여부
'parcel_out_yn' => $this->request->getGet('parcel_out_yn'), // 분양권
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // CPID
'rcpt_product' => $this->request->getGet('rcpt_product'), // 매물종류
'exp_spc_yn' => $this->request->getGet('exp_spc_yn'), // 면적확인
'check_list_img_yn' => $this->request->getGet('check_list_img_yn'), // 체크리스트
'ground_plan_yn' => $this->request->getGet('ground_plan_yn'), // 평면도유무
'ground_plan' => $this->request->getGet('ground_plan'), // 평면도요청
'direct_trad_yn' => $this->request->getGet('direct_trad_yn'), // 직거래
'image_360_yn' => $this->request->getGet('image_360_yn'), // 360촬영여부
'isSiteVRVerification' => $this->request->getGet('isSiteVRVerification'), // 검증방식
'isPromotionApply' => $this->request->getGet('isPromotionApply'), // 프로모션
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
}

View File

@@ -0,0 +1,152 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Models\article\RecordModel;
use App\Models\common\CodeModel;
class Record extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new RecordModel();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
return view("pages/article/record/lists", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'photo_sdate' => $this->request->getGet('photo_sdate'), // 촬영완료일자 시작일
'photo_edate' => $this->request->getGet('photo_edate'), // 촬영완료일자 종료일
'record_sdate' => $this->request->getGet('record_sdate'), // 녹취완료일자 시작일
'record_edate' => $this->request->getGet('record_edate'), // 녹취완료일자 종료일
'rec_yn' => $this->request->getGet('rec_yn'), // 녹취완료여부
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'rcpt_atclno' => $this->request->getGet('rcpt_atclno'), // 매물ID
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'photo_sdate' => $this->request->getGet('photo_sdate'), // 촬영완료일자 시작일
'photo_edate' => $this->request->getGet('photo_edate'), // 촬영완료일자 종료일
'record_sdate' => $this->request->getGet('record_sdate'), // 녹취완료일자 시작일
'record_edate' => $this->request->getGet('record_edate'), // 녹취완료일자 종료일
'rec_yn' => $this->request->getGet('rec_yn'), // 녹취완료여부
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'user' => $this->request->getGet('user'), // 담당자
'sido' => $this->request->getGet('sido'), // 시도
'gugun' => $this->request->getGet('gugun'), // 시군구
'dong' => $this->request->getGet('dong'), // 읍면동
'srchType' => $this->request->getGet('srchType'), // 검색유형
'srchTxt' => $this->request->getGet('srchTxt'), // 검색어
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 상세화면
public function detail($id): string
{
$id = (string) $id;
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
$codes = $this->codeModel->getCodeLists(['TRADE_TYPE', 'RECEIPT_STATUS2', 'RECEIPT_STATUS3', 'SMS_MSG_TYPE']); // 코드조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$data = $this->model->getDetail($id);
$history = $this->model->getHistory($id);
$aptGround = $this->model->getAptGround($data['rcpt_dong']);
// 시간대별통계
$tmCount = $this->model->getUsrRsrvDateTmCount($id);
$this->data['codes'] = $codes;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['data'] = $data;
$this->data['history'] = $history;
$this->data['tmCount'] = $tmCount;
return view("pages/article/record/detail", $this->data);
}
}

View File

@@ -8,7 +8,7 @@ use CodeIgniter\Controller;
abstract class BaseController extends Controller
{
protected $helpers = ['array', 'function'];
protected $helpers = ['array', 'function', 'cookie'];
protected $session;
protected $data = [];

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Controllers\Interest;
use App\Controllers\BaseController;
use App\Models\common\CodeModel;
use App\Models\interest\RatesModel;
class Rates extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new RatesModel();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['BANK', 'INSURANCE', 'LOAN_PLACE']); // 코드조회
$placeArr = [];
foreach ($codes as $c) {
if ($c['category'] == "LOAN_PLACE") {
array_push($placeArr, $c);
}
}
$data = $this->model->getLists();
$this->data['place'] = $placeArr;
$this->data['data'] = $data;
return view("pages/interest/list", $this->data);
}
}

View File

@@ -9,6 +9,8 @@ use App\Models\listfax\ListFaxModel;
class ListFax extends BaseController
{
private $listfaxModel;
private $todo = ''; // 검색, 엑셀다운 구분
private $menuid = ''; // 레프트메뉴아이디
@@ -38,6 +40,10 @@ class ListFax extends BaseController
private $pars = [];
public function __construct()
{
$this->listfaxModel = new ListFaxModel();
}
public function index()
{
@@ -133,8 +139,7 @@ class ListFax extends BaseController
// CI3: $base_uri = '/listfax/listfax/lists';
$base_uri = '/listfax/listfax/lists';
// CI3: $this->load->model('v2/listfax_model', 'listfax_model');
$listfaxModel = new ListFaxModel();
// CI3: $this->load->model('v2/listfax_model', 'listfax_model');
// CI3: $this->load->helper('array_helper');
helper(filenames: 'array'); // array_helper => array 로 이름 바꿨다면 이렇게
@@ -149,7 +154,7 @@ class ListFax extends BaseController
'total' => 0,
];
} else {
$resultData = $listfaxModel->getLists(
$resultData = $this->listfaxModel->getLists(
$this->todo,
$this->page,
$this->pagesize,
@@ -185,4 +190,26 @@ class ListFax extends BaseController
return view('listfax/listfax/lists', $data);
}
public function getLists()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'caller_no' => $this->request->getGet('caller_no'),
];
$totalCount = $this->listfaxModel->getTotalCount($data);
$datas = $this->listfaxModel->getResultList($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
}

View File

@@ -15,7 +15,14 @@ class Login extends BaseController
public function index(): string
{
return view('pages/login');
$user_id = get_cookie('save_id');
if (!empty($user_id)) {
$this->data['user_id'] = $user_id;
} else {
delete_cookie('save_id');
}
return view('pages/login', $this->data);
}
// 로그인
@@ -63,6 +70,7 @@ class Login extends BaseController
* ------------------------------------*/
$userId = $this->request->getPost('user_id');
$userPw = $this->request->getPost('user_pw');
$saveId = $this->request->getPost('saveId');
$this->loginModel = new LoginModel();
$user = $this->loginModel->getUserByIdPw($userId, $userPw);
@@ -111,6 +119,14 @@ class Login extends BaseController
'logged_in' => true
];
// 아이디 저장
if (!empty($saveId)) {
if ($saveId === "Y") {
$period = 60 * 60 * 24 * 90;
set_cookie('save_id', $userId, $period);
}
}
$logs['results'] = 1;
$logs['usr_sq'] = $user['usr_sq'];
$logs['reason'] = '로그인 성공';
@@ -143,7 +159,9 @@ class Login extends BaseController
public function out()
{
$this->session->destroy();
return redirect()->to('/login');
return redirect()
->to('/login')
->deleteCookie('save_id');
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,7 @@
namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M703Model;
@@ -125,9 +126,10 @@ class M703 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$naver = new NaverApiClient();
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -161,11 +163,11 @@ class M703 extends BaseController
$apt_rlet_type_cd = ['A01', 'A02', 'A03', 'A04', 'B01', 'B02', 'B03'];
$villa_rlet_type_cd = ['A05', 'A06'];
if (in_array($article['rlet_type_cd'], $apt_rlet_type_cd)) { // apt 단지
// $detail_hscp = $this->call_kiso_api->aptDetail($article['hscp_no']);
$detail_hscp = $naver->aptDetail($article['hscp_no']);
}
if (in_array($article['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
// $detail_hscp = $this->call_kiso_api->villaDetail($article['hscp_no']);
$detail_hscp = $naver->villaDetail($article['hscp_no']);
}
$this->data['hscp_info'] = $hscp_info;
@@ -400,6 +402,8 @@ class M703 extends BaseController
// 결과저장
public function saveResult()
{
$naver = new NaverApiClient();
try {
$fax_sq = $this->request->getPost('fax_sq');
@@ -461,8 +465,7 @@ class M703 extends BaseController
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
// $this->load->library('call_kiso_api');
// $send_result = $this->call_kiso_api->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
$send_result = $naver->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
}
if ($send_result['result'] == 'success') {

View File

@@ -3,8 +3,12 @@ namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\MyUpload;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M704Model;
use App\Models\v2\M710Model;
use Exception;
class M704 extends BaseController
{
@@ -121,9 +125,11 @@ class M704 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$naver = new NaverApiClient();
if ($id <= 0) {
$id = (string) $id;
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -137,6 +143,33 @@ class M704 extends BaseController
$phone_list = $this->model->getPhoneNumber(); // 주택임대사업자번호 리스트
$tel = $this->model->getRecordInfo($id, '3'); //녹취파일
$complexList = [];
$ptpList = [];
// 아파트단지목록
$complexList = $naver->complexList($data['address_code']);
// 평형목록
$ptpList = $naver->ptpList($data['hscp_no']);
$hscp_info = [];
if (!empty($data['hscp_no'])) {
$apt_rlet_type_cd = ['A01', 'A02', 'A03', 'A04', 'B01', 'B02', 'B03'];
$villa_rlet_type_cd = ['A05', 'A06'];
if (in_array($data['rlet_type_cd'], $apt_rlet_type_cd)) { // apt 단지
$detail_hscp = $naver->aptDetail($data['hscp_no']);
}
if (in_array($data['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
$detail_hscp = $naver->villaDetail($data['hscp_no']);
}
$hscp_info = $detail_hscp['result'];
}
$this->data['codes'] = $codes;
$this->data['data'] = $data;
@@ -145,10 +178,99 @@ class M704 extends BaseController
$this->data['regist2'] = $regist2;
$this->data['phone_list'] = $phone_list;
$this->data['tel'] = $tel;
$this->data['complexList'] = $complexList;
$this->data['ptpList'] = $ptpList;
$this->data['detail_hscp'] = $hscp_info;
return view("pages/v2/m704/detail", $this->data);
}
// 상세정보 수정
public function modifyInfo()
{
$naver = new NaverApiClient();
try {
$atcl_vr_sq = $this->request->post('rcpt_key', TRUE); //순번
$atcl_hscp_nm = $this->request->getPost('atcl_hscp_nm'); //단지명
$atcl_ptp_nm = $this->request->getPost('atcl_ptp_nm'); //평형명
$atcl_vrfc_type = $this->request->getPost('atcl_vrtc_way'); //검증구분
$trade_type = $this->request->getPost('trade_type_cd'); //거래구분
$atcl_addr1 = $this->request->getPost('atcl_addr1'); //상세주소1 폐기예정
$atcl_addr1a = $this->request->getPost('atcl_addr1a'); // 리 주소
$atcl_addr1b = $this->request->getPost('atcl_addr1b'); // 공동 : 동 주소, 비공동 : 지번주소
$atcl_addr2 = $this->request->getPost('atcl_addr2'); //상세주소2
$atcl_hscp_no = $this->request->getPost('atcl_hscp_no'); //단지번호
$atcl_ptp_no = $this->request->getPost('atcl_ptp_no'); //단지명
$atcl_amt1 = $this->request->getPost('atcl_amt1');
$atcl_amt2 = $this->request->getPost('atcl_amt2');
$atcl_amt3 = $this->request->getPost('atcl_amt3');
$atcl_amt4 = $this->request->getPost('atcl_amt4'); // 분양권매매 가격 2
$isale_amt = $this->request->getPost('isale_amt'); // 분양가
$prem_amt = $this->request->getPost('prem_amt'); // 프리미엄가
$atcl_floor = $this->request->getPost('atcl_floor'); // 층
$atcl_floor2 = $this->request->getPost('atcl_floor2'); // 총층
$result = $this->model->saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2, $atcl_amt4, $isale_amt, $prem_amt);
$resVrfc = $this->model->saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type);
if ($result['error_number'] != 0) {
throw new \Exception($result['error_message']);
} else {
//API 호출
$resultData = $this->model->getDetail($atcl_vr_sq);
$modifyInfo = $naver->modifyInfo(
$resultData['data']['atcl_no'],
$resultData['data']['hscp_no'],
$resultData['data']['ptp_no'],
$resultData['data']['bild_nm'],
$resultData['data']['rm_no'],
$resultData['data']['trade_type_cd'],
$resultData['data']['deal_amt'],
$resultData['data']['wrrnt_amt'],
$resultData['data']['lease_amt'],
$resultData['data']['isale_amt'],
$resultData['data']['prem_amt'],
$resultData['data']['floor'],
$resultData['data']['floor2'],
$resultData['data']['charger'],
$resultData['data']['address_code'],
$resultData['data']['address2'],
$resultData['data']['address2a'],
$resultData['data']['address2b'],
$resultData['data']['address3'],
$resultData['data']['sply_spc'],
$resultData['data']['excls_spc'],
$resultData['data']['tot_spc'],
$resultData['data']['grnd_spc'],
$resultData['data']['bldg_spc']
);
if ($modifyInfo['result'] != 'success') { //결과값 확인
$return = $modifyInfo['error'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $modifyInfo['error']['code'], $modifyInfo['error']['message'], $err_time, $resultData['data']['atcl_no']);
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 파일업로드
public function uploadFile()
{
@@ -248,6 +370,470 @@ class M704 extends BaseController
}
}
// 전화실패
public function contactFail()
{
try {
$vr_sq = $this->request->getPost('vr_sq');
// UPDATE v2_vrfc_req
$this->model->saveContactFail($vr_sq);
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 전화확인정보 저장
public function saveTel()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 전화(서류)확인중 상태로 변경. (수정변경이력 저장)
1.5.1 녹취파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 개인정보 제공동의, 매물주소, 가격거래구분, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 전화(서류)확인완료 상태. (수정변경이력 저장)
*/
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s');
$atcl_vrtc_way = $this->request->getPost('atcl_vrtc_way');
$atcl_vr_sq = $this->request->getPost('rcpt_key');
$tel_agree = $this->request->getPost('tel_agree');
// 개인정보 제공 동의가 승인일 경우 필수 필드 검증
if ($tel_agree == '10000') {
$validation = \Config\Services::validation();
$validation->setRules([
'tel_conf_yn_2' => [
'label' => '매물주소',
'rules' => 'required',
'errors' => ['required' => '{field} 정보확인 결과를 선택해주세요.']
],
'tel_conf_yn_3' => [
'label' => '가격 거래구분',
'rules' => 'required',
'errors' => ['required' => '{field} 정보확인 결과를 선택해주세요.']
],
'tel_conf_yn_4' => [
'label' => '의뢰인정보',
'rules' => 'required',
'errors' => ['required' => '{field} 정보확인 결과를 선택해주세요.']
],
]);
if (!$validation->withRequest($this->request)->run()) {
$errors = $validation->getErrors();
throw new \Exception(implode(', ', $errors));
}
}
// POST 데이터 받기
$tel_suc = $this->request->getPost('tel_suc');
$tel_conf_yn_2 = $this->request->getPost('tel_conf_yn_2');
$tel_conf_yn_3 = $this->request->getPost('tel_conf_yn_3');
$tel_conf_yn_4 = $this->request->getPost('tel_conf_yn_4');
$tel_conf_yn_5 = $this->request->getPost('tel_conf_yn_5');
$tel_conf_yn_info_2 = $this->request->getPost('tel_conf_yn_info_2');
$tel_conf_yn_info_3 = $this->request->getPost('tel_conf_yn_info_3');
$tel_conf_yn_info_4 = $this->request->getPost('tel_conf_yn_info_4');
$address_code = $this->request->getPost('address_code');
$reg_chk_val = $this->request->getPost('reg_chk_val');
$tel_file_yn = $this->request->getPost('tel_file_yn');
$memo = $this->request->getPost('memo_tel');
$tel_fail_cause = $this->request->getPost('tel_fail_cause');
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $v2DailyModel->get_v2_vrfc_req($atcl_vr_sq);
$reg_try_cnt = $this->model->getRegTry($atcl_vr_sq);
$rlet_type_cd = $model415->get_rlet_type_cd($atcl_vr_sq);
$try_cnt = '0';
if ($resStat['stat_cd'] >= '40' || $resStat['stat_cd'] == '19') {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$this->model->InsCharger($atcl_vr_sq); //담당자가 없을 경우 강제로 session 정보로 넣어준다
$resultCnt = $this->model->chkTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
$chkHistoryStat = $this->model->chkHistoryStat($atcl_vr_sq); // history에 등기부등본 확인중인적이 있는지 확인
if ($resultCnt['try_cnt'] == 0) { //1차 검증일 때
$try_cnt = '1';
} else if ($resultCnt['try_cnt'] == 1) { //2차 검증일 때
$try_cnt = '2';
} else if ($resultCnt['try_cnt'] == 2) { //2차 검증이상 일 때
$try_cnt = '2';
} else {
$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, '');
if ($result == 0) {
if ($tel_conf_yn_2 == '10000' && $tel_conf_yn_3 == '10000' && $tel_conf_yn_4 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->m704_model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 10, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($tel_conf_yn_2 == '10000' && $tel_conf_yn_3 == '10000' && $tel_conf_yn_4 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 10, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
//v2_vrfc_req INSERT//상태변경 TABLE INSERT : 전화(서류)확인중 상태로 변경
$this->model->chgStat($atcl_vr_sq, '30', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '30');
// 불일치건이면서 등기부등본 불일치 1회 이상일 경우 초기상태를 등기부등본 상태로 변경
if ($chk_type == '0' && $reg_try_cnt['reg_try_cnt'] == '1') {
$this->model->chgStat($atcl_vr_sq, '40', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '40');
}
if ($chk_type == '0' && ($reg_try_cnt['reg_try_cnt'] == '1' || $reg_try_cnt['reg_try_cnt'] == '2')) { // $reg_try_cnt['reg_try_cnt'] 는 등기부등본 실패횟수
log_message('debug', 'm704 insertChkList : ' . $atcl_vr_sq);
//v2_check_list 매물정보확인 INSERT : 전화매물확인 페이지에서 통신하는 등기부등본 확인 API이므로 값을 강제로 넣어줌.
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '21', '20000', '불일치');
//v2_check_list 의뢰인정보 INSERT : 전화매물확인 페이지에서 통신하는 등기부등본 확인 API이므로 값을 강제로 넣어줌.
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '22', '20000', '불일치');
} else {
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T11', $tel_agree, '');
if ($tel_agree == '10000') {
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T12', $tel_conf_yn_2, $tel_conf_yn_info_2);
//v2_check_list 가격거래구분 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T13', $tel_conf_yn_3, $tel_conf_yn_info_3);
//v2_check_list 의뢰인정보 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T14', $tel_conf_yn_4, $tel_conf_yn_info_4);
} else {
$this->model->deleteChkList($atcl_vr_sq, $atcl_vrtc_way, 'T12');
$this->model->deleteChkList($atcl_vr_sq, $atcl_vrtc_way, 'T13');
$this->model->deleteChkList($atcl_vr_sq, $atcl_vrtc_way, 'T14');
}
if (!empty($tel_conf_yn_5)) {
// $this->m704_model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T15', $tel_conf_yn_5, $tel_conf_yn_5);
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'T15', $tel_conf_yn_5, '');
$this->model->deleteChkList($atcl_vr_sq, $atcl_vrtc_way, 'T11');
} else {
$this->model->deleteChkList($atcl_vr_sq, $atcl_vrtc_way, 'T15');
}
}
//memo 저장
if (!empty($memo)) {
$this->model->saveMemo([$memo, $atcl_vr_sq]);
}
//전화실패 사유 저장
if (!empty($tel_fail_cause)) {
$this->model->up_tel_fail_cause($atcl_vr_sq, $tel_fail_cause);
}
//확인정보 수정 로그 찍기
log_message('debug', 'checking >> 검증횟수(등기부등본) : ' . $reg_try_cnt['reg_try_cnt'] . '/' . ' >> chk_type : ' . $chk_type . ' 매물번호 : ' . $atcl_vr_sq);
// 전화서류가 불일치이고 등기부등본 실패횟수가 1회일 때 바로 등기부등본 불일치 >> 검증실패 처리
// [s] 2015.09.08 등기부등본 검증 API 추가
if ($chk_type == '0' && ($reg_try_cnt['reg_try_cnt'] == '1' || $reg_try_cnt['reg_try_cnt'] == '2')) {
log_message('debug', '704 page (등기부등본 불일치) >> before call api / 매물번호 : ' . $atcl_vr_sq);
//☆
$sendData = $this->model->getDatacertAPI($atcl_vr_sq, 'R');
$t_yn = $model710->get_send_yn('T');
if ($t_yn['stop_yn'] == 'N') { //전송금지
//1.해당매물정보를v2_stop_api_save_info에다 넣음
$model710->insert_v2_stop_api_save_info($sendData['atclNo'], $atcl_vr_sq, 'T2', '');
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
//API 호출
$send_result = $naver->certification($sendData['atclNo'], $try_cnt, $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['date'], $sendData['modifyInfo'], $sendData['ownerVerifiable']);
}
if ($send_result['result'] == 'success') {
log_message('debug', '704 page (등기부등본 불일치) >> success call api / 매물번호 : ' . $atcl_vr_sq);
// 전화서류를 처리한 모든건을 카운트 하는
$result_query1 = $this->model->chgStat($atcl_vr_sq, '38', $toDay);
//상태변경 TABLE INSERT : 등기부등본 불일치 상태로 변경
$this->model->chgStat($atcl_vr_sq, '49', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
$this->model->chgRegTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
//★검증실패
if ($atcl_vrtc_way == 'M' || $atcl_vrtc_way == 'O') { //모바일은 등기가 첨 시작이니까 insert해줘야함
if (!($atcl_vrtc_way == 'M' && in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03')))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_way, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_way, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0302', '1', 'add'); // 최종실패로 저장
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
} else {
$sendData = $this->model->getDataConfirmAPI($atcl_vr_sq);
$t_yn = $model710->get_send_yn('T');
if ($t_yn['stop_yn'] == 'N') { //전송금지
//1.해당매물정보를v2_stop_api_save_info에다 넣음
$model710->insert_v2_stop_api_save_info($sendData['atclNo'], $atcl_vr_sq, 'T1', '');
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
//API 호출
$send_result = $naver->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
}
if ($send_result['result'] == 'success' || $send_result['error']['code'] == 'VC013') {
// 검증단계가 상이하더라도 상태값이 변경될 수 있도록 함.
if ($tel_agree == '10000' && $chk_type == '1') {
//상태변경 TABLE INSERT : 전화(서류)확인 완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '35', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '35'); //v2_vrfc_req INSERT
// 전화서류를 처리한 모든건을 카운트
$this->model->chgStat($atcl_vr_sq, '38', $toDay);
if ($reg_chk_val == '1') {
//등기부등본 확인 대상은 전화(서류)확인 완료 후 -> 등기부등본 확인중 상태로 변경.
$result_query8 = $this->model->chgStat($atcl_vr_sq, '40', $toDay);
$chgVrfc40 = $this->model->chgStatVrfc($atcl_vr_sq, '40'); //v2_vrfc_req INSERT
//★등기 로 넘어갈때
//0.통화실패 여부를 확인한다
$cnt = $model415->getCallfailForHistory($atcl_vr_sq);
if (empty($cnt)) { //통화실패가 없어야 통계를 구한다
//1.서류전화 들어온시간
$insert_tm = $model415->getSaveTimeForHistory($atcl_vr_sq);
//2.서류/전화 확인일자
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$sf = 'T';
$model415->insert_v2_time_required_Conf($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $v2_vrfc_req['vrfc_type'], $insert_tm['insert_tm'], $tel_doc_conf_dt['insert_tm'], $sf);
}
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0201', '1', 'add'); // 일치로 저장
} else {
//등기부등본 확인 대상이 아닌 경우 전화(서류)확인 완료 후 -> 검증 완료 상태로 변경.
$result_query8 = $this->model->chgStat($atcl_vr_sq, '60', $toDay);
$chgVrfc40 = $this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
//★검증완료일때
//0.통화실패 여부를 확인한다
$cnt = $model415->getCallfailForHistory($atcl_vr_sq);
if (empty($cnt)) { //통화실패가 없어야 통계를 구한다
//1.서류전화 들어온시간
$insert_tm = $model415->getSaveTimeForHistory($atcl_vr_sq);
//2.서류/전화 확인일자
$tel_doc_conf_dt = $model415->getConfTimeForHistory($atcl_vr_sq);
//3.검증완료시간
$finishTime = $model415->get_60_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $v2_vrfc_req['vrfc_type'], $insert_tm['insert_tm'], $tel_doc_conf_dt['insert_tm'], $finishTime['insert_tm']);
}
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0206', '1', 'add'); // 전화확인완료 등기부등본확인 안함 저장
}
} else {
if ($try_cnt == '1') {
// 전화서류를 처리한 모든건을 카운트
$result_query19 = $this->model->chgStat($atcl_vr_sq, '38', $toDay);
//상태변경 TABLE INSERT : 전화(서류)확인 불일치 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '39', $toDay);
$chgVrfc35 = $this->model->chgStatVrfc($atcl_vr_sq, '39'); //v2_vrfc_req INSERT
//★불일치
//0.통화실패 여부를 확인한다
$cnt = $model415->getCallfailForHistory($atcl_vr_sq);
if (empty($cnt)) { //통화실패가 없어야 통계를 구한다
//1.서류전화 들어온시간
$insert_tm = $model415->getSaveTimeForHistory($atcl_vr_sq);
//2.서류/전화 불일치 시간
$tel_doc_conf_dt = $model415->getFaxFailTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$sf = 'F';
$model415->insert_v2_time_required_Conf($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $v2_vrfc_req['vrfc_type'], $insert_tm['insert_tm'], $tel_doc_conf_dt['insert_tm'], $sf);
}
//v2_vrfc_req try_cnt 값을 1로 update
$res_try = $this->model->chgTryCnt($atcl_vr_sq, '1');
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0301', '1', 'add'); // 1차실패로 저장
} else if ($try_cnt == '2') { //상태변경 TABLE INSERT : 전화(서류)확인 불일치 상태로 변경
// 전화서류를 처리한 모든건을 카운트
$this->model->chgStat($atcl_vr_sq, '38', $toDay);
$this->model->chgStat($atcl_vr_sq, '39', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '39'); //v2_vrfc_req INSERT
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
//★ 검증실패
//0.통화실패 여부를 확인한다
$cnt = $this->model->getCallfailForHistory($atcl_vr_sq);
if (empty($cnt)) { //통화실패가 없어야 통계를 구한다
//1.서류전화 들어온시간
$insert_tm = $model415->getSaveTimeForHistory($atcl_vr_sq);
//2.서류/전화 불일치 시간
$tel_doc_conf_dt = $model415->getFaxFailTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $v2_vrfc_req['vrfc_type'], $insert_tm['insert_tm'], $tel_doc_conf_dt['insert_tm'], $finishTime['insert_tm']);
}
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0302', '1', 'add'); // 최종실패로 저장
}
if (in_array($tel_agree, array('20001', '20002'))) {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0203', '1', 'add'); // 거부로 저장
} elseif (in_array($tel_agree, array('20003', '20004', '20005'))) {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0204', '1', 'add'); // 무응답 외
} else {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'T0202', '1', 'add'); // 불일치
}
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 다음 매물정보 조회
public function getNextTelInfo()

View File

@@ -4,8 +4,11 @@ namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\Common;
use App\Libraries\MyUpload;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M705Model;
use App\Models\v2\M710Model;
class M705 extends BaseController
{
@@ -150,9 +153,10 @@ class M705 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$naver = new NaverApiClient();
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -165,6 +169,24 @@ class M705 extends BaseController
$display = $this->model->getDisplay('M705_detail');
$reference = $this->model->getAllRecordInfo($id, '7'); //참고용파일 (2017.09.26 추가)
$hscp_info = [];
if (!empty($data['hscp_no'])) {
$apt_rlet_type_cd = ['A01', 'A02', 'A03', 'A04', 'B01', 'B02', 'B03'];
$villa_rlet_type_cd = ['A05', 'A06'];
if (in_array($data['rlet_type_cd'], $apt_rlet_type_cd)) { // apt 단지
$detail_hscp = $naver->aptDetail($data['hscp_no']);
}
if (in_array($data['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
$detail_hscp = $naver->villaDetail($data['hscp_no']);
}
$hscp_info = $detail_hscp['result'];
}
$this->data['codes'] = $codes;
$this->data['data'] = $data;
$this->data['record'] = $record;
@@ -172,6 +194,7 @@ class M705 extends BaseController
$this->data['memo'] = $memo;
$this->data['display'] = $display;
$this->data['reference'] = $reference;
$this->data['detail_hscp'] = $hscp_info;
return view("pages/v2/m705/detail", $this->data);
}
@@ -258,49 +281,51 @@ class M705 extends BaseController
$usr_id = session('usr_id');
$vr_sq = $this->request->getPost('vr_sq');
$file = $this->request->getFile('file');
if ($file && $file->isValid() && !$file->hasMoved()) {
$uploadPath = "/upload/v2_file/" . $vr_sq . "/";
$files = $this->request->getFiles();
$arrUploadfile = [];
if ($file->isValid() && !$file->hasMoved()) {
$uploadData = $lib->do_upload2($file, $uploadPath);
$uploadPath = "/upload/v2_file/" . $vr_sq . "/";
if ($uploadData !== false) {
$arrUploadfile[] = $uploadData;
}
}
if (!empty($arrUploadfile)) {
foreach ($arrUploadfile as $key => $uploadFile) {
$data = [
'vr_sq' => $vr_sq,
// 'file_sq' => $this->request->getPost('file_sq'),
'orig_name' => $uploadFile['origin_name'],
'new_name' => $uploadFile['file_name'],
'file_path' => $uploadPath, // 필요에 따라 상대경로로만 저장
'ext' => '.' . $uploadFile['ext'],
'size' => $file->getSize(),
'img_yn' => null,
'img_height' => null,
'img_width' => null,
'usr_id' => $usr_id,
];
}
if (!empty($data)) {
// 파일업로드 정보 저장
$this->model->saveFileInfo($data);
}
}
$file = $files['files'];
$arrUploadfile = [];
$uploadData = $lib->do_upload2($file, $uploadPath);
if ($uploadData !== false) {
$arrUploadfile[] = $uploadData;
}
if (!empty($arrUploadfile)) {
foreach ($arrUploadfile as $key => $uploadFile) {
$data = [
'vr_sq' => $vr_sq,
// 'file_sq' => $this->request->getPost('file_sq'),
'orig_name' => $uploadFile['origin_name'],
'new_name' => $uploadFile['file_name'],
'file_path' => $uploadPath, // 필요에 따라 상대경로로만 저장
'ext' => '.' . $uploadFile['ext'],
'size' => $file->getSize(),
'img_yn' => null,
'img_height' => null,
'img_width' => null,
'usr_id' => $usr_id,
];
// print_r($data);
// exit;
// if (!empty($data)) {
// 파일업로드 정보 저장
$this->model->saveFileInfo($data);
// }
}
}
return $this->response->setJSON([
'code' => '0',
@@ -317,6 +342,384 @@ class M705 extends BaseController
}
// 매물정보 저장
public function saveRegi()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 등기부등본 확인중 상태로 변경. (수정변경이력 저장)
1.5.1 이미지파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 매물주소, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 등기부등본 확인완료 상태. (수정변경이력 저장)
*/
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s');
$atcl_vrtc_way = 'R'; //검증구분
$atcl_vr_sq = $this->request->getPost('rcpt_key');
// $atcl_no = $this->request->getPost('atcl_no');
$reg_conf_yn_1 = $this->request->getPost('reg_conf_yn_1'); //확인내용
$reg_conf_yn_2 = $this->request->getPost('reg_conf_yn_2'); //매물주소
$reg_conf_yn_3 = $this->request->getPost('reg_conf_yn_3'); //의뢰인정보
$reg_conf_yn_info_2 = $this->request->getPost('reg_conf_yn_info_2'); //매물주소
$reg_conf_yn_info_3 = $this->request->getPost('reg_conf_yn_info_3'); //의뢰인정보
$memo = $this->request->getPost('memo'); //메모
$owner_verifiable = $this->request->getPost('owner_verifiable'); //실소유주 확인여부
$noimg_chk_chk = $this->request->getPost('noimg_chk_chk'); // 등기부등본이미지 파일없음.
$img_chk_chk = $this->request->getPost('img_chk_chk'); // 등기소, 리얼탑 열람, 리얼탑 기열람, 열람
$atcl_vrtc_type = $this->request->getPost('atcl_vrtc_type'); // 검증구분
$vrfc_type_sub = $this->request->getPost('vrfc_type_sub'); // 하위검증구분
$arr_uncnfrm_status = $this->request->getPost('arr_uncnfrm_status'); // 등기부등본 미확인여부 상세
$try_cnt = '0';
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $v2DailyModel->get_v2_vrfc_req($atcl_vr_sq);
$rlet_type_cd = $model415->get_rlet_type_cd($atcl_vr_sq);
if ($resStat['stat_cd'] >= '60' || $resStat['stat_cd'] == '19') {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$resultCnt = $this->model->chkRegiTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
if ($resultCnt['reg_try_cnt'] == 0) { // 1차 검증일 때
log_message('debug', '705 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 0 ');
$try_cnt = '1';
} else if ($resultCnt['reg_try_cnt'] == 1) { // 2차 검증일 때
log_message('debug', '705 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 1 ');
$try_cnt = '2';
} else {
log_message('debug', '705 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 예외처리 ');
$try_cnt = '2';
//$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, $atcl_vrtc_way);
if ($result == 0) { //v2_confirm 존재하지 않는다면
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
// 수정한 시간이 현재시간10분전 보다 클 경우 수정불가능
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
$this->model->InsResChar($atcl_vr_sq); //담당자 업데이트
// 모바일v1,v2고 등기부등본 미확인여부 상세 저장
if ($vrfc_type_sub == 'M1' || $vrfc_type_sub == 'O1') {
$this->model->add_cert_uncnfrm_status($atcl_vr_sq, $arr_uncnfrm_status);
if (strpos($arr_uncnfrm_status, '20020') !== false) { //등기부등본 미확인여부 상세에 20020(파일 오첨부)있고
if ($vrfc_type_sub == 'M1') { // 모바일v1일땐 코드 20020,코멘트x
$reg_conf_yn_2 = '20020';
$reg_conf_yn_info_2 = '';
} else { // 모바일v2일땐 일반 불일치코드,코멘트=파일 오첨부
$reg_conf_yn_info_2 = '파일 오첨부';
}
}
}
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '21', $reg_conf_yn_2, $reg_conf_yn_info_2);
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '22', $reg_conf_yn_3, $reg_conf_yn_info_3);
//memo 저장
$this->model->saveMemo([$memo, $atcl_vr_sq]);
//실소유주 확인 저장
$this->model->update_owner_verifiable($atcl_vr_sq, $owner_verifiable);
$sendData = $this->model->getDatacertAPI($atcl_vr_sq, 'R');
//이미지 파일 없음 && 홍보확인서 V2일 경우
log_message('debug', '705 noimage_chk_chk sendData_return1 => ' . $sendData['atclNo'] . ' ::: ' . json_encode($sendData) . PHP_EOL);
if ($noimg_chk_chk == "Y" && $sendData['vrfcType'] == "D2") {
// $sendData['ownerVerifiable'] = false;
}
$d_yn = $this->m710_model->get_send_yn('D');
if ($d_yn['stop_yn'] == 'N') { //전송금지
//1.해당매물정보를v2_stop_api_save_info에다 넣음
$model710->insert_v2_stop_api_save_info($sendData['atclNo'], $atcl_vr_sq, 'D', '');
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
//API 호출
$send_result = $naver->certification($sendData['atclNo'], $try_cnt, $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['date'], $sendData['modifyInfo'], $sendData['ownerVerifiable']);
}
if ($send_result['result'] == 'success') {
if ($chk_type == '1') {
//상태변경 TABLE INSERT : 등기부등본 확인완료 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '45', $toDay);
$chgVrfc45 = $this->model->chgStatVrfc($atcl_vr_sq, '45'); //v2_vrfc_req INSERT
$statFaxUp45 = $this->model->chgStatFax($atcl_vr_sq, '45'); //fax_imgs
//상태변경 TABLE INSERT : 검증완료 상태로 변경
$result_query8 = $this->model->chgStat($atcl_vr_sq, '60', $toDay);
$chgVrfc60 = $this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
$statFaxUp60 = $this->model->chgStatFax($atcl_vr_sq, '60'); //fax_imgs
// ★ 검증완료
//0.불일치 이력이 있는지 확인
$cnt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
if (empty($cnt)) { //검증완료일땐 불일치가없어야 통계포함된다
if ($atcl_vrtc_type == 'M' || $atcl_vrtc_type == 'O') { //모바일은 등기가 첨 시작이니까 insert해줘야함
if (!($atcl_vrtc_type == 'M' && in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03')))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.검증완료시간
$finishTime = $model415->get_60_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '76', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '80', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0111', '1', 'add'); // 등기소로 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '86', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0107', '1', 'add'); // 리얼탑 열람 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '87', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0108', '1', 'add'); // 리얼탑 기열람 일치으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
}
} else {
if ($atcl_vrtc_type == 'M') {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//v2_vrfc_req try_cnt 값을 1로 update
$res_try = $this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$result_query9 = $this->model->chgStat($atcl_vr_sq, '69', $toDay);
$chgVrfc69 = $this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$statFaxUp69 = $this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일이고 검증실패
if (!in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03'))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//등기부등본 확인중 상태로 변경.
$result_query30 = $this->model->saveChangedHistory($atcl_vr_sq, '30', 'C9', $usr_id, '상태변경 : 49 => 30'); //검증결과 변동사항 HISTORY
$chgVrfc40 = $this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
$statFaxUp40 = $this->model->chgStatFax($atcl_vr_sq, '30'); //fax_imgs
if ($try_cnt == '1') {
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '1');
if ($atcl_vrtc_type == 'T') {
//검증구분이 전화매물일 경우 사전에 일치로 처리된 값을 초기화 시켜준다.
$this->model->resetTelConf($atcl_vr_sq);
}
// ★1차실패
if ($atcl_vrtc_type == 'O') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$sf = 'F';
$model415->update_v2_time_required_Conf($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $sf);
}
} else if ($try_cnt == '2') {
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일 이외 검증실패
if ($atcl_vrtc_type == 'O') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '77', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '85', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0112', '1', 'add'); // 등기소 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '88', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0109', '1', 'add'); // 리얼탑 열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '89', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0110', '1', 'add'); // 리얼탑 기열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
}
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 다음매물 확인
public function getNextInfo()
{

View File

@@ -2,8 +2,12 @@
namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M706Model;
use App\Models\v2\M710Model;
use Exception;
class M706 extends BaseController
{
@@ -110,9 +114,10 @@ class M706 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$naver = new NaverApiClient();
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -124,6 +129,15 @@ class M706 extends BaseController
$memo = $this->model->getMemo($id);
$history = $this->model->getHistory($id);
$complexList = [];
$ptpList = [];
// 아파트단지목록
$complexList = $naver->complexList($data['address_code']);
// 평형목록
$ptpList = $naver->ptpList($data['hscp_no']);
$this->data['codes'] = $codes;
$this->data['regist'] = $regist;
$this->data['record'] = $record;
@@ -132,8 +146,477 @@ class M706 extends BaseController
$this->data['memo'] = $memo;
$this->data['history'] = $history;
$this->data['complexList'] = $complexList;
$this->data['ptpList'] = $ptpList;
return view("pages/v2/m706/detail", $this->data);
}
// 매물정보 수정
public function modifyInfo()
{
$naver = new NaverApiClient();
try {
$atcl_vr_sq = $this->request->getPost('rcpt_key'); //순번
$atcl_hscp_nm = $this->request->getPost('atcl_hscp_nm'); //단지명
$atcl_ptp_nm = $this->request->getPost('atcl_ptp_nm'); //평형명
$atcl_vrfc_type = $this->request->getPost('atcl_vrtc_way'); //검증구분
$trade_type = $this->request->getPost('trade_type_cd'); //거래구분
$atcl_addr1 = $this->request->getPost('atcl_addr1'); //상세주소1 폐기예정
$atcl_addr1a = $this->request->getPost('atcl_addr1a'); // 리 주소
$atcl_addr1b = $this->request->getPost('atcl_addr1b'); // 공동 : 동 주소, 비공동 : 지번주소
$atcl_addr2 = $this->request->getPost('atcl_addr2'); //상세주소2
$atcl_hscp_no = $this->request->getPost('atcl_hscp_no'); //단지번호
$atcl_ptp_no = $this->request->getPost('atcl_ptp_no'); //단지명
$atcl_amt1 = $this->request->getPost('atcl_amt1');
$atcl_amt2 = $this->request->getPost('atcl_amt2');
$atcl_amt3 = $this->request->getPost('atcl_amt3');
$atcl_floor = $this->request->getPost('atcl_floor');
$atcl_floor2 = $this->request->getPost('atcl_floor2'); // 총층
$return = '';
if ($trade_type == 'A1') {
$return = limitHscpMarketPriceInfo($this, $trade_type, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1);
} elseif ($trade_type == 'B1') {
$return = limitHscpMarketPriceInfo($this, $trade_type, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt2);
}
if (empty($return)) {
$result = $this->model->saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2);
$this->model->saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type);
if ($result['error_number'] != 0) {
throw new \Exception($result['error_message']);
} else {
//API 호출
$resultData = $this->model->getDetail($atcl_vr_sq);
$modifyInfo = $naver->modifyInfo(
$resultData['data']['atcl_no'],
$resultData['data']['hscp_no'],
$resultData['data']['ptp_no'],
$resultData['data']['bild_nm'],
$resultData['data']['rm_no'],
$resultData['data']['trade_type_cd'],
$resultData['data']['deal_amt'],
$resultData['data']['wrrnt_amt'],
$resultData['data']['lease_amt'],
$resultData['data']['isale_amt'],
$resultData['data']['prem_amt'],
$resultData['data']['floor'],
$resultData['data']['floor2'],
$resultData['data']['charger'],
$resultData['data']['address_code'],
$resultData['data']['address2'],
$resultData['data']['address2a'],
$resultData['data']['address2b'],
$resultData['data']['address3'],
$resultData['data']['sply_spc'],
$resultData['data']['excls_spc'],
$resultData['data']['tot_spc'],
$resultData['data']['grnd_spc'],
$resultData['data']['bldg_spc']
);
if ($modifyInfo['result'] != 'success') { //결과값 확인
$return = $modifyInfo['error'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $modifyInfo['error']['code'], $modifyInfo['error']['message'], $err_time, $resultData['data']['atcl_no']);
}
}
return $this->response->setJSON(body: [
'code' => '0',
'msg' => '정상적으로 저장되었습니다.',
]);
}
} catch (\Exception $e) {
return $this->response->setJSON(body: [
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 서류확인정보 저장
public function saveDocu()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 전화(서류)확인중 상태로 변경. (수정변경이력 저장)
1.5.1 이미지파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 확인여부 + 홍보확인서 미확인여부 상세, 매물주소, 가격거래구분, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 전화(서류)확인완료 상태. (수정변경이력 저장)
*/
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s'); //오늘날짜
$atcl_vrtc_way = $this->request->getPost('atcl_vrtc_way');
$atcl_vr_sq = $this->request->getPost('rcpt_key');
$arr = $this->request->getPost('chTotal');
$fax_conf_res_d11 = $this->request->getPost('fax_conf_res_d11');
$fax_conf_yn_1 = $this->request->getPost('fax_conf_yn_1');
$fax_conf_yn_2 = $this->request->getPost('fax_conf_yn_2');
$fax_conf_yn_3 = $this->request->getPost('fax_conf_yn_3');
$fax_conf_yn_4 = $this->request->getPost('fax_conf_yn_4');
$fax_conf_yn_info_2 = $this->request->getPost('fax_conf_yn_info_2');
$fax_conf_yn_info_3 = $this->request->getPost('fax_conf_yn_info_3');
$fax_conf_yn_info_4 = $this->request->getPost('fax_conf_yn_info_4');
$reg_chk_val = $this->request->getPost('reg_chk_val');
$memo = $this->request->getPost('memo_fax');
$try_cnt = '0';
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $v2DailyModel->get_v2_vrfc_req($atcl_vr_sq);
if ((int) $resStat['stat_cd'] >= 40 || (int) $resStat['stat_cd'] == '190') {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$this->model->InsCharger($atcl_vr_sq); //담당자가 없을 경우 강제로 session 정보로 넣어준다
$resultCnt = $this->model->chkTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
if ($resultCnt['try_cnt'] == 0) { //1차 검증일 때
$try_cnt = '1';
} else if ($resultCnt['try_cnt'] == 1) { //2차 검증일 때
$try_cnt = '2';
} else {
$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, '');
if ($result == 0) { //v2_confirm 존재하지 않는다면
if ($fax_conf_yn_2 == '10000' && $fax_conf_yn_3 == '10000' && $fax_conf_yn_4 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($fax_conf_yn_2 == '10000' && $fax_conf_yn_3 == '10000' && $fax_conf_yn_4 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
}
$resUpdate = $this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
//상태변경 TABLE INSERT : 전화(서류)확인중 상태로 변경
$result_query2 = $this->model->chgStat($atcl_vr_sq, '30', $toDay);
$chgVrfc = $this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'D11', $fax_conf_res_d11, $arr);
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'D12', $fax_conf_yn_2, $fax_conf_yn_info_2);
//v2_check_list 가격거래구분 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'D13', $fax_conf_yn_3, $fax_conf_yn_info_3);
//v2_check_list 의뢰인정보 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, 'D14', $fax_conf_yn_4, $fax_conf_yn_info_4);
//memo 저장
if (!empty($memo)) {
$this->model->saveMemo([$memo, $usr_id, $atcl_vr_sq]);
}
//API 호출
$sendData = $this->model->getDataConfirmAPI($atcl_vr_sq);
if ($fax_conf_yn_4 == '10000' || (int) $try_cnt < 2) {
$send_result = $naver->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
if ($send_result['result'] == 'success') { //HISTORY
if ($fax_conf_res_d11 == '10000' && $chk_type == '1') {
//상태변경 TABLE INSERT : 전화(서류)확인 완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '35', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '35'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '35'); //fax_imgs
if ($reg_chk_val == '1') {
//등기부등본 확인 대상은 전화(서류)확인 완료 후 -> 등기부등본 확인중 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '40', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '40'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '40'); //fax_imgs
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0201', '1', 'add'); // 일치로 저장
} else {
//등기부등본 확인 대상이 아닌 경우 전화(서류)확인 완료 후 -> 검증 완료 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '60', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '60'); //fax_imgs
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0205', '1', 'add'); // 홍보확인서완료 등기부등본확인 안함 저장
}
} else {
//상태변경 TABLE INSERT : 전화(서류)확인 불일치
$this->model->chgStat($atcl_vr_sq, '39', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '39'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '39'); //fax_imgs
if ($try_cnt == '1') {
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgTryCnt($atcl_vr_sq, '1');
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0301', '1', 'add'); // 1차실패로 저장
} else if ($try_cnt == '2') {
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0302', '1', 'add'); // 2차실패로 저장
}
if ($fax_conf_res_d11 == '20013') {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0203', '1', 'add'); // 기타로 저장
} else {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0202', '1', 'add'); // 불일치로 저장
}
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
} else {
$this->model->chgStat($atcl_vr_sq, '39', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '39'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '39'); //fax_imgs
$this->model->saveChangedHistory($atcl_vr_sq, '30', 'C9', $usr_id, '상태변경 : 39 => 30'); //검증결과 변동사항 HISTORY
$this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '30'); //fax_imgs
throw new Exception('의뢰인정보 불일치로 저장되었습니다.');
}
return $this->response->setJSON(body: [
'code' => '0',
'msg' => '정상적으로 저장되었습니다.',
]);
}
} catch (\Exception $e) {
return $this->response->setJSON(body: [
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 등기부등본 정보 저장
public function saveRegi()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 등기부등본 확인중 상태로 변경. (수정변경이력 저장)
1.5.1 이미지파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 매물주소, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 등기부등본 확인완료 상태. (수정변경이력 저장)
*/
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$mode = $this->request->getGet('mode');
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s');
$atcl_vrtc_way = 'R';
$atcl_vr_sq = $this->request->getPost('rcpt_key');
$reg_conf_yn_1 = $this->request->getPost('reg_conf_yn_1');
$reg_conf_yn_2 = $this->request->getPost('reg_conf_yn_2');
$reg_conf_yn_3 = $this->request->getPost('reg_conf_yn_3');
$reg_conf_yn_info_2 = $this->request->getPost('reg_conf_yn_info_2');
$reg_conf_yn_info_3 = $this->request->getPost('reg_conf_yn_info_3');
$memo = $this->request->getPost('memo_reg');
$try_cnt = '0';
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $this->model->get_v2_vrfc_req($atcl_vr_sq);
if ((int) $resStat['stat_cd'] >= 60 || (int) $resStat['stat_cd'] == 19) {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$this->model->InsResChar($atcl_vr_sq); //담당자가 없을 경우 강제로 session 정보로 넣어준다
$resultCnt = $this->model->chkRegiTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
if ($resultCnt['reg_try_cnt'] == 0) { //1차 검증일 때
$try_cnt = '1';
} else if ($resultCnt['reg_try_cnt'] == 1) { //2차 검증일 때
$try_cnt = '2';
} else {
$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, $atcl_vrtc_way);
if ($result == 0) {
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
}
$this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
//상태변경 TABLE INSERT : 등기부등본 확인중 상태로 변경
$this->model->chgStat($atcl_vr_sq, '40', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '40'); //v2_vrfc_req INSERT
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '21', $reg_conf_yn_2, $reg_conf_yn_info_2);
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '22', $reg_conf_yn_3, $reg_conf_yn_info_3);
//memo 저장
if (!empty($memo)) {
$this->model->saveMemo([$memo, $atcl_vr_sq]);
}
//API 호출
$sendData = $this->model->getDatacertAPI($atcl_vr_sq, 'R');
$send_result = $naver->certification($sendData['atclNo'], $try_cnt, $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['date'], $sendData['modifyInfo'], $sendData['ownerVerifiable']);
if ($send_result['result'] == 'success') {
if ($chk_type == '1') {
//상태변경 TABLE INSERT : 등기부등본 확인완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '45', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '45'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '45'); //fax_imgs
//상태변경 TABLE INSERT : 검증완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '60', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '60'); //fax_imgs
$v2_vrfc_req->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$this->model->chgStat($atcl_vr_sq, '49', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//등기부등본 확인중 상태로 변경.
$this->model->saveChangedHistory($atcl_vr_sq, '30', 'C9', $usr_id, '상태변경 : 49 => 30'); //검증결과 변동사항 HISTORY
$this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '30'); //fax_imgs
if ($try_cnt == '1') {
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '1');
} else if ($try_cnt == '2') {
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
}
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
return $this->response->setJSON(body: [
'code' => '0',
'msg' => '정상적으로 저장되었습니다.',
]);
}
} catch (\Exception $e) {
return $this->response->setJSON(body: [
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
}

View File

@@ -3,8 +3,12 @@ namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\Common;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M708Model;
use App\Models\v2\M710Model;
use Exception;
class M708 extends BaseController
{
@@ -118,9 +122,9 @@ class M708 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -129,7 +133,6 @@ class M708 extends BaseController
$data = $this->model->getDetail($id);
$memo = $this->model->getMemo($id);
$article = null;
$confirm = null;
if (!empty($data)) {
@@ -360,6 +363,11 @@ class M708 extends BaseController
// 확인결과 저장
public function saveResult()
{
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$fax_sq = $this->request->getPost('fax_sq');
$vr_sq = $this->request->getPost('vr_sq');
@@ -387,9 +395,72 @@ class M708 extends BaseController
}
// DB에 결과 저장
// $this->model->saveHongBoFAX($fax_sq, $vr_sq, $atcl_no, $work_type, $send_yn, $result_d11, $comment_d11, $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3, $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3, $file_type);
$return = $this->model->saveHongBoFAX($fax_sq, $vr_sq, $atcl_no, $work_type, $send_yn, $result_d11 ?? null, $comment_d11 ?? null, $fax_conf_yn_1 ?? null, $fax_conf_yn_2 ?? null, $fax_conf_yn_3 ?? null, $fax_conf_info_1 ?? null, $fax_conf_info_2 ?? null, $fax_conf_info_3 ?? null, $file_type);
if (empty($return['code']) && $work_type == '2') {
// 검증센터에 데이터를 전송한다.
$sendData = $this->model->getDataConfirmAPI($vr_sq);
if (($fax_conf_yn_3 ?? 'N') == 'Y' || (int) $article['try_cnt'] < 1) {
$send_result = $naver->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
if ($send_result['result'] == 'success') {
$this->model->InsCharger($vr_sq);
// DB에 상태값을 전송완료로 저장한다.
if (empty($sendData['success'])) {
$stat_cd = '39'; // 서류/전화 확인 실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경..
if ($sendData['try_cnt'] >= '1') {
$stat_cd = '69'; // 검증실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경..
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0302', '1', 'add'); // 최종실패로 저장
} else {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0301', '1', 'add'); // 1차실패로 저장
}
// $res_try = $this->m708_model->chgTryCnt($vr_sq, intval($sendData['try_cnt']) +1);
$this->model->increseTryCnt($vr_sq);
if (($result_d11 ?? '') == '20013') {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0203', '1', 'add'); // 기타로 저장
} else {
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0202', '1', 'add'); // 불일치로 저장
}
} else {
$stat_cd = '35'; // 서류/전화 확인 성공
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경..
$rgbk_cofirm = $this->model->getRgbk_confirm($vr_sq);
if ($rgbk_cofirm == '1') {
$stat_cd = '40';
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 등기부등본 확인중 상태로 변경..
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0201', '1', 'add'); // 일치로 저장
} else {
$stat_cd = '60';
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 검증완료 상태로 변경..
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0205', '1', 'add'); // 홍보확인서완료 등기부등본확인 안함 저장
}
}
} else {
throw new \Exception($send_result['error']);
}
} else {
$stat_cd = '39'; // 서류/전화 확인 실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd);
$stat_cd = '30'; // 서류/전화 확인 중
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd);
$this->model->increseTryCnt($vr_sq);
throw new \Exception('의뢰인 정보 불일치로 저장되었습니다.');
}
}
return $this->response->setJSON([
@@ -408,14 +479,131 @@ class M708 extends BaseController
}
}
// 분양계약서 저장
// 분양계약서 조회
public function saveBunyangCnt()
{
try {
$vr_sq = $this->request->getPost('vr_sq');
$rsrv_sq = $this->model->get_rsrv_sq($vr_sq);
$cnt = $this->model->getI8Cnt($rsrv_sq['rsrv_sq']);
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
'cnt' => $cnt,
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 분양계약서 저장
public function saveResult3()
{
$naver = new NaverApiClient();
$v2StDailyModel = new V2StDailyModel();
try {
$fax_sq = $this->request->getPost('fax_sq');
$vr_sq = $this->request->getPost('vr_sq');
$atcl_no = $this->request->getPost('atcl_no');
$work_type = $this->request->getPost('work_type');
$resyn = $this->request->getPost('resYn');
$dbusageagryn = $this->request->getPost('dbUsageAgrYn');
$send_yn = 'Y'; // 업데이트 된다면 미처리->처리상태로 변경
$article = $this->model->getArticleInfo2($atcl_no, $vr_sq);
$v2_vrfc_req = $v2StDailyModel->get_v2_vrfc_req($vr_sq);
if ((int) $article['stat_cd'] >= 40) {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
if (!empty($resyn)) {
$this->model->updateResDB($resyn, $dbusageagryn, $vr_sq);
}
// DB에 결과를 저장한다.
$return = $this->model->saveresult3FAX($fax_sq, $vr_sq, $atcl_no, $work_type, $send_yn, $result_d11 ?? null, $comment_d11 ?? null, $fax_conf_yn_1 ?? null, $fax_conf_yn_2 ?? null, $fax_conf_yn_3 ?? null, $fax_conf_info_1 ?? null, $fax_conf_info_2 ?? null, $fax_conf_info_3 ?? null);
if (empty($return['code']) && $work_type == '2') {
// 검증센터에 데이터를 전송한다.
$sendData = $this->model->getDataConfirmAPI($vr_sq);
if (($fax_conf_yn_3 ?? 'N') == 'Y' || $article['try_cnt'] < '1') {
$send_result = $naver->confirm($sendData['atclNo'], $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['modifyInfo'], $sendData['date']);
if ($send_result['result'] == 'success') {
$this->model->InsCharger($vr_sq);
// DB에 상태값을 전송완료로 저장한다.
if (empty($sendData['success'])) {
$stat_cd = '39'; // 서류/전화 확인 실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경
if ($sendData['try_cnt'] >= '1') {
$stat_cd = '69'; // 검증실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경..
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0302', '1', 'add'); // 최종실패로 저장
} else {
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0301', '1', 'add'); // 1차실패로 저장
}
// $res_try = $this->m708_model->chgTryCnt($vr_sq, intval($sendData['try_cnt']) +1);
$this->model->increseTryCnt($vr_sq);
if (($result_d11 ?? '') == '20013') {
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0203', '1', 'add'); // 기타로 저장
} else {
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0202', '1', 'add'); // 불일치로 저장
}
} else {
$stat_cd = '35'; // 서류/전화 확인 성공
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경..
$rgbk_cofirm = $this->model->getRgbk_confirm($vr_sq);
if ($rgbk_cofirm == '1') {
$stat_cd = '40';
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 등기부등본 확인중 상태로 변경..
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0201', '1', 'add'); // 일치로 저장
} else {
$stat_cd = '60';
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 검증완료 상태로 변경..
$v2StDailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0205', '1', 'add'); // 홍보확인서완료 등기부등본확인 안함 저장
}
}
} else {
throw new \Exception($send_result['error']);
}
} else {
$stat_cd = '39'; // 서류/전화 확인 실패
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd);
$stat_cd = '30'; // 서류/전화 확인 중
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd);
$this->model->increseTryCnt($vr_sq);
throw new \Exception('의뢰인 정보 불일치로 저장되었습니다.');
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([

View File

@@ -117,9 +117,9 @@ class M709 extends BaseController
// 상세화면
public function detail($id)
{
$id = (int) $id;
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}

View File

@@ -3,7 +3,10 @@ namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\Common;
use App\Libraries\MyUpload;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M712Model;
class M712 extends BaseController
@@ -123,9 +126,10 @@ class M712 extends BaseController
public function detail($id): string
{
$id = (int) $id;
$naver = new NaverApiClient();
$id = (string) $id;
if ($id <= 0) {
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
@@ -138,12 +142,37 @@ class M712 extends BaseController
$regist = $this->model->getRecordInfo($id, '2'); //등기부등본
$display = $this->model->getDisplay('M705_detail');
$hscp_info = [];
if (!empty($data['hscp_no'])) {
$apt_rlet_type_cd = ['A01', 'A02', 'A03', 'A04', 'B01', 'B02', 'B03'];
$villa_rlet_type_cd = ['A05', 'A06'];
if (in_array($data['rlet_type_cd'], $apt_rlet_type_cd)) { // apt 단지
$detail_hscp = $naver->aptDetail($data['hscp_no']);
}
if (in_array($data['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
$detail_hscp = $naver->villaDetail($data['hscp_no']);
}
// print_r($data);
// print_r($detail_hscp);
// exit;
if (!empty($detail_hscp) && isset($detail_hscp['result'])) {
$hscp_info = $detail_hscp['result'];
}
}
$this->data['codes'] = $codes;
$this->data['data'] = $data;
$this->data['memo'] = $memo;
$this->data['record'] = $record;
$this->data['regist'] = $regist;
$this->data['display'] = $display;
$this->data['hscp_info'] = $hscp_info;
return view("pages/v2/m712/detail", $this->data);
}
@@ -293,13 +322,383 @@ class M712 extends BaseController
// 정보저장
public function saveRegi()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 등기부등본 확인중 상태로 변경. (수정변경이력 저장)
1.5.1 이미지파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 매물주소, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 등기부등본 확인완료 상태. (수정변경이력 저장)
1.12.1 서류 확인내용 v2_article_info_etc document_cert_method 저장
*/
$naver = new NaverApiClient();
// $model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s');
$atcl_vrtc_way = 'R'; //검증구분
$atcl_vr_sq = $this->request->getPost('rcpt_key');
// $atcl_no = $this->request->getPost('atcl_no');
$reg_conf_yn_1 = $this->request->getPost('reg_conf_yn_1'); //확인내용
$reg_conf_yn_2 = $this->request->getPost('reg_conf_yn_2'); //매물주소
$reg_conf_yn_3 = $this->request->getPost('reg_conf_yn_3'); //의뢰인정보
$reg_conf_yn_info_2 = $this->request->getPost('reg_conf_yn_info_2'); //매물주소
$reg_conf_yn_info_3 = $this->request->getPost('reg_conf_yn_info_3'); //의뢰인정보
$memo = $this->request->getPost('memo'); //메모
$owner_verifiable = $this->request->getPost('owner_verifiable'); //실소유주 확인여부
$noimg_chk_chk = $this->request->getPost('noimg_chk_chk'); // 등기부등본이미지 파일없음.
$img_chk_chk = $this->request->getPost('img_chk_chk'); // 등기소, 리얼탑 열람, 리얼탑 기열람, 열람
$atcl_vrtc_type = $this->request->getPost('atcl_vrtc_type'); // 검증구분
$vrfc_type_sub = $this->request->getPost('vrfc_type_sub'); // 하위검증구분
$arr_uncnfrm_status = $this->request->getPost('arr_uncnfrm_status'); // 등기부등본 미확인여부 상세
$ownerTypeCode = $this->request->getPost('ownerTypeCode'); // 소유자명 확인 일치 , 불일치
$document_cert_method = $this->request->getPost('document_cert_method'); // 서류 내용 확인
if ($owner_verifiable == "1") {
$owner_verifiable = true;
} else {
$owner_verifiable = false;
}
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $v2DailyModel->get_v2_vrfc_req($atcl_vr_sq);
$rlet_type_cd = $model415->get_rlet_type_cd($atcl_vr_sq);
if ((int) $resStat['stat_cd'] >= 60 || (int) $resStat['stat_cd'] == 19) {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$resultCnt = $this->model->chkRegiTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
if ($resultCnt['reg_try_cnt'] == 0) { // 1차 검증일 때
log_message('debug', '712 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 0 ');
$try_cnt = '1';
} else if ($resultCnt['reg_try_cnt'] == 1) { // 2차 검증일 때
log_message('debug', '712 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 1 ');
$try_cnt = '2';
} else {
log_message('debug', '712 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 예외처리 ');
$try_cnt = '2';
//$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, $atcl_vrtc_way);
if ($result == 0) { //v2_confirm 존재하지 않는다면
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
// 수정한 시간이 현재시간10분전 보다 클 경우 수정불가능
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
$this->model->InsResChar($atcl_vr_sq); //담당자 업데이트
// 모바일v1,v2고 등기부등본 미확인여부 상세 저장
if ($vrfc_type_sub == 'M1' || $vrfc_type_sub == 'O1') {
$this->model->add_cert_uncnfrm_status($atcl_vr_sq, $arr_uncnfrm_status);
if (strpos($arr_uncnfrm_status, '20020') !== false) { //등기부등본 미확인여부 상세에 20020(파일 오첨부)있고
if ($vrfc_type_sub == 'M1') { // 모바일v1일땐 코드 20020,코멘트x
$reg_conf_yn_2 = '20020';
$reg_conf_yn_info_2 = '';
} else { // 모바일v2일땐 일반 불일치코드,코멘트=파일 오첨부
$reg_conf_yn_info_2 = '파일 오첨부';
}
}
}
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '21', $reg_conf_yn_2, $reg_conf_yn_info_2);
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '22', $reg_conf_yn_3, $reg_conf_yn_info_3);
//memo 저장
$this->model->saveMemo([$memo, $atcl_vr_sq]);
// document_cert_method
$this->model->updatedocument_cert_method($atcl_vr_sq, $document_cert_method);
//실소유주 확인 저장
$this->model->update_owner_verifiable($atcl_vr_sq, $owner_verifiable);
$sendData = $this->model->getDatacertAPI($atcl_vr_sq, 'R');
log_message('debug', '712 saveRegi => ' . $sendData['atclNo'] . ' ::: ' . json_encode($sendData) . PHP_EOL);
$d_yn = $this->model->get_send_yn('D');
if ($d_yn['stop_yn'] == 'N') { //전송금지
//1.해당매물정보를v2_stop_api_save_info에다 넣음
$this->model->insert_v2_stop_api_save_info($sendData['atclNo'], $atcl_vr_sq, 'D', '');
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
//API 호출
$send_result = $naver->certification_712($sendData['atclNo'], $try_cnt, $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['date'], $sendData['modifyInfo'], $sendData['ownerVerifiable']);
}
if ($send_result['result'] == 'success') {
if ($chk_type == '1') {
//상태변경 TABLE INSERT : 등기부등본 확인완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '45', $toDay);
$chgVrfc45 = $this->model->chgStatVrfc($atcl_vr_sq, '45'); //v2_vrfc_req INSERT
$statFaxUp45 = $this->model->chgStatFax($atcl_vr_sq, '45'); //fax_imgs
//상태변경 TABLE INSERT : 검증완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '60', $toDay);
$chgVrfc60 = $this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
$statFaxUp60 = $this->model->chgStatFax($atcl_vr_sq, '60'); //fax_imgs
// ★ 검증완료
//0.불일치 이력이 있는지 확인
$cnt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
if (empty($cnt)) {
if ($atcl_vrtc_type == 'M' || $atcl_vrtc_type == 'N') { //모바일은 등기가 첨 시작이니까 insert해줘야함
if (!($atcl_vrtc_type == 'M' && in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03')))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.검증완료시간
$finishTime = $model415->get_60_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '76', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '80', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0111', '1', 'add'); // 등기소로 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '86', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0107', '1', 'add'); // 리얼탑 열람 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '87', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0108', '1', 'add'); // 리얼탑 기열람 일치으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
}
} else {
if ($atcl_vrtc_type == 'M') {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$chgVrfc69 = $this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$statFaxUp69 = $this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일이고 검증실패
if (!in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03'))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//등기부등본 확인중 상태로 변경.
$this->model->saveChangedHistory($atcl_vr_sq, '30', 'C9', $usr_id, '상태변경 : 49 => 30'); //검증결과 변동사항 HISTORY
$chgVrfc40 = $this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
$statFaxUp40 = $this->model->chgStatFax($atcl_vr_sq, '30'); //fax_imgs
if ($try_cnt == '1') {
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '1');
if ($atcl_vrtc_type == 'T') {
//검증구분이 전화매물일 경우 사전에 일치로 처리된 값을 초기화 시켜준다.
$reset_query = $this->model->resetTelConf($atcl_vr_sq);
}
// ★1차실패
if ($atcl_vrtc_type == 'N') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$sf = 'F';
$model415->update_v2_time_required_Conf($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $sf);
}
} else if ($try_cnt == '2') {
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$this->model->chgStat($atcl_vr_sq, '69', $toDay);
$chgVrfc69 = $this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$statFaxUp69 = $this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일 이외 검증실패
if ($atcl_vrtc_type == 'N') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '77', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '85', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0112', '1', 'add'); // 등기소 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '88', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0109', '1', 'add'); // 리얼탑 열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '89', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0110', '1', 'add'); // 리얼탑 기열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
}
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
]);
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
]);
} catch (\Exception $e) {
return $this->response->setJSON([
@@ -310,7 +709,7 @@ class M712 extends BaseController
}
// 다음매물확인
public function getNextInfo()
public function nextRegi()
{
try {

763
app/Controllers/V2/M713.php Normal file
View File

@@ -0,0 +1,763 @@
<?php
namespace App\Controllers\V2;
use App\Controllers\BaseController;
use App\Libraries\MyUpload;
use App\Libraries\NaverApiClient;
use App\Models\common\CodeModel;
use App\Models\results\M415Model;
use App\Models\v2\M710Model;
use App\Models\v2\M713Model;
class M713 extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new M713Model();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID', 'ARTICLE_TYPE']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList();
$team = $this->model->getTeamList();
$user = $this->model->getUserList();
$this->data['sido'] = $sido;
$this->data['bonbu'] = $bonbu;
$this->data['team'] = $team;
$this->data['user'] = $user;
$this->data['codes'] = $codes;
return view("pages/v2/m713/lists", $this->data);
}
public function getResultList()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'atcl_no' => $this->request->getGet('atcl_no'), // 매물번호
'stat_cd' => $this->request->getGet('stat_cd'), // 현재상태
'realtor_nm' => $this->request->getGet('realtor_nm'), // 중개소
'charger_gbn' => $this->request->getGet('charger_gbn'), // 배정여부
'assign_yn' => $this->request->getGet('assign_yn'), // 배정여부2
'receipt_sdate' => $this->request->getGet('receipt_sdate'), // 접수기간1
'receipt_edate' => $this->request->getGet('receipt_edate'), // 접수기간2
'complete_sdate' => $this->request->getGet('complete_sdate'), // 완료기간1
'complete_edate' => $this->request->getGet('complete_edate'), // 완료기간2
'srcSido' => $this->request->getGet('srcSido'), // 시도
'srcGugun' => $this->request->getGet('srcGugun'), // 시군구
'srcDong' => $this->request->getGet('srcDong'), // 읍면동
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'damdang' => $this->request->getGet('damdang'), // 담당
'vrfcreq_way' => $this->request->getGet('vrfcreq_way'), // 검증방식1
'vrfc_type_sub' => $this->request->getGet('vrfc_type_sub'), // 검증방식2
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // 매체사
'rlet_type_cd' => $this->request->getGet('rlet_type_cd'), // 매물종류
'chk_spc_yn' => $this->request->getGet('chk_spc_yn'), // 면적확인
'reference_file_url_yn' => $this->request->getGet('reference_file_url_yn'), // 참고용
'corp_own' => $this->request->getGet('corp_own'), // 법인소유
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getResultList($start, $end, $data);
return $this->response->setJSON(body: [
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'atcl_no' => $this->request->getGet('atcl_no'), // 매물번호
'stat_cd' => $this->request->getGet('stat_cd'), // 현재상태
'realtor_nm' => $this->request->getGet('realtor_nm'), // 중개소
'charger_gbn' => $this->request->getGet('charger_gbn'), // 배정여부
'assign_yn' => $this->request->getGet('assign_yn'), // 배정여부2
'receipt_sdate' => $this->request->getGet('receipt_sdate'), // 접수기간1
'receipt_edate' => $this->request->getGet('receipt_edate'), // 접수기간2
'complete_sdate' => $this->request->getGet('complete_sdate'), // 완료기간1
'complete_edate' => $this->request->getGet('complete_edate'), // 완료기간2
'srcSido' => $this->request->getGet('srcSido'), // 시도
'srcGugun' => $this->request->getGet('srcGugun'), // 시군구
'srcDong' => $this->request->getGet('srcDong'), // 읍면동
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'damdang' => $this->request->getGet('damdang'), // 담당
'vrfcreq_way' => $this->request->getGet('vrfcreq_way'), // 검증방식1
'vrfc_type_sub' => $this->request->getGet('vrfc_type_sub'), // 검증방식2
'rcpt_cpid' => $this->request->getGet('rcpt_cpid'), // 매체사
'rlet_type_cd' => $this->request->getGet('rlet_type_cd'), // 매물종류
'chk_spc_yn' => $this->request->getGet('chk_spc_yn'), // 면적확인
'reference_file_url_yn' => $this->request->getGet('reference_file_url_yn'), // 참고용
'corp_own' => $this->request->getGet('corp_own'), // 법인소유
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 상세화면
public function detail($id): string
{
$naver = new NaverApiClient();
$id = (string) $id;
if ($id === '') {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
$codes = $this->codeModel->getCodeLists(['VRFCREQ_WAY', 'CONFIRM_RESULT_D11', 'CONFIRM_RESULT_T11', 'TRADE_TYPE', 'CERT_UNCNFRM_STATUS']); // 코드조회
$data = $this->model->getDetail($id);
$memo = $this->model->getMemo($id);
$record = $this->model->getRecordInfo($id, '1'); //홍보확인서
$regist = $this->model->getRecordInfo($id, '2'); //등기부등본
$display = $this->model->getDisplay('M713_detail');
$sido = $this->model->getAreaList(); // 지역조회
$hscp_info = [];
if (!empty($data['hscp_no'])) {
$apt_rlet_type_cd = ['A01', 'A02', 'A03', 'A04', 'B01', 'B02', 'B03'];
$villa_rlet_type_cd = ['A05', 'A06'];
if (in_array($data['rlet_type_cd'], $apt_rlet_type_cd)) { // apt 단지
$detail_hscp = $naver->aptDetail($data['hscp_no']);
}
if (in_array($data['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
$detail_hscp = $naver->villaDetail($data['hscp_no']);
}
// print_r($data);
// print_r($detail_hscp);
// exit;
if (!empty($detail_hscp) && isset($detail_hscp['result'])) {
$hscp_info = $detail_hscp['result'];
}
}
$this->data['codes'] = $codes;
$this->data['data'] = $data;
$this->data['memo'] = $memo;
$this->data['record'] = $record;
$this->data['regist'] = $regist;
$this->data['display'] = $display;
$this->data['sido'] = $sido;
$this->data['hscp_info'] = $hscp_info;
return view("pages/v2/m713/detail", $this->data);
}
// 이미지회전
public function rotateImage()
{
$common = new Common();
try {
$vr_sq = $this->request->getPost('vr_sq');
$degress = $this->request->getPost('degress');
if (empty($degrees) || !is_numeric($degrees)) {
$degrees = 90;
}
$regist = $this->model->getRecordInfo($vr_sq, '2');
$fullPath = $regist['file_path'] . $regist['file_name'];
$fullPath = $_SERVER['DOCUMENT_ROOT'] . $common->realpath_to_webpath($fullPath);
$degrees = (float) $degrees;
$im = new \Imagick($fullPath);
// 배경색(회전 시 빈 공간 채우는 색). 투명 원하면 'transparent'
$im->setImageBackgroundColor(new \ImagickPixel('white'));
// 회전
$im->rotateImage($im->getImageBackgroundColor(), $degrees);
// 포맷/압축 유지(옵션)
$im->setImageCompressionQuality(90);
// 덮어쓰기
$im->writeImage($fullPath);
$im->clear();
$im->destroy();
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 법인매물저장
public function saveCorpOwn()
{
try {
$vr_sq = $this->request->getPost('vr_sq');
$atcl_no = $this->request->getPost('atcl_no');
// UPDATE v2_article_info_etc
$this->model->saveCorpOwn($vr_sq, $atcl_no);
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 파일업로드
public function uploadFile()
{
$lib = new MyUpload();
try {
$usr_id = session('usr_id');
$vr_sq = $this->request->getPost('vr_sq');
$file = $this->request->getFile('file');
if ($file && $file->isValid() && !$file->hasMoved()) {
$uploadPath = "/upload/v2_file/" . $vr_sq . "/";
$arrUploadfile = [];
if ($file->isValid() && !$file->hasMoved()) {
$uploadData = $lib->do_upload2($file, $uploadPath);
if ($uploadData !== false) {
$arrUploadfile[] = $uploadData;
}
}
if (!empty($arrUploadfile)) {
foreach ($arrUploadfile as $key => $uploadFile) {
$data = [
'vr_sq' => $vr_sq,
// 'file_sq' => $this->request->getPost('file_sq'),
'orig_name' => $uploadFile['origin_name'],
'new_name' => $uploadFile['file_name'],
'file_path' => $uploadPath, // 필요에 따라 상대경로로만 저장
'ext' => '.' . $uploadFile['ext'],
'size' => $file->getSize(),
'img_yn' => null,
'img_height' => null,
'img_width' => null,
'usr_id' => $usr_id,
];
}
if (!empty($data)) {
// 파일업로드 정보 저장
$this->model->saveFileInfo($data);
}
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
public function saveModify()
{
try {
$vr_sq = $this->request->getPost('vr_sq');
$owner_birth = $this->request->getPost('owner_birth');
$address2 = $this->request->getPost('address2');
$address2a = $this->request->getPost('address2a');
$address2b = $this->request->getPost('address2b');
$address3 = $this->request->getPost('address3');
$address4 = $this->request->getPost('address4');
$address_code = $this->request->getPost('dong');
$hscp_no = $this->request->getPost('hscp_no');
$hscp_nm = $this->request->getPost('hscp_nm');
$owner_birth = trim($owner_birth);
$this->model->modify_info($vr_sq, $owner_birth, $address2, $address2a, $address2b, $address3, $address4, $address_code, $hscp_no, $hscp_nm);
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 등기부등본 저장
public function saveRegi()
{
/*
1.0.1 POST 데이터 받기.
1.1.1 1차 검증인지 2차검증인지 확인.
1.1.2 1차, 2차 검증이면 v2_confirm.type에 넣을 값을 알맞게 셋팅.
1.2.1 v2_confirms에 데이터가 있는지 확인.
1.3.1 데이터가 있음 : success 여부 판단 후 updateConfirm 실행 success값만 UPDATE. (수정변경이력 저장)
1.4.1 데이터가 없음 : success 여부 판단 후 insertConfirm 실행 v2_confirms INSERT. (수정변경이력 저장)
1.4.2 상태변경 하기 : 등기부등본 확인중 상태로 변경. (수정변경이력 저장)
1.5.1 이미지파일 서버에 UPLOAD (수정변경이력 저장)
1.6.1 기존파일 탐색.
1.7.1 기존파일 있음 : 기존파일 use_yn 'N'으로 UPDATE 후 v2_files INSERT.
1.8.1 기존파일 없음 : v2_files INSERT.
1.9.1 매물주소, 의뢰인 정보 v2_check_list INSERT. (수정변경이력 저장)
1.10.1 API 전송.
1.11.1 API 전송결과 : SUCCESS 이면 상태값 변경 : 등기부등본 확인완료 상태. (수정변경이력 저장)
*/
$naver = new NaverApiClient();
$model710 = new M710Model();
$model415 = new M415Model();
$v2DailyModel = new V2StDailyModel();
try {
$usr_id = session('usr_id');
$toDay = date('Y-m-d H:i:s');
$atcl_vrtc_way = 'R'; //검증구분
$atcl_vr_sq = $this->request->getPost('rcpt_key');
// $atcl_no = $this->request->getPost('atcl_no');
$reg_conf_yn_1 = $this->request->getPost('reg_conf_yn_1'); //확인내용
$reg_conf_yn_2 = $this->request->getPost('reg_conf_yn_2'); //매물주소
$reg_conf_yn_3 = $this->request->getPost('reg_conf_yn_3'); //의뢰인정보
$reg_conf_yn_info_2 = $this->request->getPost('reg_conf_yn_info_2'); //매물주소
$reg_conf_yn_info_3 = $this->request->getPost('reg_conf_yn_info_3'); //의뢰인정보
$memo = $this->request->getPost('memo'); //메모
$owner_verifiable = $this->request->getPost('owner_verifiable'); //실소유주 확인여부
$noimg_chk_chk = $this->request->getPost('noimg_chk_chk'); // 등기부등본이미지 파일없음.
$img_chk_chk = $this->request->getPost('img_chk_chk'); // 등기소, 리얼탑 열람, 리얼탑 기열람, 열람
$atcl_vrtc_type = $this->request->getPost('atcl_vrtc_type'); // 검증구분
$vrfc_type_sub = $this->request->getPost('vrfc_type_sub'); // 하위검증구분
$arr_uncnfrm_status = $this->request->getPost('arr_uncnfrm_status'); // 등기부등본 미확인여부 상세
//상태가 이미 등기부등본확인중 이상이면 저장하지 않는다.
$resStat = $this->model->chkStat($atcl_vr_sq);
$v2_vrfc_req = $v2DailyModel->get_v2_vrfc_req($atcl_vr_sq);
$rlet_type_cd = $model415->get_rlet_type_cd($atcl_vr_sq);
if ((int) $resStat['stat_cd'] >= 60 || (int) $resStat['stat_cd'] == 19) {
throw new \Exception('이미 저장된 데이터입니다.');
} else {
$resultCnt = $this->model->chkRegiTryCnt($atcl_vr_sq); //1차검증인지 2차검증인지 확인 쿼리 : v2_vrfc_req.type_cnt
if ($resultCnt['reg_try_cnt'] == 0) { // 1차 검증일 때
log_message('debug', '713 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 0 ');
$try_cnt = '1';
} else if ($resultCnt['reg_try_cnt'] == 1) { // 2차 검증일 때
log_message('debug', '713 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 1 ');
$try_cnt = '2';
} else {
log_message('debug', '713 page >> 매물번호 : ' . $atcl_vr_sq . ' 등기부등본 불일치 횟수 : 예외처리 ');
$try_cnt = '2';
//$try_cnt = intval($try_cnt) + 1;
}
$result = $this->model->chkConfirm($atcl_vr_sq, $atcl_vrtc_way);
if ($result == 0) { //v2_confirm 존재하지 않는다면
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
// 수정한 시간이 현재시간10분전 보다 클 경우 수정불가능
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->insertConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type, $try_cnt);
} else {
if ($reg_conf_yn_2 == '10000' && $reg_conf_yn_3 == '10000') { //success 여부 판단
$chk_type = '1';
//$chk_delay = '0'; //지연여부
//$chk_zombie = '0'; //좀비매물
} else {
// 2015.06.29 추가
// 불일치가 날 경우에 10분 이내에 다시 불일치 처리 불가능(같은 매물을 두사람이 중복처리할 가능성 사전 방지)
// 1. 현재 매물의 마지막으로 업데이트 된 시간을 가져옴.
// 2. 현재 시간과 비교하여 10분 이내면 경고창을 띄어줌.
$chk_type = '0';
//$chk_delay = '1'; //지연여부
//$chk_zombie = '0'; //좀비매물
$result_tm = $this->model->getUpdateFailTime($atcl_vr_sq);
$update_tm = $result_tm['insert_tm'];
$ten_ago = date("Y-m-d H:i:s", mktime(date("H"), date("i") - 1, date("s"), date("m"), date("d"), date("Y")));
if ($update_tm > $ten_ago) {
// 수정한 시간이 현재시간10분전 보다 클 경우 수정불가능
throw new \Exception('이미 불일치 처리 된 매물입니다.');
}
}
$this->model->updateConfirm($atcl_vr_sq, $atcl_vrtc_way, $chk_type);
}
$this->model->InsResChar($atcl_vr_sq); //담당자 업데이트
// 모바일v1,v2고 등기부등본 미확인여부 상세 저장
if ($vrfc_type_sub == 'M1' || $vrfc_type_sub == 'O1') {
$this->model->add_cert_uncnfrm_status($atcl_vr_sq, $arr_uncnfrm_status);
if (strpos($arr_uncnfrm_status, '20020') !== false) { //등기부등본 미확인여부 상세에 20020(파일 오첨부)있고
if ($vrfc_type_sub == 'M1') { // 모바일v1일땐 코드 20020,코멘트x
$reg_conf_yn_2 = '20020';
$reg_conf_yn_info_2 = '';
} else { // 모바일v2일땐 일반 불일치코드,코멘트=파일 오첨부
$reg_conf_yn_info_2 = '파일 오첨부';
}
}
}
//v2_check_list 확인여부 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '21', $reg_conf_yn_2, $reg_conf_yn_info_2);
//v2_check_list 매물주소 INSERT
$this->model->insertChkList($atcl_vr_sq, $atcl_vrtc_way, '22', $reg_conf_yn_3, $reg_conf_yn_info_3);
//memo 저장
$this->model->saveMemo([$memo, $atcl_vr_sq]);
//실소유주 확인 저장
$this->model->update_owner_verifiable($atcl_vr_sq, $owner_verifiable);
$sendData = $this->model->getDatacertAPI($atcl_vr_sq, 'R');
//이미지 파일 없음 && 홍보확인서 V2일 경우
log_message('debug', '713 noimage_chk_chk sendData_return1 => ' . $sendData['atclNo'] . ' ::: ' . json_encode($sendData) . PHP_EOL);
if ($noimg_chk_chk == "Y" && $sendData['vrfcType'] == "D2") {
// $sendData['ownerVerifiable'] = false;
}
$d_yn = $model710->get_send_yn('O');
if ($d_yn['stop_yn'] == 'N') { //전송금지
//1.해당매물정보를v2_stop_api_save_info에다 넣음
$model710->insert_v2_stop_api_save_info($sendData['atclNo'], $atcl_vr_sq, 'O', '');
//2.아무렇지않게 행동한다
$send_result['result'] = 'success';
} else {
//API 호출
$send_result = $naver->certification($sendData['atclNo'], $try_cnt, $sendData['success'], $sendData['checkList'], $sendData['charger'], $sendData['date'], $sendData['modifyInfo'], $sendData['ownerVerifiable']);
}
if ($send_result['result'] == 'success') {
if ($chk_type == '1') {
//상태변경 TABLE INSERT : 등기부등본 확인완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '45', $toDay);
$chgVrfc45 = $this->model->chgStatVrfc($atcl_vr_sq, '45'); //v2_vrfc_req INSERT
$statFaxUp45 = $this->model->chgStatFax($atcl_vr_sq, '45'); //fax_imgs
//상태변경 TABLE INSERT : 검증완료 상태로 변경
$this->model->chgStat($atcl_vr_sq, '60', $toDay);
$chgVrfc60 = $this->model->chgStatVrfc($atcl_vr_sq, '60'); //v2_vrfc_req INSERT
$statFaxUp60 = $this->model->chgStatFax($atcl_vr_sq, '60'); //fax_imgs
// ★ 검증완료
//0.불일치 이력이 있는지 확인
$cnt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
if (empty($cnt)) { //검증완료일땐 불일치가없어야 통계포함된다
if ($atcl_vrtc_type == 'M' || $atcl_vrtc_type == 'O') { //모바일은 등기가 첨 시작이니까 insert해줘야함
if (!($atcl_vrtc_type == 'M' && in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03')))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.검증완료시간
$finishTime = $model415->get_60_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인완료 시간
$cert_comple_dt = $model415->get_cert_confTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '76', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '80', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0111', '1', 'add'); // 등기소로 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '86', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0107', '1', 'add'); // 리얼탑 열람 일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '87', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0108', '1', 'add'); // 리얼탑 기열람 일치으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0101', '1', 'add'); // 일치로 저장
}
} else {
if ($atcl_vrtc_type == 'M') {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//v2_vrfc_req try_cnt 값을 1로 update
$res_try = $this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$result_query9 = $this->model->chgStat($atcl_vr_sq, '69', $toDay);
$chgVrfc69 = $this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$statFaxUp69 = $this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일이고 검증실패
if (!in_array($rlet_type_cd['rlet_type_cd'], array('B01', 'B02', 'B03'))) {//만약 분양권들이면 넘어가고 아니면 체크
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
}
} else {
//상태변경 TABLE INSERT : 등기부등본 확인 불일치 상태로 변경
$result_query7 = $this->model->chgStat($atcl_vr_sq, '49', $toDay);
$chgVrfc49 = $this->model->chgStatVrfc($atcl_vr_sq, '49'); //v2_vrfc_req INSERT
$statFaxUp49 = $this->model->chgStatFax($atcl_vr_sq, '49'); //fax_imgs
//등기부등본 확인중 상태로 변경.
$this->model->saveChangedHistory($atcl_vr_sq, '30', 'C9', $usr_id, '상태변경 : 49 => 30'); //검증결과 변동사항 HISTORY
$chgVrfc40 = $this->model->chgStatVrfc($atcl_vr_sq, '30'); //v2_vrfc_req INSERT
$statFaxUp40 = $this->model->chgStatFax($atcl_vr_sq, '30'); //fax_imgs
if ($try_cnt == '1') {
//v2_vrfc_req try_cnt 값을 1로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '1');
if ($atcl_vrtc_type == 'T') {
//검증구분이 전화매물일 경우 사전에 일치로 처리된 값을 초기화 시켜준다.
$reset_query = $this->model->resetTelConf($atcl_vr_sq);
}
// ★1차실패
if ($atcl_vrtc_type == 'O') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$sf = 'F';
$model415->update_v2_time_required_Conf($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $sf);
}
} else if ($try_cnt == '2') {
//v2_vrfc_req try_cnt 값을 2로 update
$this->model->chgRegiTryCnt($atcl_vr_sq, '2');
//상태변경 TABLE INSERT : 검증실패 상태로 변경.
$result_query9 = $this->model->chgStat($atcl_vr_sq, '69', $toDay);
$chgVrfc69 = $this->model->chgStatVrfc($atcl_vr_sq, '69'); //v2_vrfc_req INSERT
$statFaxUp69 = $this->model->chgStatFax($atcl_vr_sq, '69'); //fax_imgs
// ★모바일 이외 검증실패
if ($atcl_vrtc_type == 'O') {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_M_timeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.검증실패시간
$finishTime = $model415->get_69_ForHistory($atcl_vr_sq);
//4.해당 정보를 테이블에 넣는다
$model415->insert_v2_time_required_M($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm'], $finishTime['insert_tm']);
} else {
//1.등기부등본 확인중 시간
$tel_doc_conf_dt = $model415->get_cert_ing_TimeForHistory($atcl_vr_sq);
//2.등기부등본 확인실패 시간
$cert_comple_dt = $model415->get_cert_failTimeForHistory($atcl_vr_sq);
//3.해당 정보를 테이블에 넣는다
$model415->update_v2_time_required_Conf_Done($v2_vrfc_req['atcl_no'], $v2_vrfc_req['cpid'], $atcl_vrtc_type, $tel_doc_conf_dt['insert_tm'], $cert_comple_dt['insert_tm']);
}
}
}
if ($noimg_chk_chk == 'Y') {
$this->model->chgStat($atcl_vr_sq, '70', $toDay);
$this->model->updateStat($atcl_vr_sq, 'Y'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0103', '1', 'add'); // 등기부등본이미지 없음 저장
}
if ($img_chk_chk == 'O') {
$this->model->chgStat($atcl_vr_sq, '77', $toDay);
$this->model->updateStat($atcl_vr_sq, 'O'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0105', '1', 'add'); // (열람)간소화확인으로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'T') {
$this->model->chgStat($atcl_vr_sq, '85', $toDay);
$this->model->updateStat($atcl_vr_sq, 'T'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0112', '1', 'add'); // 등기소 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'R') {
$this->model->chgStat($atcl_vr_sq, '88', $toDay);
$this->model->updateStat($atcl_vr_sq, 'R'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0109', '1', 'add'); // 리얼탑 열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
} else if ($img_chk_chk == 'G') {
$this->model->chgStat($atcl_vr_sq, '89', $toDay);
$this->model->updateStat($atcl_vr_sq, 'G'); // reg_status를 업데이트해준다.
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0110', '1', 'add'); // 리얼탑 기열람 불일치로 저장
$v2DailyModel->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'R0102', '1', 'add'); // 불일치로 저장
}
}
} else {
if (isset($send_result['error'])) {
$error_message = $send_result['error']['code'] . "\\n" . $send_result['error']['message'];
// API 호출 에러 발생시 해당 내용들을 DB에 저장해준다.
$err_time = date("Y-m-d H:i:s");
$this->model->saveApiErr($atcl_vr_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
throw new \Exception($error_message);
} else {
throw new \Exception('네이버 전송 중 오류가 발생되었습니다. 다시 시도하세요.');
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 다음매물확인
public function nextRegi()
{
try {
$vr_sq = $this->request->getPost('vr_sq');
$data = $this->model->getNextInfo($vr_sq);
if (empty($data)) {
return $this->response->setJSON([
'code' => '9',
'msg' => '등기부등본 이미지가 존재하지 않습니다.'
]);
} else {
return $this->response->setJSON([
'code' => '0',
'msg' => 'success',
'resw' => $data['vr_sq']
]);
}
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace App\Controllers\V2;
use CodeIgniter\Model;
class V2StDailyModel extends Model
{
/**
* 일자별 통계데이터에 값 집어 넣기...
* 반환값 없음.
* @param date $sd_date 날짜 값이 없을경우 현재날짜로 입력됨.
* @param string $cpid CPID
* @param string $gbn_cd 코드값 (category='STATISTICS_DAILY3')
* @param int $cnt 더할 숫자..
* @param string $cnt_type 숫자를 더할것인지.. 아니변 변경할것인지.
*/
public function set_v2_st_daily($st_date, $cpid, $gbn_cd, $cnt, $cnt_type = 'add')
{
/**
* insert into v2_st_daily (sd_date, cpid, gbn_cd, cnt) values ($sd_date, $cpid, $gbn_cd, $cnt)
* on duplicate key update cnt = values(cnt); // $cnt_type='change'
* on duplicate key update cnt = cnt + $cnt; // $cnt_type='add'
*/
if (empty($cnt))
$cnt = '0';
$sql_dup = "";
switch (strtolower($cnt_type)) {
case 'add':
$sql_dup = "on duplicate key update cnt = cnt + " . $cnt;
break;
case 'change':
$sql_dup = "on duplicate key update cnt = values(cnt)";
break;
}
if (empty($st_date)) {
$sql = "insert into v2_st_daily (st_date, cpid, gbn_cd, cnt) values (now(), ?, ?, ?)" . $sql_dup;
$data = array(
$cpid,
$gbn_cd,
$cnt
);
} else {
$sql = "insert into v2_st_daily (st_date, cpid, gbn_cd, cnt) values (?, ?, ?, ?)" . $sql_dup;
$data = array(
$st_date,
$cpid,
$gbn_cd,
$cnt
);
}
$this->db->query($sql, $data);
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
return $return;
}
/**
* 지정한 매물의 요청번호를 이용하여 요청내역을 가져온다.
*/
public function get_v2_vrfc_req($vr_sq)
{
$columns = "vr_sq,atcl_no,step,cpid,cp_atcl_id,trade_type,realtor_nm,realtor_tel_no,seller_tel_no,vrfc_type,rgbk_confirm,req_type,rdate,stat_cd,try_cnt,insert_user,insert_tm,memo,contact_fail_cnt,sync_yn,reg_try_cnt";
$builder = $this->db->table('v2_vrfc_req');
$builder->select($columns, false);
$builder->where('vr_sq', $vr_sq);
$row = $builder->get()->getRowArray();
return $row;
}
}

View File

@@ -0,0 +1,204 @@
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Models\webfax\FaxModel;
use App\Libraries\Qrcode;
use CodeIgniter\CLI\CLI;
use CodeIgniter\Exceptions\PageNotFoundException;
class Crontab extends BaseController
{
/**
* Fax 수신 이미지(tiff)를 jpg로 변경하고 Thumbnail을 만드는 작업...
* (CLI 전용)
*/
public function convertedFaxImages()
{
// ✅ CLI 전용 보호
if (!is_cli()) {
throw new PageNotFoundException();
}
/** @var FaxModel $faxModel */
$faxModel = model(FaxModel::class);
$qrCode = new Qrcode();
$res = $faxModel->selectFaxListNotExistsThumb();
$fileCnt = 0;
$receiver = 'uds_tiff';
if (empty($res)) {
CLI::write('No target fax images.', 'yellow');
return;
}
foreach ($res as $row) {
$fileCnt++;
CLI::write("\n\n[{$fileCnt}] Processing...", 'green');
$mid = $row['mid'] ?? null;
$file_name = $row['file_name'] ?? '';
$save_path = $row['save_path'] ?? '';
$caller_no = $row['caller_no'] ?? '';
$callee_no = $row['callee_no'] ?? '';
$tiff_file_name = $row['file_name'] ?? '';
$tiff_file_size = $row['file_size'] ?? '';
$recv_time = $row['recv_time'] ?? '';
$save_time = $row['save_time'] ?? '';
if (empty($save_path) || empty($file_name)) {
CLI::write(' - skip: save_path or file_name empty', 'yellow');
continue;
}
// ✅ pathinfo로 안전하게 처리
$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
$base = pathinfo($file_name, PATHINFO_FILENAME);
if (!in_array($ext, ['tif', 'tiff'], true)) {
CLI::write(" - skip: not tif/tiff ({$ext})", 'yellow');
continue;
}
if (substr($save_path, -1) !== '/') {
$save_path .= '/';
}
$tiffPath = $save_path . $file_name;
if (!is_file($tiffPath)) {
CLI::write(" - skip: file not found ({$tiffPath})", 'yellow');
continue;
}
CLI::write(" - TIFF: {$tiffPath}");
try {
// ✅ TIFF 다중 페이지 안전 처리
$im = new \Imagick();
$im->readImage($tiffPath);
// coalesce: 멀티프레임 안정화(특히 tiff/gif 계열)
$frames = $im->coalesceImages();
$index = 0;
foreach ($frames as $frame) {
try {
// 페이지별 정보
$image_width = (int) $frame->getImageWidth();
$image_height = (int) $frame->getImageHeight();
$image_size = (int) $frame->getImageLength();
// 출력 경로
$jpgName = "{$base}_{$index}.jpg";
$jpgPath = $save_path . $jpgName;
$thumbName = "{$base}_{$index}_thumb.jpg";
$thumbPath = $save_path . $thumbName;
// ✅ JPG로 변환(페이지별로 frame clone 사용 권장)
$page = clone $frame;
// 이미지 포맷/품질(필요시 조정)
$page->setImageFormat('jpeg');
$page->setImageCompression(\Imagick::COMPRESSION_JPEG);
$page->setImageCompressionQuality(85);
// ✅ 리사이즈 (가로 800 제한)
if ($image_width > 800) {
$resize_width = 800;
$ratio = $resize_width / max(1, $image_width);
$resize_height = (int) round($image_height * $ratio);
$page->resizeImage($resize_width, $resize_height, \Imagick::FILTER_LANCZOS, 1, true);
}
if (!$page->writeImage($jpgPath)) {
CLI::write(" - fail: write jpg ({$jpgPath})", 'red');
$page->clear();
$page->destroy();
$index++;
continue;
}
// ✅ QR scan (실패해도 계속)
$qrcode_data = '';
try {
$qrcode_data = (string) $qrCode->scan($jpgPath);
} catch (\Throwable $e) {
log_message('error', 'QR scan failed: ' . $e->getMessage());
}
// ✅ 썸네일은 clone으로 (원본/페이지 훼손 방지)
$thumb = clone $page;
$thumb->thumbnailImage(105, 80, true);
if (!$thumb->writeImage($thumbPath)) {
CLI::write(" - fail: write thumb ({$thumbPath})", 'red');
// 그래도 JPG는 만들어졌으니 다음 진행은 정책에 따라 선택
}
CLI::write(" - JPG: {$jpgPath}");
CLI::write(" - THUMB: {$thumbPath}");
// ✅ DB 저장 (기존 시그니처 유지)
$faxModel->insertFaxImgs(
$mid,
$jpgName,
$save_path,
$thumbName,
$image_width,
$image_height,
$image_size,
$qrcode_data,
$caller_no,
$callee_no,
$tiff_file_name,
$tiffPath,
$tiff_file_size,
$recv_time,
$save_time,
$receiver
);
// ✅ 권한 처리 (에러 숨기지 말고 로그)
if (!@chmod($jpgPath, 0666)) {
log_message('error', "chmod failed: {$jpgPath}");
}
if (!@chmod($thumbPath, 0666)) {
log_message('error', "chmod failed: {$thumbPath}");
}
log_message('debug', $jpgPath);
log_message('debug', $thumbPath);
// ✅ 메모리 정리(프레임 단위)
$thumb->clear();
$thumb->destroy();
$page->clear();
$page->destroy();
} catch (\Throwable $e) {
log_message('error', 'Frame 처리 실패: ' . $e->getMessage());
}
// 다음 페이지
$index++;
}
// ✅ 전체 메모리 정리
$frames->clear();
$frames->destroy();
$im->clear();
$im->destroy();
gc_collect_cycles();
CLI::write(" - done.\n", 'green');
} catch (\Throwable $e) {
// 기존 writeLog 사용 중이면 그걸로 교체 가능
log_message('error', 'TIFF 처리 실패: ' . $e->getMessage());
CLI::write(" - error: " . $e->getMessage(), 'red');
}
}
}
}

View File

@@ -0,0 +1,13 @@
<?php
if (!function_exists('get_linux_hostname')) {
/**
* hostname을 읽어옴... $_SERVER['HOSTNAME']을 대신해서 사용하기 위함.
*/
function get_linux_hostname()
{
preg_match('/HOSTNAME=(.*)/', file_get_contents('/etc/sysconfig/network'), $network);
list($key, $hostname) = explode('=', $network[0]);
return $hostname;
}
}

View File

@@ -245,8 +245,17 @@ if (!function_exists('db_now')) {
function db_now(?string $format = null)
{
if ($format) {
$mysqlFormat = strtr($format, [
'Y' => '%Y', 'y' => '%y',
'm' => '%m', 'n' => '%c',
'd' => '%d', 'j' => '%e',
'H' => '%H', 'h' => '%h',
'i' => '%i', 's' => '%s',
'A' => '%p', 'a' => '%p',
]);
// 포맷이 있으면 DATE_FORMAT(NOW(), '포맷') 형태로 생성
return new \CodeIgniter\Database\RawSql("DATE_FORMAT(NOW(), '$format')");
return new \CodeIgniter\Database\RawSql("DATE_FORMAT(NOW(), '$mysqlFormat')");
}
// 포맷이 없으면 기본 NOW() 반환
return new \CodeIgniter\Database\RawSql('NOW()');
@@ -283,3 +292,27 @@ function checkPasswordTypes(string $password, int $minTypes = 2): bool
return $types >= $minTypes;
}
/**
* 소유자 구분코드 변환
*/
function getOwnerTypeCodeNo($code)
{
switch ($code) {
case "INDIV":
return "0";
break;
case "CORP":
return "1";
break;
case "FRGNR":
return "2";
break;
case "DELEG":
return "3";
break;
default:
return null;
break;
}
}

View File

@@ -33,6 +33,144 @@ class Common
return $pagination;
}
/**
* 워터마킹하기
*/
public function watermarking($imagePath, $watermark_info, $wmText, $cpid, $key = '')
{
$uploader = new MyUpload();
$wmImagePath = ''; // 워터마크 이미지의 경로
$wmSpaceHeihgt = 0; // 워터마크 이미지 하단 공백
$wmFont = ''; // 워터마크 텍스트(글꼴)
$wmFontSize = 13; // 워터마크 텍스트(글꼴) 크기
$wmTextHeight = 17; // 워터마크 텍스트의 높이
$wmTextColor = '#FFFFFF'; // 워터마크 텍스트의 칼라
$wmTextAlpha = 0.5; // 워터마크 텍스트 투명도
try {
$img = new \Imagick();
if (is_string($imagePath) && is_file($imagePath)) {
$img->readImage($imagePath);
} elseif (is_string($imagePath) && filter_var($imagePath, FILTER_VALIDATE_URL)) {
$headers = @get_headers($imagePath, 1) ?: [];
$blob = @file_get_contents($imagePath);
$contentType = '';
if (!empty($headers)) {
$contentType = is_array($headers['Content-Type'] ?? null)
? end($headers['Content-Type'])
: ($headers['Content-Type'] ?? '');
}
log_message('info', '[watermarking] source url={url} status={status} content_type={ctype} size={size}', [
'url' => $imagePath,
'status' => is_array($headers) && isset($headers[0]) ? $headers[0] : '(no status)',
'ctype' => $contentType,
'size' => $blob === false ? 0 : strlen($blob),
]);
if ($blob === false) {
throw new \RuntimeException('Failed to load image from URL');
}
$img->readImageBlob($blob);
} else {
$img->readImageBlob($imagePath);
}
$hImg = $img->getImageHeight();
$wImg = $img->getImageWidth();
foreach ($watermark_info as $watermark) {
if (strtolower($watermark['cpid']) == strtolower($cpid)) {
$img_w_min = intval($watermark['img_width_min']);
$img_w_max = intval($watermark['img_width_max']);
if (($img_w_min <= $wImg) and ($img_w_max >= $wImg)) {
$wmImagePath = $watermark['wm_img_path'];
$wmSpaceHeihgt = $watermark['wm_space'];
$wmFont = $watermark['text_font'];
$wmFontSize = intval($watermark['text_size']);
$wmTextHeight = intval($watermark['text_pixel']);
$wmTextColor = $watermark['text_color'];
$wmTextAlpha = $watermark['text_opacity'] / 100;
break;
}
}
}
if (empty($wmImagePath))
return;
if (substr($wmImagePath, 0, 1) == '/') {
$wmImagePath = substr($wmImagePath, 1);
}
// echo FCPATH.$wmImagePath;
$wm = new \Imagick($wmImagePath);
$hWm = $wm->getImageHeight();
$wWm = $wm->getImageWidth();
$wmImgLeft = floor(($wImg - $wWm) / 2);
$wmImgTop = floor(($hImg - $hWm - $wmSpaceHeihgt - $wmTextHeight) / 2); // 워터마크 이미지의 위치 top
$wmTxtTop = $wmImgTop + $hWm + $wmSpaceHeihgt + ($wmTextHeight * 0.6); // 워터마크 텍스트의 위치
$img->compositeImage($wm, \Imagick::COMPOSITE_OVER, $wmImgLeft, $wmImgTop);
$wm->destroy();
$draw = new \ImagickDraw();
$basePath = defined('BASEPATH') ? BASEPATH : (defined('ROOTPATH') ? ROOTPATH . 'system/' : '');
$wmFont = $basePath . 'fonts/' . $wmFont;
if (is_file($wmFont)) {
$draw->setFont($wmFont);
}
$draw->setFontSize($wmFontSize);
$draw->setFillColor(new \ImagickPixel($wmTextColor));
// $draw->setFillAlpha( $wmTextAlpha );
$draw->setFillOpacity($wmTextAlpha); // 워터마크 텍스트 투명도 설정
$draw->setTextAlignment(2); // center
$draw->setStrokeAntialias(1);
$draw->setStrokeWidth(1);
$draw->setStrokeColor(new \ImagickPixel('#000000'));
// $draw->setStrokeAlpha(0.1);
$draw->setStrokeOpacity(0.1);
$draw->annotation($wImg / 2, $wmTxtTop, $wmText);
$img->drawImage($draw);
$draw->destroy();
// $img->writeImage();
$watermark_img = $img->getImageBlob();
if (empty($key)) {
throw new \RuntimeException('Empty upload key');
}
$ok = $uploader->upload_object_storage_imagick2($key, $watermark_img);
if ($ok) {
log_message('info', '[watermarking] upload success key={key} size={size} cpid={cpid}', [
'key' => $key,
'size' => strlen($watermark_img),
'cpid' => $cpid,
]);
} else {
log_message('error', '[watermarking] upload failed key={key} cpid={cpid}', [
'key' => $key,
'cpid' => $cpid,
]);
}
$img->destroy();
// $object_upload = $this->upload->upload_object_storage($imagePath , $imagePath , 'data');
} catch (\Throwable $e) {
log_message('error', '[watermarking] ' . $e->getMessage());
}
}
/**
* 서버상의 위치를 웹상의 위치로 변경한다...

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Libraries;
class FormValidation
{
/**
* 한글, 영문, 숫자, 대시, 언더바만 가능하게 한다. utf-8 기준.
*
* @param string $str 검증할 문자열
* @param string|null $error 에러 메시지 (참조로 전달)
* @return bool
*/
public function korean_alpha_dash(string $str, ?string &$error = null): bool
{
if (!preg_match('/^[\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}0-9a-zA-Z_-]+$/u', $str)) {
$error = '한글, 영문, 숫자, 대시, 언더바만 입력 가능합니다.';
return false;
}
return true;
}
/**
* 문자열 형식이 Date가 맞는지 확인한다.
*
* @param string $str 검증할 날짜 문자열
* @param string $format 날짜 형식 (기본값: Y-m-d)
* @param string|null $error 에러 메시지 (참조로 전달)
* @return bool
*/
public function is_date(string $str, string $format = 'Y-m-d', ?string &$error = null): bool
{
try {
if (empty($format)) {
$format = 'Y-m-d';
}
$date = strtotime($str);
if ($date === false) {
$error = '올바른 날짜 형식이 아닙니다.';
return false;
}
$strDate = date($format, $date);
if (strcmp($str, $strDate) !== 0) {
$error = "날짜 형식이 {$format}와 일치하지 않습니다.";
return false;
}
} catch (\Exception $e) {
$error = '날짜 검증 중 오류가 발생했습니다.';
return false;
}
return true;
}
}

View File

@@ -2,11 +2,22 @@
namespace App\Libraries;
use App\Models\common\CommonModel;
use App\Models\v2\M712Model;
use CodeIgniter\Model;
class NaverApiClient
{
protected $baseUrl = 'https://test-b2b.land.naver.com';
protected $charger = '';
private $commonModel;
public function __construct()
{
$this->commonModel = new CommonModel();
}
/**
* [GET] 매물 정보 조회
*/
@@ -21,15 +32,408 @@ class NaverApiClient
/**
* [PUT] 매물 정보 수정
* @param string $articleNumber 매물번호
* @param string charger 변경자
* @param array $updateData 수정할 데이터 (tradeType, price, space 등)
* string $tradeType 거래유형 (SALE:매매, JEONSE:전세, MONTHLY_RENT:월세, PRE_SALE:분양)
* boolean $isResidntsExistence 거주여부
* object $address 주소정보 공동 (complexNumber, pyeongTypeNumber, buildingName, hoName, correspondenceFloorCount) 비공동(legalDivisionNumber,jibunAddress,liAddress,etcAddress,referenceAddress,longitude,latitude,correspondenceFloorCount,totalFloorCount,undergroundFloorCount)
* object $price 가격정보 (dealAmount,warrantyAmount,leaseAmount,preSaleAmount,premiumAmount,preSaleOptionAmount)
* object $space 면적정보[비공동] (supplySpace,exclusiveSpace,totalSpace,groundSpace,buildingSpace)
* object $facilities 비공동시설정보 (roomCount)
*/
public function updateArticleInfo(string $articleNumber, array $updateData, string $charger = 'admin'): ?array
{
$this->charger = $charger;
$url = "{$this->baseUrl}/kiso/center/verification-article/{$articleNumber}?charger={$this->charger}";
return $this->request('PUT', $url, $updateData);
}
/**
* [POST] 4.매물검증 결과관리
* API:POST /kiso/center/verification-article/{매물번호}/report?charger={담당자명}
* @param string $articleNumber 매물번호
* @param string charger 변경자
* @param array $reportData 검증결과데이터
* string $reportType 검증결과유형 (검증통과:VERIFIED, 검증실패:FAILED, 최종실패:REJECTED)
* array $verificationConfirms 검증결과목록
* string $ownerBirthDate 소유자 생년월일
* Boolean $isOwnerVerifiable 소유자 검증여부
*/
public function postArticleVerificationReport(string $articleNumber, array $reportData, string $charger = 'admin'): ?array
{
$this->charger = $charger;
$url = "{$this->baseUrl}/kiso/center/verification-article/{$articleNumber}/report?charger={$this->charger}";
return $this->request('POST', $url, $reportData);
}
/**
* [POST] 5.현장확인 정보 전송
* API:POST /kiso/center//verification-article/media/{매물번호}
* @param string $articleNumber 매물번호
* @param array $movies 동영상 ($url)
* @param array $photos 사진 ($fileName, $url)
* @param array photo360s 360사진 ($fileName, $url, $desc)
* @param string $charger 변경자
*/
public function postArticleMediaInfo(string $articleNumber, array $movies, array $photos, array $photo360s, string $charger = 'admin'): ?array
{
$this->charger = $charger;
$url = "{$this->baseUrl}/kiso/center/verification-article/media/{$articleNumber}?charger={$this->charger}";
$data = [
'movies' => $movies,
'photos' => $photos,
'photo360s' => $photo360s
];
return $this->request('POST', $url, $data);
}
/**
* [POST] 6.매물 정보 가격수정
* @param string $articleNumber 매물번호
* @param array $priceData 가격 수정 데이터
* API:PATCH /kiso/center/verification-article/price/{매물번호}?charger={변경자}
* priceType int 가격유형 (DEAL:매매, WARRANTY:보증금, LEASE:월세, PRE_SALE:분양, PREMIUM:프리미엄, PRE_SALE_OPTION:분양옵션)
* dealAmount Int 매매금액
* warrantyAmount Int 보증금
* leaseAmount Int 월세금액
* preSaleAmount Int 분양금액
* premiumAmount Int 프리미엄금액
* preSaleOptionAmount Int 분양옵션금액
*/
public function postArticlePriceUpdate(string $articleNumber, array $priceData, string $charger = 'admin'): ?array
{
$this->charger = $charger;
$url = "{$this->baseUrl}/kiso/center/verification-article/price/{$articleNumber}?charger={$this->charger}";
return $this->request('POST', $url, $priceData);
}
public function submitSyncResult(string $reserveNoList): ?array
{
$url = "{$this->baseUrl}/site/submitSyncResult.nhn";
$url .= '?reserveNoList=' . $reserveNoList;
return $this->request('GET', $url);
}
/**
* 단지상세정보조회
* hscpNo : 단지번호(숫자)
*/
public function aptDetail($hscpNo)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/APTDetail?hscpNo={$hscpNo}";
return $this->request('GET', $url);
}
/**
* 빌라 단지상세정보 조회
* hscpNo : 단지번호(숫자)
*/
public function villaDetail($hscpNo)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/villa/{$hscpNo}";
return $this->request('GET', $url);
}
/**
* 단지목록
* cortarNo : 법정동코드
*/
public function complexList($cortarNo)
{
$url = $this->commonModel->getCompanyInfo(2);
$url = $url['api_server'] . "/common/complexList.nhn?cortarNo={$cortarNo}";
return $this->request('GET', $url);
}
/**
* 평형목록
* rletNo : 단지번호
*/
public function ptpList($rletNo)
{
$url = $this->commonModel->getCompanyInfo(2);
$url = $url['api_server'] . "/common/ptpList.nhn?rletNo={$rletNo}";
return $this->request('GET', $url);
}
/**
* 가격수정
* @param String atclNo 매물번호
* @param integer dealAmt 매매가, 전세(보증금) 단위 : 만원
* @param integer wrrntAmt 전세가(보증금) 단위 : 만원
* @param integer leaseAmt 월세가 단위 : 만원
* @param integer isaleAmt 분양가 단위 : 만원
* @param integer premAmt 프리미엄 단위 : 만원
* @param integer charger 담당자id
*/
public function priceChange($atclNo, $dealAmt, $wrrntAmt, $leaseAmt, $isaleAmt, $premAmt, $charger)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/priceChange";
$postData = [
"atclNo" => $atclNo,
"dealAmt" => $dealAmt,
"wrrntAmt" => $wrrntAmt,
"leaseAmt" => $leaseAmt,
"isaleAmt" => $isaleAmt,
"premAmt" => $premAmt,
"charger" => $charger
];
return $this->request('POST', $url, $postData);
}
/**
* 매물정보수정
* @param String atclNo 매물번호
* @param integer hscpNo 단지번호
* @param integer ptpNo 평형번호
* @param String bildNm 동이름
* @param String rmNo 호수
* @param String tradeType 거래종류(A1,B1,B2 / 변경시 B1 <-> B2만 가능)
* @param integer dealAmt 매매가, 전세(보증금) 단위 : 만원
* @param integer wrrntAmt 전세가(보증금) 단위 : 만원
* @param integer leaseAmt 월세가 단위 : 만원
* @param integer isaleAmt 분양가 단위 : 만원
* @param integer premAmt 프리미엄 단위 : 만원
* @param integer floor 층
* @param integer charger 담당자id
*
* @param String addressCode 주소코드 : 비공동 주택 법정동 코드
* @param String address2 지번주소 : 비공동 주택 지번 주소
* @param String address3 기타주소 : 비공동 주택 기타 주소
* @param float splySpc 공급면적
* @param float exclsSpc 대지면적
* @param float totSpc 전체면적
* @param float grndSpc 대지면적
* @param float bldgSpc 건축면적
*
*/
public function modifyInfo($atclNo, $hscpNo, $ptpNo, $bildNm, $rmNo, $tradeType, $dealAmt, $wrrntAmt, $leaseAmt, $isaleAmt, $premAmt, $floor, $floor2, $charger, $addressCode, $address2, $address2a, $address2b, $address3, $splySpc, $exclsSpc, $totSpc, $grndSpc, $bldgSpc)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/modifyInfo";
// 공통
$postData = [
"atclNo" => $atclNo,
"tradeType" => $tradeType,
"dealAmt" => $dealAmt,
"wrrntAmt" => $wrrntAmt,
"leaseAmt" => $leaseAmt,
"isaleAmt" => $isaleAmt,
"charger" => $charger
];
// 공동주택
$apartData["hscpNo"] = $hscpNo;
$apartData["ptpNo"] = $ptpNo;
$apartData["bildNm"] = $address2; // 네이버에서 보내주는거랑 수정되어 전달하는 거랑 다른 타입임. 2014년 11월 13일 수정
$apartData["rmNo"] = $address3; // 네이버에서 보내주는거랑 수정되어 전달하는 거랑 다른 타입임. 2014년 11월 13일 수정
// $apartData["bildNm"] = $bildNm;
// $apartData["rmNo"] = $rmNo;
$apartData["premAmt"] = $premAmt;
$apartData["floor"] = $floor;
$apartData["floor2"] = $floor2;
// 비공동주택 연동
$detachData["addressCode"] = $addressCode;
$detachData["address2"] = $address2;
$detachData["address2a"] = $address2a;
$detachData["address2b"] = $address2b;
$detachData["address3"] = $address3;
$detachData["splySpc"] = $splySpc;
$detachData["exclsSpc"] = $exclsSpc;
$detachData["totSpc"] = $totSpc;
$detachData["grndSpc"] = $grndSpc;
$detachData["bldgSpc"] = $bldgSpc;
$detachData["floor"] = $floor;
$detachData["floor2"] = $floor2;
if (!empty($hscpNo)) { //공동주택일 때
$postData = array_merge($postData, $apartData);
} else { //비공동주택일 때
$postData = array_merge($postData, $detachData);
}
return $this->request('POST', $url, $postData);
}
/**
* 검증결과 전송
* @param String atclNo 매물번호
* @param boolean success 성공여부
* @param array checkList 확인정보 array('type'=>'T11','code'=>'10000','comment'=>'01|02|03'); 또는 array('type'=>'T11','code'=>'10000','comment'=>'코멘트');
* @param String charger 담당자 사번
* @param array modifyInfo 공동 비공동에 따라 다른 배열을 넘긴다.
* @param String date 상담일시
*/
public function confirm($atclNo, $success, $checkList, $charger, $modifyInfo, $date)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/confirm";
$postData = [
"atclNo" => $atclNo,
"success" => $success,
"checkList" => $checkList,
"charger" => $charger,
"modifyInfo" => $modifyInfo,
"date" => $date,
];
return $this->request('POST', $url, $postData);
}
/**
* 등기부 등본 확인 결과
* @param String atclNo 매물번호
* @param String type 1: 1차 확인(등기부확인) / 2: 2차 확인(최종확인 또는 중개업소 TM)
* @param boolean success 성공여부
* @param array checkList 확인정보
* @param String charger 담당자 사번
* @param String date 상담일시
* @param array modifyInfo 수정정보 - success:true 에서만 허용
*/
public function certification($atclNo, $type, $success, $checkList, $charger, $date, $modifyInfo, $ownerVerifiable)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/certification";
$postData = [
"atclNo" => $atclNo,
"type" => $type,
"success" => $success,
"checkList" => $checkList,
"charger" => $charger,
"date" => $date,
"modifyInfo" => $modifyInfo,
"ownerVerifiable" => $ownerVerifiable
];
return $this->request('POST', $url, $postData);
}
/**
* 등기부 등본 확인 결과
* 712 OwnerVerifiable 전송 오류 우회 테스트
*/
public function certification_712($atclNo, $type, $success, $checkList, $charger, $date, $modifyInfo, $ownerVerifiable)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/confirms/certification";
$model712 = new M712Model();
$data = $model712->getOwnerVerifiable($atclNo);
$ov = $data['OwnerVerifiable_change'];
if (isset($ov)) {
if ($ov > 0) {
$ownerVerifiable = true;
} else {
$ownerVerifiable = false;
}
} else {
$ownerVerifiable = null;
}
$postData = [
"atclNo" => $atclNo,
"type" => $type,
"success" => $success,
"checkList" => $checkList,
"charger" => $charger,
"date" => $date,
"modifyInfo" => $modifyInfo,
"ownerVerifiable" => $ownerVerifiable
];
log_message('debug', '712 certification_712 => ' . $atclNo . ' ::: ' . json_encode($postData) . PHP_EOL);
return $this->request('POST', $url, $postData);
}
/**
* 현장확인 거주인 여부 변경
*/
public function residentsExistence($reserveNumber, $isResidentsExist)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/residents/existence";
$postData = [
'reserveNumber' => $reserveNumber,
'isResidentsExist' => $isResidentsExist
];
return $this->request('POST', $url, $postData);
}
/**
* 예약확인 완료
*/
public function reserveSuccess($reserveNo, $modyfyYn, $agency, $team, $staff, $staffTel, $reserveYmd, $apm)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/site/reserveSuccess.nhn";
$getData = ['reserveNo' => $reserveNo, 'modyfyYn' => $modyfyYn, 'agency' => $agency, 'team' => $team, 'staff' => $staff, 'staffTel' => $staffTel, 'reserveYmd' => $reserveYmd, 'apm' => $apm];
return $this->request('POST', $url, $getData);
}
/**
* 예약확인 실패
*/
public function reserveFail($reserveNo, $errorCode, $etcTxt)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/site/reserveFail.nhn";
$getData = ['reserveNo' => $reserveNo, 'errorCode' => $errorCode, 'errorDesc' => $etcTxt];
return $this->request('POST', $url, $getData);
}
/**
* 촬영 실패
*/
public function shootFail($reserveNo, $errorCode, $etcTxt)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/site/shootFail.nhn";
$getData = ['reserveNo' => $reserveNo, 'errorCode' => $errorCode, 'errorDesc' => $etcTxt];
return $this->request('POST', $url, $getData);
}
/**
* 현장확인2 및 썸네일 검수 실패
*/
public function inspectFail($reserveNumber, $failDescription)
{
$url = $this->commonModel->getCompanyInfo(3);
$url = $url['api_server'] . "/site/vr/inspect/fail";
$postData = [
'reserveNumber' => $reserveNumber,
'failDescription' => $failDescription
];
return $this->request('POST', $url, $postData);
}
/**
* CURL 공통 실행 함수
@@ -72,6 +476,17 @@ class NaverApiClient
'X-Naver-Client-Id: yqBbvQZ123_hjH3b3Df9'
]);
}
} elseif ($method === 'PATCH') {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
if ($data) {
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
'X-Naver-Client-Id: yqBbvQZ123_hjH3b3Df9'
]);
}
}
$response = curl_exec($ch);
@@ -79,7 +494,7 @@ class NaverApiClient
curl_close($ch);
// 결과 로그 기록 (성공/실패 모두 기록하여 추적 가능하게 함)
if ($httpCode === 200 && $httpdCode === 202) {
if ($httpCode === 200 || $httpCode === 202) {
log_message('info', "[Naver API $method SUCCESS] URL: $url | Response: $response");
} else {
log_message('error', "[Naver API $method FAIL] URL: $url | Code: $httpCode | Response: $response");

29
app/Libraries/qrcode.php Normal file
View File

@@ -0,0 +1,29 @@
<?php
class Qrcode
{
public function scan($filename)
{
$data = '';
$file = urldecode($filename);
if (!file_exists($file)) {
return '';
}
$image = new ZBarCodeImage($file);
$scanner = new ZBarCodeScanner();
$barcode = $scanner->scan($image);
if (!empty($barcode)) {
foreach ($barcode as $code) {
$data .= ',' . $code['data'];
}
if (!empty($data))
$data = substr($data, 1);
}
return $data;
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Models\Entities;
use CodeIgniter\Model;
class NaverRawStagingModel extends Model {
protected $table = 'naver_raw_staging';
protected $allowedFields = ['atcl_no', 'verification_type', 'request_type', 'raw_json'];
// 데이터를 넣기 전 자동으로 json_encode 실행
protected $beforeInsert = ['encodeJson'];
protected $beforeUpdate = ['encodeJson'];
protected function encodeJson(array $data) {
if (isset($data['data']['raw_json']) && is_array($data['data']['raw_json'])) {
$data['data']['raw_json'] = json_encode($data['data']['raw_json'], JSON_UNESCAPED_UNICODE);
}
return $data;
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;
@@ -9,6 +9,16 @@ class ReceiptModel extends Model
protected $table = 'receipt';
protected $primaryKey = 'rcpt_sq';
// insert를 위해 이 줄을 추가해 주세요. (제공해주신 스키마 기반 주요 필드)
protected $allowedFields = [
'comp_sq', 'rcpt_rating', 'rcpt_key', 'rcpt_atclno', 'rcpt_type',
'rcpt_product', 'rcpt_product_nm', 'rcpt_product_info1', 'rcpt_product_info2',
'rcpt_product_info3', 'rcpt_office', 'rcpt_agent', 'rcpt_sido', 'rcpt_hscp_nm',
'rcpt_dtl_addr', 'rcpt_etc_addr', 'rcpt_floor', 'rcpt_floor2', 'rcpt_tm',
'rcpt_stat', 'rcpt_x', 'rcpt_y', 'agent_nm', 'agent_head_tel', 'rsrv_date',
'insert_tm', 'rcpt_cpid', 'room_cnt', 'isSiteVRVerification'
];
public function getReceiptList($params, $pageNum = 1, $pageSize = 20, $total = false)
{
$builder = $this->db->table('receipt a');

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Models\Entities;
use CodeIgniter\Model;
class ResultModel extends Model
{
protected $table = 'result';
protected $primaryKey = 'rsrv_sq';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false; // 스키마에 삭제 플래그가 없으므로 false
// insert/update 시 허용할 컬럼 목록
protected $allowedFields = [
'rcpt_sq', 'use_yn', 'dept_sq', 'usr_sq', 'cust_nm',
'cust_zip', 'cust_addr1', 'cust_addr2', 'cust_tel1', 'cust_tel2',
'rsrv_date', 'rsrv_tm_ap', 'rsrv_tm_hour', 'rsrv_tm_min', 'remark',
'req_rec_yn', 'rec_yn', 'rec_tel', 'rec_nm', 'result_cd1',
'result_cd2', 'result_cd3', 'rsrv_save_dt', 'assign_save_dt',
'photo_save_dt', 'result_save_dt', 'insert_tm', 'insert_usr',
'update_tm', 'update_usr', 'result_msg', 'check_cplt_dt',
'check_dt', 'record_cplt_dt', 'request_msg', 'rsrv_cplt_dt',
'rsrv_delay_dt', 'cancel_dt', 'check_delay_dt', 'check_fail_dt',
'resYn', 'dbUsageAgrYn', 'vr_check_cplt_dt'
];
// 날짜 자동 설정 기능 (선택 사항)
// 직접 로직에서 date('Y-m-d H:i:s')를 넣으신다면 false로 두셔도 됩니다.
protected $useTimestamps = false;
/**
* 특정 접수 번호로 결과 정보 조회 (Join 예시)
*/
public function getResultWithReceipt($rcpt_sq)
{
return $this->select('result.*, receipt.rcpt_atclno, receipt.rcpt_product_nm')
->join('receipt', 'receipt.rcpt_sq = result.rcpt_sq')
->where('result.rcpt_sq', $rcpt_sq)
->first();
}
}

View File

@@ -4,7 +4,7 @@ namespace App\Models\Entities;
use CodeIgniter\Model;
class V2ArticleInfoModel extends Model
class V2articleinfoModel extends Model
{
protected $table = 'v2_article_info';
protected $primaryKey = 'vr_sq';

View File

@@ -4,7 +4,7 @@ namespace App\Models\Entities;
use CodeIgniter\Model;
class V2ArticleInfoEtcModel extends Model
class V2articleinfoetcModel extends Model
{
protected $table = 'v2_article_info_etc';
protected $primaryKey = 'vr_sq';

View File

@@ -1,9 +1,9 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;
class V2chgstatModel extends Model
class V2chghistoryModel extends Model
{
protected $table = 'v2_chg_history';
protected $primaryKey = 'seq'; // 실제 PK 컬럼명으로 수정하세요 (st_date, cpid, gbn_cd가 복합키인 경우도 있음)

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;

View File

@@ -0,0 +1,132 @@
<?php
namespace App\Models\Entities;
use CodeIgniter\Model;
/**
* V2ModifyInfoModel
*
* v2_modify_info 테이블 - 수정정보 모델
* 부동산 매물의 수정된 정보를 저장하는 테이블
*/
class V2modifyinfoModel extends Model
{
protected $table = 'v2_modify_info';
protected $primaryKey = 'vr_sq';
protected $useAutoIncrement = false;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = [
'vr_sq',
'bildNo',
'bild_nm',
'rm_no',
'floor',
'floor2',
'ugrodFloor',
'address_code',
'address2',
'address2a',
'address2b',
'address3',
'address4',
'trade_type',
'deal_amt',
'wrrnt_amt',
'lease_amt',
'isale_amt',
'prem_amt',
'sply_spc',
'excls_spc',
'tot_spc',
'grnd_spc',
'bldg_spc',
'hscp_no',
'hscp_nm',
'ptp_no',
'ptp_nm',
'modify_yn',
];
// 검증 규칙
// protected $validationRules = [
// 'vr_sq' => 'required|integer',
// 'bild_nm' => 'string|max_length[60]',
// 'rm_no' => 'string|max_length[30]',
// 'floor' => 'integer',
// 'floor2' => 'integer',
// 'ugrodFloor' => 'integer',
// 'address_code' => 'string|max_length[10]',
// 'address2' => 'string|max_length[300]',
// 'address2a' => 'string|max_length[300]',
// 'address2b' => 'string|max_length[300]',
// 'address3' => 'string|max_length[300]',
// 'address4' => 'string|max_length[1000]',
// 'trade_type' => 'string|max_length[2]',
// 'deal_amt' => 'integer',
// 'wrrnt_amt' => 'integer',
// 'lease_amt' => 'integer',
// 'isale_amt' => 'integer',
// 'prem_amt' => 'integer',
// 'sply_spc' => 'numeric',
// 'excls_spc' => 'numeric',
// 'tot_spc' => 'numeric',
// 'grnd_spc' => 'numeric',
// 'bldg_spc' => 'numeric',
// 'hscp_no' => 'string|max_length[30]',
// 'hscp_nm' => 'string|max_length[60]',
// 'ptp_no' => 'string|max_length[30]',
// 'ptp_nm' => 'string|max_length[60]',
// 'modify_yn' => 'in_list[Y,N]',
// ];
protected $validationMessages = [];
protected $skipValidation = false;
protected $cleanValidationRules = true;
// 콜백
protected $allowCallbacks = true;
protected $beforeInsert = [];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
/**
* 검증요청순번(vr_sq)으로 수정정보 조회
*/
public function getByVrSq(int $vrSq): ?array
{
return $this->find($vrSq);
}
/**
* 수정정보 저장 (없으면 insert, 있으면 update)
* REPLACE INTO 사용으로 효율성 증대
*/
public function saveModifyInfo(int $vrSq, array $data): bool
{
$data['vr_sq'] = $vrSq;
return $this->replace($data);
}
/**
* 수정여부가 Y인 데이터 조회
*/
public function getModifiedInfo(): array
{
return $this->where('modify_yn', 'Y')->findAll();
}
/**
* 특정 검증요청의 수정여부 업데이트
*/
public function updateModifyYn(int $vrSq, string $yn = 'Y'): bool
{
return $this->update($vrSq, ['modify_yn' => $yn]);
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;

View File

@@ -0,0 +1,231 @@
<?php
namespace App\Models\Entities;
use CodeIgniter\Model;
/**
* V2UrlImgSaveModel
*
* v2_url_img_save 테이블 - URL 이미지 저장 관리
* 홍보 및 등기 이미지 URL을 수신하여 저장 상태를 관리하는 테이블
*/
class V2urlimgsaveModel extends Model
{
protected $table = 'v2_url_img_save';
protected $primaryKey = 'pk';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $allowedFields = [
'pk',
'url',
'type',
'atcl_no',
'vr_sq',
'status',
'try_cnt',
'insert_dt',
'server_nm',
];
// 검증 규칙
protected $validationRules = [
'url' => 'string',
'type' => 'in_list[1,2]',
'atcl_no' => 'string|max_length[10]',
'vr_sq' => 'integer',
'status' => 'in_list[save,ing,done,err]',
'try_cnt' => 'integer|less_than_equal_to[3]',
'insert_dt' => 'valid_date',
'server_nm' => 'string|max_length[20]',
];
protected $validationMessages = [];
protected $skipValidation = false;
protected $cleanValidationRules = true;
// 콜백
protected $allowCallbacks = true;
protected $beforeInsert = ['setInsertDate'];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
/**
* 삽입 전 insert_dt 자동 설정
*/
protected function setInsertDate(array $data)
{
if (!isset($data['data']['insert_dt'])) {
$data['data']['insert_dt'] = date('Y-m-d H:i:s');
}
return $data;
}
/**
* 상태별 데이터 조회 (save, ing, done, err)
*/
public function getByStatus(string $status): array
{
return $this->where('status', $status)->findAll();
}
/**
* vr_sq로 데이터 조회
*/
public function getByVrSq(int $vrSq): array
{
return $this->where('vr_sq', $vrSq)->findAll();
}
/**
* type과 vr_sq로 데이터 조회
*/
public function getByTypeAndVrSq(string $type, int $vrSq): array
{
return $this->where('type', $type)
->where('vr_sq', $vrSq)
->findAll();
}
/**
* atcl_no로 데이터 조회
*/
public function getByAtclNo(string $atclNo): array
{
return $this->where('atcl_no', $atclNo)->findAll();
}
/**
* 저장 대기 중인 데이터 조회 (save 상태)
*/
public function getPendingSave(): array
{
return $this->where('status', 'save')
->where('try_cnt <', 3)
->orderBy('insert_dt', 'ASC')
->findAll();
}
/**
* 저장 중인 데이터 조회 (ing 상태)
*/
public function getSaving(): array
{
return $this->where('status', 'ing')->findAll();
}
/**
* 저장 실패 데이터 조회 (err 상태)
*/
public function getErrors(): array
{
return $this->where('status', 'err')->findAll();
}
/**
* 특정 이미지 상태 업데이트
*/
public function updateStatus(int $pk, string $status): bool
{
return $this->update($pk, ['status' => $status]);
}
/**
* 재시도 횟수 증가
*/
public function incrementTryCount(int $pk): bool
{
$current = $this->find($pk);
if (!$current) {
return false;
}
$tryCount = ($current['try_cnt'] ?? 0) + 1;
$status = $tryCount >= 3 ? 'err' : 'save';
return $this->update($pk, [
'try_cnt' => $tryCount,
'status' => $status,
]);
}
/**
* 저장 완료 처리
*/
public function markAsDone(int $pk): bool
{
return $this->update($pk, ['status' => 'done']);
}
/**
* 저장 중 표시
*/
public function markAsProcessing(int $pk): bool
{
return $this->update($pk, ['status' => 'ing']);
}
/**
* 저장 실패 표시
*/
public function markAsError(int $pk): bool
{
return $this->update($pk, ['status' => 'err']);
}
/**
* 특정 vr_sq의 모든 이미지 저장 완료
*/
public function markAllDoneByVrSq(int $vrSq): bool
{
return $this->where('vr_sq', $vrSq)
->set(['status' => 'done'])
->update();
}
/**
* type별 통계
*/
public function getStatisticsByType(int $vrSq): array
{
$result = [
'1' => ['total' => 0, 'done' => 0, 'ing' => 0, 'save' => 0, 'err' => 0],
'2' => ['total' => 0, 'done' => 0, 'ing' => 0, 'save' => 0, 'err' => 0],
];
$records = $this->where('vr_sq', $vrSq)->findAll();
foreach ($records as $record) {
$type = $record['type'];
if (!isset($result[$type])) {
continue;
}
$result[$type]['total']++;
$status = $record['status'];
if (isset($result[$type][$status])) {
$result[$type][$status]++;
}
}
return $result;
}
/**
* 저장할 준비된 데이터 조회 (제한 개수)
*/
public function getNextBatch(int $limit = 10): array
{
return $this->where('status', 'save')
->where('try_cnt <', 3)
->orderBy('insert_dt', 'ASC')
->limit($limit)
->findAll();
}
}

View File

@@ -1,14 +1,50 @@
<?php
namespace App\Models;
namespace App\Models\Entities;
use CodeIgniter\Model;
class VrfcReqModel extends Model {
// Model implementation here
protected $table = 'v2_vrfc_req';
protected $primaryKey = 'vr_sq';
// 기본값 (명시 안 해도 됨)
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $allowedFields = [
'reqSeq',
'atcl_no',
'step',
'cpid',
'cp_atcl_id',
'trade_type',
'realtor_nm',
'realtor_tel_no',
'seller_tel_no',
'vrfc_type',
'rgbk_confirm',
'req_type',
'rdate',
'cpTelNo',
'stat_cd',
'try_cnt',
'insert_user',
'insert_tm',
'memo',
'contact_fail_cnt',
'sync_yn',
'reg_try_cnt',
'tel_fail_cause',
'rgbk_confirm_owner_nm',
'direct_trad_yn',
'confirm_doc_img_url',
'confirm_doc_owner_check_yn',
'owner_verifiable',
'vrfc_cmpl_type',
'rgbk_doc_img_url',
'certRegister',
'referenceFileUrl'
];
// public function insertV2Article(array $articleInfo): bool

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,878 @@
<?php
namespace App\Models\article;
use CodeIgniter\Model;
class GroundCntModel extends Model
{
// 지역 목록 조회
public function getAreaList($sido = '', $gugun = '')
{
if (!empty($gugun)) {
$gugun = substr($gugun, '0', '5');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000'" .
" AND a.region_cd LIKE '%00'" .
" AND a.use_yn = 'Y'" .
" ORDER BY a.region_nm ASC";
$query = $this->db->query($sql, [$gugun]);
} else if (!empty($sido)) {
$chk_sido = substr($sido, '0', '2');
if ($chk_sido === '36') {
$sido = substr($sido, '0', '4');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm " .
"FROM region_codes a " .
"LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,4),'000000') " .
"WHERE a.region_cd LIKE concat(?, '%') " .
"AND a.region_cd NOT LIKE '%000000' " .
"AND a.region_cd LIKE '%00' " .
"AND a.use_yn = 'Y' " .
"AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000')) " .
"ORDER BY a.region_nm ASC";
} else {
$sido = substr($sido, '0', '2');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000000'" .
" AND a.region_cd LIKE '%00000'" .
" AND a.use_yn = 'Y'" .
" AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000'))" .
" ORDER BY a.region_nm ASC";
}
$query = $this->db->query($sql, [$sido]);
} else {
$sql = "SELECT a.region_cd, a.region_nm " .
"FROM region_codes a " .
"WHERE (a.region_cd LIKE '%00000000' " .
"AND a.use_yn = 'Y') " .
"OR region_cd = 3611000000;";
$query = $this->db->query($sql);
}
return $query->getResultArray();
}
// 소속본부조회
public function getBonbuList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE depth = 1" .
" AND use_yn = 'Y'" .
" ORDER BY lft";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 소속팀 조회
public function getTeamList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm" .
" FROM departments" .
" WHERE depth = 2" .
" AND use_yn = 'Y'" .
" ORDER BY dept_nm";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 유저 조회
public function getUserList()
{
$sql = "SELECT
a.usr_sq, a.usr_id, a.usr_nm, a.dept_sq
FROM users a
WHERE
a.usr_level IN ('3','4','40','5','50','6','60','61','62','7','8','70')
AND a.use_yn = 'Y'
AND EXISTS (
SELECT 'x' FROM departments a1 INNER JOIN departments a2 ON a2.lft BETWEEN a1.lft AND a1.rgt AND a2.use_yn = 'Y'
WHERE 1=1 AND a2.dept_sq = a.dept_sq AND a1.use_yn = 'Y'
)
ORDER BY a.usr_level DESC, a.usr_nm ASC ";
$query = $this->db->query($sql);
return $query->getResultArray();
}
/**
* 부서검색(상세)
*/
public function getDeptDetail($dept_sq)
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE dept_sq = ?";
$data = [$dept_sq];
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
/**
* 하위 부서 검색
*/
public function getChildDept($dept)
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE lft >= ?" .
" AND rgt <= ?" .
" ORDER BY lft ASC";
$data = [$dept['lft'], $dept['rgt']];
$query = $this->db->query($sql, $data);
return $query->getResultArray();
}
public function getTotalCount($data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("COUNT(*) AS cnt");
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'left outer');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left outer');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left outer');
$builder->join('result_imgs e', "e.rsrv_sq = b.rsrv_sq AND e.img_type = 'I1' AND e.use_yn = 'Y'", 'left outer');
$builder->join('result_imgs f', "f.rsrv_sq = b.rsrv_sq AND e.img_type = 'I5' AND e.use_yn = 'Y'", 'left outer');
$login_dept_info = $this->getDeptDetail($dept_sq); // 로그인 사용자 소속부서정보
$child_dept = []; // 하위조직 목록
if (strcmp($usr_level, '40') == 0) {
$child = $this->getChildDept($login_dept_info);
if (!empty($child)) {
foreach ($child as $child) {
$child_dept[] = $child['dept_sq'];
}
}
}
if ((int) $usr_level >= 4 && $usr_level != '45') {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
$builder->where('b.use_yn', 'Y');
$builder->where('f.img_path IS NOT NULL', null, false);
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
if ($data['schDateGb'] == '1') {
$builder->where('a.rcpt_tm >=', $data['sdate'] . ' 00:00:00');
$builder->where('a.rcpt_tm <=', $data['edate'] . ' 23:59:59');
} else if ($data['schDateGb'] == '2') {
$builder->where('b.rsrv_date >=', $data['sdate'] . ' 00:00:00');
$builder->where('b.rsrv_date <=', $data['edate'] . ' 23:59:59');
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 거래구분
if (!empty($data['rcpt_product_info1'])) {
$builder->where('a.rcpt_product_info1', $data['rcpt_product_info1']);
}
// 현재상태
if (!empty($data['rcpt_stat1'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat1'], 'after');
}
if (!empty($data['rcpt_stat2'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat2'], 'after');
}
if (!empty($data['rcpt_stat3'])) {
$builder->where('a.rcpt_stat', $data['rcpt_stat3']);
}
// 중개사명
if (!empty($data['agent_nm'])) {
$builder->like('a.agent_nm', $data['agent_nm'], 'both');
}
// 동영상촬영여부
if (!empty($data['exp_movie_yn'])) {
$builder->where('a.exp_movie_yn', $data['exp_movie_yn']);
}
// 홍보확인서여부
if ($data['conf_img_yn'] == 'Y') {
$builder->where('e.rsrv_sq IS NOT NULL', null, false);
} else if ($data['conf_img_yn'] == 'N') {
$builder->where('e.rsrv_sq IS NULL', null, false);
}
// 분양권
if ($data['parcel_out_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['parcel_out_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// CP ID
if (!empty($data['rcpt_cpid'])) {
if (strcmp($data['rcpt_cpid'], 'naver') == 0) {
$builder->where('a.rcpt_cpid =', '');
} else if (strcmp($data['rcpt_cpid'], 'cleancente') == 0) {
$builder->where("a.rcpt_cpid !=", "");
} else {
$builder->where('a.rcpt_cpid', $data['rcpt_cpid']);
}
}
// 매물종류
if (!empty($data['rcpt_product'])) {
$builder->where('a.parcel_out_yn', $data['rcpt_product']);
}
// 면적확인
if ($data['exp_spc_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['exp_spc_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// 체크리스트
if ($data['check_list_img_yn'] == 'Y') {
$builder->where('a.check_list_img_yn', 'Y');
} else if ($data['check_list_img_yn'] == 'N') {
$builder->where('a.check_list_img_yn', 'N');
}
// 평면도유무
if ($data['ground_plan_yn'] == 'Y') {
$builder->where('exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
} else if ($data['ground_plan_yn'] == 'N') {
$builder->where('not exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
}
// 평면도요청
if (!empty($data['ground_plan'])) {
$builder->where('a.ground_plan', $data['ground_plan']);
}
if (!empty($data['srchTxt'])) {
// 중개사
if ($data['srchType'] == '1') {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
// 주소
} else if ($data['srchType'] == '2') {
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
// 사업자번호
} else if ($data['srchType'] == '3') {
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
}
}
}
$row = $builder->get()->getRowArray();
return (int) ($row['cnt'] ?? 0);
}
public function getResultList($start, $end, $data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("a.rcpt_sq
,a.excls_spc
,a.comp_sq
,a.rcpt_floor
,a.rcpt_floor2
,a.rcpt_rating
,a.rcpt_key
,a.rcpt_atclno
,a.rcpt_type
,a.rcpt_product
,a.rcpt_product_nm
,a.rcpt_product_area
,a.rcpt_product_price
,a.rcpt_deal_type
,a.rcpt_product_info1
,a.rcpt_product_info2
,a.rcpt_product_info3
,a.rcpt_product_info4
,a.rcpt_product_info5
,a.rcpt_office
,(CASE WHEN a.rcpt_agent IS NULL THEN 'N' ELSE 'Y' END) as rcpt_agent
,a.rcpt_sido
,a.rcpt_gugun
,a.rcpt_dong
,a.rcpt_bunji
,a.rcpt_ho
,a.rcpt_tm
,a.rcpt_stat
,a.rcpt_x
,a.rcpt_y
,a.rcpt_exps_type
,a.cust_nm
,a.cust_tel1
,a.cust_tel2
,a.rcpt_hscp_nm
,a.cust_zip
,a.cust_addr1
,a.cust_addr2
,a.remark
,a.rcpt_cpid
,a.agent_id
,a.agent_nm
,a.agent_head
,a.agent_head_tel
,a.agent_contact
,a.agent_contact_tel
,a.agent_fax
,DATE_FORMAT(COALESCE(b.rsrv_date, a.rsrv_date), '%Y-%m-%d') AS rsrv_date
,COALESCE(b.rsrv_tm_ap, a.rsrv_tm_ap) as rsrv_tm_ap
,a.insert_usr
,a.insert_tm
,a.update_usr
,a.update_tm
,a.svc_type1
,a.svc_type2
,a.reconf_yn
,b.rsrv_sq
,b.dept_sq
,b.usr_sq
,b.rsrv_tm_hour
,b.result_cd1
,b.result_cd2
,b.result_cd3
,get_code_name('RECEIPT_STATUS1', b.result_cd1) AS result_cd1_nm
,get_code_name('RECEIPT_STATUS2', b.result_cd2) AS result_cd2_nm
,get_code_name('RECEIPT_STATUS3', b.result_cd3) AS result_cd3_nm
,b.result_msg
,b.photo_save_dt
,b.rsrv_delay_dt
,b.rsrv_cplt_dt
,b.check_dt
,b.check_cplt_dt
,get_code_name('RECEIPT_STATUS1', substring(a.rcpt_stat, 1, 2)) AS rcpt_stat_nm
,c.region_nm as addr
,a.rcpt_dtl_addr
,a.rcpt_jibun_addr
,a.rcpt_etc_addr
,d.pdept_sq
,d.dept_nm
,u.usr_nm
,a.rcpt_exps_type
,a.exp_photo_yn
,a.exp_movie_yn
,a.ground_plan
,f.img_path
,f.img_filenm
,f.img_hannm
,f.img_sq
,f.cloud_upload_yn
,( SELECT usr_nm FROM users WHERE users.usr_sq = f.insert_usr ) AS upload_usr_nm
,CASE (SELECT COUNT(1) FROM result_imgs WHERE rsrv_sq=b.rsrv_sq AND img_type = 'I1' AND use_yn = 'Y') WHEN 0 THEN 'N' ELSE 'Y' END conf_img_yn
,CASE (SELECT COUNT(1) FROM result_imgs WHERE rsrv_sq=b.rsrv_sq AND img_type = 'I5' AND use_yn = 'Y') WHEN 0 THEN 'N' ELSE 'Y' END ground_plan_yn");
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'left outer');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left outer');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left outer');
$builder->join('result_imgs e', "e.rsrv_sq = b.rsrv_sq AND e.img_type = 'I1' AND e.use_yn = 'Y'", 'left outer');
$builder->join('result_imgs f', "f.rsrv_sq = b.rsrv_sq AND e.img_type = 'I5' AND e.use_yn = 'Y'", 'left outer');
$login_dept_info = $this->getDeptDetail($dept_sq); // 로그인 사용자 소속부서정보
$child_dept = []; // 하위조직 목록
if (strcmp($usr_level, '40') == 0) {
$child = $this->getChildDept($login_dept_info);
if (!empty($child)) {
foreach ($child as $child) {
$child_dept[] = $child['dept_sq'];
}
}
}
if ((int) $usr_level >= 4 && $usr_level != '45') {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
$builder->where('b.use_yn', 'Y');
$builder->where('f.img_path IS NOT NULL', null, false);
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
if ($data['schDateGb'] == '1') {
$builder->where('a.rcpt_tm >=', $data['sdate'] . ' 00:00:00');
$builder->where('a.rcpt_tm <=', $data['edate'] . ' 23:59:59');
} else if ($data['schDateGb'] == '2') {
$builder->where('b.rsrv_date >=', $data['sdate'] . ' 00:00:00');
$builder->where('b.rsrv_date <=', $data['edate'] . ' 23:59:59');
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 거래구분
if (!empty($data['rcpt_product_info1'])) {
$builder->where('a.rcpt_product_info1', $data['rcpt_product_info1']);
}
// 현재상태
if (!empty($data['rcpt_stat1'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat1'], 'after');
}
if (!empty($data['rcpt_stat2'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat2'], 'after');
}
if (!empty($data['rcpt_stat3'])) {
$builder->where('a.rcpt_stat', $data['rcpt_stat3']);
}
// 중개사명
if (!empty($data['agent_nm'])) {
$builder->like('a.agent_nm', $data['agent_nm'], 'both');
}
// 동영상촬영여부
if (!empty($data['exp_movie_yn'])) {
$builder->where('a.exp_movie_yn', $data['exp_movie_yn']);
}
// 홍보확인서여부
if ($data['conf_img_yn'] == 'Y') {
$builder->where('e.rsrv_sq IS NOT NULL', null, false);
} else if ($data['conf_img_yn'] == 'N') {
$builder->where('e.rsrv_sq IS NULL', null, false);
}
// 분양권
if ($data['parcel_out_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['parcel_out_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// CP ID
if (!empty($data['rcpt_cpid'])) {
if (strcmp($data['rcpt_cpid'], 'naver') == 0) {
$builder->where('a.rcpt_cpid =', '');
} else if (strcmp($data['rcpt_cpid'], 'cleancente') == 0) {
$builder->where("a.rcpt_cpid !=", "");
} else {
$builder->where('a.rcpt_cpid', $data['rcpt_cpid']);
}
}
// 매물종류
if (!empty($data['rcpt_product'])) {
$builder->where('a.parcel_out_yn', $data['rcpt_product']);
}
// 면적확인
if ($data['exp_spc_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['exp_spc_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// 체크리스트
if ($data['check_list_img_yn'] == 'Y') {
$builder->where('a.check_list_img_yn', 'Y');
} else if ($data['check_list_img_yn'] == 'N') {
$builder->where('a.check_list_img_yn', 'N');
}
// 평면도유무
if ($data['ground_plan_yn'] == 'Y') {
$builder->where('exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
} else if ($data['ground_plan_yn'] == 'N') {
$builder->where('not exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
}
// 평면도요청
if (!empty($data['ground_plan'])) {
$builder->where('a.ground_plan', $data['ground_plan']);
}
if (!empty($data['srchTxt'])) {
// 중개사
if ($data['srchType'] == '1') {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
// 주소
} else if ($data['srchType'] == '2') {
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
// 사업자번호
} else if ($data['srchType'] == '3') {
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
}
}
}
$builder->orderBy('a.rcpt_atclno', 'DESC');
$builder->limit($end, $start);
// echo $builder->getCompiledSelect(false);
// log_message('debug', '[getResultList] SQL = ' . $builder->getCompiledSelect());
return $builder->get()->getResultArray();
}
// 엑셀 다운로드
public function getExcelList($data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("get_code_name('RECEIPT_STATUS1', b.result_cd1) AS '현재상태',
a.rcpt_atclno AS '매물ID',
CONCAT(a.rsrv_date, ' ', b.rsrv_tm_ap) AS '예약일자',
CASE WHEN a.rcpt_jibun_addr IS NOT NULL
THEN CONCAT(c.region_nm, ' ', a.rcpt_jibun_addr, ' ', a.rcpt_etc_addr)
ELSE CONCAT(c.region_nm, ' ', a.rcpt_dtl_addr, ' ', a.rcpt_ho)
END AS '주소',
CONCAT(a.rcpt_floor, '/', a.rcpt_floor2) AS '층',
a.excls_spc AS '면적',
IFNULL(a.rcpt_product_nm, a.rcpt_product) AS '매물종류',
d.dept_nm AS '관할조직(팀)',
u.usr_nm '방문담당',
( SELECT usr_nm FROM users WHERE users.usr_sq = f.insert_usr ) AS '등록자명',
CASE (SELECT COUNT(1) FROM result_imgs WHERE rsrv_sq=b.rsrv_sq AND img_type = 'I5' AND use_yn = 'Y') WHEN 0 THEN 'N' ELSE 'Y' END AS '평면도유무',
a.ground_plan AS '평면도요청'");
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'left outer');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left outer');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left outer');
$builder->join('result_imgs e', "e.rsrv_sq = b.rsrv_sq AND e.img_type = 'I1' AND e.use_yn = 'Y'", 'left outer');
$builder->join('result_imgs f', "f.rsrv_sq = b.rsrv_sq AND e.img_type = 'I5' AND e.use_yn = 'Y'", 'left outer');
$login_dept_info = $this->getDeptDetail($dept_sq); // 로그인 사용자 소속부서정보
$child_dept = []; // 하위조직 목록
if (strcmp($usr_level, '40') == 0) {
$child = $this->getChildDept($login_dept_info);
if (!empty($child)) {
foreach ($child as $child) {
$child_dept[] = $child['dept_sq'];
}
}
}
if ((int) $usr_level >= 4 && $usr_level != '45') {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
$builder->where('b.use_yn', 'Y');
$builder->where('f.img_path IS NOT NULL', null, false);
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
if ($data['schDateGb'] == '1') {
$builder->where('a.rcpt_tm >=', $data['sdate'] . ' 00:00:00');
$builder->where('a.rcpt_tm <=', $data['edate'] . ' 23:59:59');
} else if ($data['schDateGb'] == '2') {
$builder->where('b.rsrv_date >=', $data['sdate'] . ' 00:00:00');
$builder->where('b.rsrv_date <=', $data['edate'] . ' 23:59:59');
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 거래구분
if (!empty($data['rcpt_product_info1'])) {
$builder->where('a.rcpt_product_info1', $data['rcpt_product_info1']);
}
// 현재상태
if (!empty($data['rcpt_stat1'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat1'], 'after');
}
if (!empty($data['rcpt_stat2'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat2'], 'after');
}
if (!empty($data['rcpt_stat3'])) {
$builder->where('a.rcpt_stat', $data['rcpt_stat3']);
}
// 중개사명
if (!empty($data['agent_nm'])) {
$builder->like('a.agent_nm', $data['agent_nm'], 'both');
}
// 동영상촬영여부
if (!empty($data['exp_movie_yn'])) {
$builder->where('a.exp_movie_yn', $data['exp_movie_yn']);
}
// 홍보확인서여부
if ($data['conf_img_yn'] == 'Y') {
$builder->where('e.rsrv_sq IS NOT NULL', null, false);
} else if ($data['conf_img_yn'] == 'N') {
$builder->where('e.rsrv_sq IS NULL', null, false);
}
// 분양권
if ($data['parcel_out_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['parcel_out_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// CP ID
if (!empty($data['rcpt_cpid'])) {
if (strcmp($data['rcpt_cpid'], 'naver') == 0) {
$builder->where('a.rcpt_cpid =', '');
} else if (strcmp($data['rcpt_cpid'], 'cleancente') == 0) {
$builder->where("a.rcpt_cpid !=", "");
} else {
$builder->where('a.rcpt_cpid', $data['rcpt_cpid']);
}
}
// 매물종류
if (!empty($data['rcpt_product'])) {
$builder->where('a.parcel_out_yn', $data['rcpt_product']);
}
// 면적확인
if ($data['exp_spc_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['exp_spc_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// 체크리스트
if ($data['check_list_img_yn'] == 'Y') {
$builder->where('a.check_list_img_yn', 'Y');
} else if ($data['check_list_img_yn'] == 'N') {
$builder->where('a.check_list_img_yn', 'N');
}
// 평면도유무
if ($data['ground_plan_yn'] == 'Y') {
$builder->where('exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
} else if ($data['ground_plan_yn'] == 'N') {
$builder->where('not exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
}
// 평면도요청
if (!empty($data['ground_plan'])) {
$builder->where('a.ground_plan', $data['ground_plan']);
}
if (!empty($data['srchTxt'])) {
// 중개사
if ($data['srchType'] == '1') {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
// 주소
} else if ($data['srchType'] == '2') {
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
// 사업자번호
} else if ($data['srchType'] == '3') {
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
}
}
}
$builder->orderBy('a.rcpt_atclno', 'DESC');
// log_message('debug', '[getResultList] SQL = ' . $builder->getCompiledSelect());
return $builder->get()->getResultArray();
}
}

View File

@@ -0,0 +1,286 @@
<?php
namespace App\Models\article;
use CodeIgniter\Model;
class ProcessibleModel extends Model
{
// 지역 목록 조회
public function getAreaList($sido = '', $gugun = '')
{
if (!empty($gugun)) {
$gugun = substr($gugun, '0', '5');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000'" .
" AND a.region_cd LIKE '%00'" .
" AND a.use_yn = 'Y'" .
" ORDER BY a.region_nm ASC";
$query = $this->db->query($sql, [$gugun]);
} else if (!empty($sido)) {
$chk_sido = substr($sido, '0', '2');
if ($chk_sido === '36') {
$sido = substr($sido, '0', '4');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm " .
"FROM region_codes a " .
"LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,4),'000000') " .
"WHERE a.region_cd LIKE concat(?, '%') " .
"AND a.region_cd NOT LIKE '%000000' " .
"AND a.region_cd LIKE '%00' " .
"AND a.use_yn = 'Y' " .
"AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000')) " .
"ORDER BY a.region_nm ASC";
} else {
$sido = substr($sido, '0', '2');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000000'" .
" AND a.region_cd LIKE '%00000'" .
" AND a.use_yn = 'Y'" .
" AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000'))" .
" ORDER BY a.region_nm ASC";
}
$query = $this->db->query($sql, [$sido]);
} else {
$sql = "SELECT a.region_cd, a.region_nm " .
"FROM region_codes a " .
"WHERE (a.region_cd LIKE '%00000000' " .
"AND a.use_yn = 'Y') " .
"OR region_cd = 3611000000;";
$query = $this->db->query($sql);
}
return $query->getResultArray();
}
/**
* 일자별 처리가능 수량
*/
public function getTotal1($data)
{
$sql = "
SELECT
COUNT(*) AS cnt
FROM
(
SELECT
a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week
, sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt
, sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt
, sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt
, case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check
, sum(c.day_cnt) svc_count
FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00'
LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd
WHERE a.sol_date BETWEEN ? AND ?
GROUP BY a.sol_date ASC
) AS a";
$query = $this->db->query($sql, [$data['sdate'], $data['edate']]);
return $query->getRow()->cnt;
}
public function getList1($start, $end, $data)
{
$sql = "SELECT
a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week
, sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt
, sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt
, sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt
, case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check
, sum(c.day_cnt) svc_count
FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00'
LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd
WHERE a.sol_date BETWEEN ? AND ?
GROUP BY a.sol_date ASC ";
$sql .= "LIMIT {$start}, {$end}";
$query = $this->db->query($sql, [$data['sdate'], $data['edate']]);
return $query->getResultArray();
}
/**
* 지역별 수량
*/
public function getTotal2($data)
{
$sql = "SELECT
COUNT(*) AS cnt
FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%')
LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd
JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y'
WHERE a.sol_date = ?
ORDER BY d.region_nm";
$query = $this->db->query($sql, [$data['region'], $data['sdate']]);
return $query->getRow()->cnt;
}
public function getList2($data)
{
$sql = "SELECT
a.sol_date
, b.region_cd, d.region_nm
, c.am_cnt, b.am_cnt default_am_cnt
, c.pm_cnt, b.pm_cnt default_pm_cnt
, c.day_cnt, b.day_cnt default_day_cnt
FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%')
LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd
JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y'
WHERE a.sol_date = ?
ORDER BY d.region_nm";
$query = $this->db->query($sql, [$data['region'], $data['sdate']]);
return $query->getResultArray();
}
/**
* 기본수량
*/
public function getTotal3($data)
{
$sql = "SELECT
COUNT(*) AS cnt
FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a
INNER JOIN region_codes b ON b.region_cd = a.region_cd
LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd
ORDER BY b.region_nm";
$query = $this->db->query($sql, [$data['region']]);
return $query->getRow()->cnt;
}
public function getList3($data)
{
$sql = "SELECT
b.region_cd, b.region_nm, IFNULL(c.am_cnt,0)am_cnt, IFNULL(c.pm_cnt,0) pm_cnt
FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a
INNER JOIN region_codes b ON b.region_cd = a.region_cd
LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd
ORDER BY b.region_nm";
$query = $this->db->query($sql, [$data['region']]);
return $query->getResultArray();
}
// 일자별 수량 엑셀
public function getExcelList($data)
{
$sql = "SELECT
a.sol_date sc_date
, CASE WHEN DATE_FORMAT(a.sol_date, '%w') = 'N' THEN '기본지정' ELSE '별도지정' END AS sc_type
, sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt
, sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt
, sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt
, case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check
, sum(c.day_cnt) svc_count
FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00'
LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd
WHERE a.sol_date BETWEEN ? AND ?
GROUP BY a.sol_date ASC";
$query = $this->db->query($sql, [$data['sdate'], $data['edate']]);
return $query->getResultArray();
}
// 지역별 수량 저장
public function saveArea($data)
{
$this->db->transStart();
$usr_sq = session('usr_sq');
$sql = "INSERT INTO service_count
(sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm)
VALUES
(?, ?, ?, ?, ?, ?, NOW(), ?, NOW())
ON DUPLICATE KEY UPDATE am_cnt=values(am_cnt), pm_cnt=values(pm_cnt), day_cnt=values(day_cnt), update_usr=values(update_usr)
";
$datas = [
$data['sc_date'],
$data['region_cd'],
$data['am_cnt'],
$data['pm_cnt'],
((int) $data['am_cnt'] + (int) $data['pm_cnt']),
$usr_sq,
$usr_sq
];
if ($this->db->query($sql, $datas) === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
$this->db->transComplete();
return [
'success' => true,
];
}
public function saveCount($data)
{
$this->db->transStart();
$usr_sq = session('usr_sq');
$sql = "INSERT INTO service_count
(sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm)
VALUES
(?, ?, ?, ?, ?, ?, NOW(), ?, NOW())
ON DUPLICATE KEY UPDATE am_cnt=values(am_cnt), pm_cnt=values(pm_cnt), day_cnt=values(day_cnt), update_usr=values(update_usr)
";
$datas = [
'0000-00-00',
$data['region_cd'],
$data['am_cnt'],
$data['pm_cnt'],
((int) $data['am_cnt'] + (int) $data['pm_cnt']),
$usr_sq,
$usr_sq
];
if ($this->db->query($sql, $datas) === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
$this->db->transComplete();
return [
'success' => true,
];
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,962 @@
<?php
namespace App\Models\article;
use CodeIgniter\Model;
class RecordModel extends Model
{
// 지역 목록 조회
public function getAreaList($sido = '', $gugun = '')
{
if (!empty($gugun)) {
$gugun = substr($gugun, '0', '5');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000'" .
" AND a.region_cd LIKE '%00'" .
" AND a.use_yn = 'Y'" .
" ORDER BY a.region_nm ASC";
$query = $this->db->query($sql, [$gugun]);
} else if (!empty($sido)) {
$chk_sido = substr($sido, '0', '2');
if ($chk_sido === '36') {
$sido = substr($sido, '0', '4');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm " .
"FROM region_codes a " .
"LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,4),'000000') " .
"WHERE a.region_cd LIKE concat(?, '%') " .
"AND a.region_cd NOT LIKE '%000000' " .
"AND a.region_cd LIKE '%00' " .
"AND a.use_yn = 'Y' " .
"AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000')) " .
"ORDER BY a.region_nm ASC";
} else {
$sido = substr($sido, '0', '2');
$sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" .
" WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000000'" .
" AND a.region_cd LIKE '%00000'" .
" AND a.use_yn = 'Y'" .
" AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000'))" .
" ORDER BY a.region_nm ASC";
}
$query = $this->db->query($sql, [$sido]);
} else {
$sql = "SELECT a.region_cd, a.region_nm " .
"FROM region_codes a " .
"WHERE (a.region_cd LIKE '%00000000' " .
"AND a.use_yn = 'Y') " .
"OR region_cd = 3611000000;";
$query = $this->db->query($sql);
}
return $query->getResultArray();
}
// 소속본부조회
public function getBonbuList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE depth = 1" .
" AND use_yn = 'Y'" .
" ORDER BY lft";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 소속팀 조회
public function getTeamList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm" .
" FROM departments" .
" WHERE depth = 2" .
" AND use_yn = 'Y'" .
" ORDER BY dept_nm";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 유저 조회
public function getUserList()
{
$sql = "SELECT
a.usr_sq, a.usr_id, a.usr_nm, a.dept_sq
FROM users a
WHERE
a.usr_level IN ('3','4','40','5','50','6','60','61','62','7','8','70')
AND a.use_yn = 'Y'
AND EXISTS (
SELECT 'x' FROM departments a1 INNER JOIN departments a2 ON a2.lft BETWEEN a1.lft AND a1.rgt AND a2.use_yn = 'Y'
WHERE 1=1 AND a2.dept_sq = a.dept_sq AND a1.use_yn = 'Y'
)
ORDER BY a.usr_level DESC, a.usr_nm ASC ";
$query = $this->db->query($sql);
return $query->getResultArray();
}
public function getTotalCount($data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("COUNT(*) AS cnt", false);
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'inner');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd', 'inner');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left');
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
if (in_array($usr_level, ['4', '40'])) {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('b.req_rec_yn', 'Y');
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
// 접수기간
if (!empty($data['sdate'])) {
$builder->where('a.insert_tm >=', $data['sdate'] . ' 00:00:00');
}
if (!empty($data['edate'])) {
$builder->where('a.insert_tm <=', $data['edate'] . ' 23:59:59');
}
//
if (!empty($data['photo_sdate'])) {
$builder->where('b.photo_save_dt >=', $data['photo_sdate'] . ' 00:00:00');
}
if (!empty($data['photo_edate'])) {
$builder->where('b.photo_save_dt <=', $data['photo_edate'] . ' 23:59:59');
}
if (!empty($data['record_sdate'])) {
$builder->where('b.record_cplt_dt >=', $data['record_sdate'] . ' 00:00:00');
}
if (!empty($data['record_edate'])) {
$builder->where('b.record_cplt_dt <=', $data['record_edate'] . ' 23:59:59');
}
// 녹취완료여부
if (!empty($data['rec_yn'])) {
if ($data['rec_yn'] == "Y") {
$builder->where('b.rec_yn', $data['rec_yn']);
$builder->whereNotIn('b.result_cd1', [40, 70]);
} else {
$builder->where('b.rec_yn', $data['rec_yn']);
$builder->whereIn('b.result_cd1', [40, 70]);
}
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 검색어
if (!empty($data['srchTxt'])) {
if ($data['srchType'] == "1") {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
} else if ($data['srchType'] == "2") {
$builder->groupStart()
->like('b.rec_nm', $data['srchTxt'])
->groupEnd();
} else if ($data['srchType'] == "3") {
$builder->groupStart()
->like('b.rec_tel', $data['srchTxt'])
->groupEnd();
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->orLike('b.rec_nm', $data['srchTxt'])
->orLike('b.rec_tel', $data['srchTxt'])
->groupEnd();
}
}
}
$row = $builder->get()->getRowArray();
return (int) ($row['cnt'] ?? 0);
}
public function getResultList($start, $end, $data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("a.rcpt_sq
,a.comp_sq
,a.rcpt_rating
,a.rcpt_key
,a.rcpt_atclno
,a.rcpt_type
,a.rcpt_product
,a.rcpt_product_nm
,a.rcpt_product_area
,a.rcpt_product_price
,a.rcpt_product_info1
,a.rcpt_product_info2
,a.rcpt_product_info3
,a.rcpt_product_info4
,a.rcpt_product_info5
,a.rcpt_office
,(CASE WHEN a.rcpt_agent IS NULL THEN 'N' ELSE 'Y' END) as rcpt_agent
,a.rcpt_sido
,a.rcpt_gugun
,a.rcpt_dong
,a.rcpt_hscp_nm
,a.rcpt_floor
,a.rcpt_tm
,a.rcpt_stat
,a.rcpt_x
,a.rcpt_y
,a.cust_nm
,a.cust_tel1
,a.cust_tel2
,a.cust_zip
,a.cust_addr1
,a.cust_addr2
,a.remark
,a.agent_id
,a.agent_nm
,a.agent_head
,a.agent_head_tel
,a.agent_contact
,a.agent_contact_tel
,a.agent_fax
,DATE_FORMAT(COALESCE(b.rsrv_date, a.rsrv_date), '%Y-%m-%d') AS rsrv_date
,COALESCE(b.rsrv_tm_ap, a.rsrv_tm_ap) as rsrv_tm_ap
,a.insert_usr
,a.insert_tm
,a.update_usr
,a.update_tm
,a.svc_type1
,a.svc_type2
,a.reconf_yn
,b.rsrv_sq
,b.dept_sq
,b.usr_sq
,b.req_rec_yn
,b.rec_yn
,b.rsrv_tm_hour
,b.result_cd1
,b.result_cd2
,b.result_cd3
,b.rec_nm
,b.rec_tel
,b.result_msg
,b.photo_save_dt
,b.rsrv_delay_dt
,b.rsrv_cplt_dt
,b.check_dt
,b.check_cplt_dt
,b.record_cplt_dt
,get_code_name('RECEIPT_STATUS1', substring(a.rcpt_stat, 1, 2)) AS rcpt_stat_nm
,c.region_nm as addr
,b.result_save_dt
,u.usr_nm
,d.dept_nm", false);
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'inner');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd', 'inner');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left');
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
if (in_array($usr_level, ['4', '40'])) {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('b.req_rec_yn', 'Y');
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
// 접수기간
if (!empty($data['sdate'])) {
$builder->where('a.insert_tm >=', $data['sdate'] . ' 00:00:00');
}
if (!empty($data['edate'])) {
$builder->where('a.insert_tm <=', $data['edate'] . ' 23:59:59');
}
//
if (!empty($data['photo_sdate'])) {
$builder->where('b.photo_save_dt >=', $data['photo_sdate'] . ' 00:00:00');
}
if (!empty($data['photo_edate'])) {
$builder->where('b.photo_save_dt <=', $data['photo_edate'] . ' 23:59:59');
}
if (!empty($data['record_sdate'])) {
$builder->where('b.record_cplt_dt >=', $data['record_sdate'] . ' 00:00:00');
}
if (!empty($data['record_edate'])) {
$builder->where('b.record_cplt_dt <=', $data['record_edate'] . ' 23:59:59');
}
// 녹취완료여부
if (!empty($data['rec_yn'])) {
if ($data['rec_yn'] == "Y") {
$builder->where('b.rec_yn', $data['rec_yn']);
$builder->whereNotIn('b.result_cd1', [40, 70]);
} else {
$builder->where('b.rec_yn', $data['rec_yn']);
$builder->whereIn('b.result_cd1', [40, 70]);
}
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 검색어
if (!empty($data['srchTxt'])) {
if ($data['srchType'] == "1") {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
} else if ($data['srchType'] == "2") {
$builder->groupStart()
->like('b.rec_nm', $data['srchTxt'])
->groupEnd();
} else if ($data['srchType'] == "3") {
$builder->groupStart()
->like('b.rec_tel', $data['srchTxt'])
->groupEnd();
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->orLike('b.rec_nm', $data['srchTxt'])
->orLike('b.rec_tel', $data['srchTxt'])
->groupEnd();
}
}
}
$builder->orderBy('a.rcpt_atclno DESC');
$builder->limit($end, $start);
$rows = $builder->get()->getResultArray();
return $rows;
}
// 엑셀다운로드
public function getExcelList($data)
{
$usr_sq = session('usr_sq');
$usr_level = session('usr_level');
$dept_sq = session('dept_sq');
$builder = $this->db->table('receipt a');
$builder->select("
get_code_name('RECEIPT_STATUS1', b.result_cd1) AS '현재상태',
CASE WHEN b.result_cd1 = '90' THEN get_code_name('RECEIPT_STATUS2', b.result_cd2) ELSE '' END AS '매물ID',
CASE WHEN b.result_cd1 = '90' THEN get_code_name('RECEIPT_STATUS3', b.result_cd3) ELSE '' END AS '접수(등록)일자',
a.rcpt_atclno AS '예약일자',
a.insert_tm '방문희망시간',
CONCAT(b.rsrv_date, ' ', b.rsrv_tm_ap) AS '촬영완료일자',
b.rsrv_tm_hour AS '중개사명',
b.photo_save_dt AS '대표전화',
'' AS '담당자전화',
a.agent_head_tel AS '연락가능전화',
'' AS '중개사ID',
a.rcpt_cpid 'CP ID',
CASE
WHEN IFNULL(a.rcpt_jibun_addr, '') = '' THEN
CASE
WHEN IFNULL(a.rcpt_hscp_nm, '') = '' THEN
CONCAT(c.region_nm, ' ', a.rcpt_dtl_addr, ' ', a.rcpt_ho)
ELSE
CONCAT(c.region_nm, ' ', a.rcpt_hscp_nm, ' ', a.rcpt_dtl_addr, ' ', a.rcpt_ho)
END
ELSE
CASE
WHEN IFNULL(a.rcpt_li_addr, '') != '' THEN
CONCAT(c.region_nm, ' ', a.rcpt_li_addr, ' ', a.rcpt_jibun_addr, ' ', a.rcpt_etc_addr)
ELSE
CONCAT(c.region_nm, ' ', a.rcpt_jibun_addr, ' ', a.rcpt_etc_addr)
END
END AS '주소',
CONCAT(a.rcpt_floor, '/', a.rcpt_floor2) AS '층',
a.rcpt_product_nm AS '매물종류',
a.rcpt_product_info1 AS '거래구분',
d.dept_nm AS '관할조직(팀)',
u.usr_nm AS '방문담당',
a.rcpt_exps_type AS '노출옵션',
CASE (SELECT COUNT(1) FROM result_imgs WHERE rsrv_sq = b.rsrv_sq AND img_type = 'I1' AND use_yn = 'Y')
WHEN 0 THEN 'N' ELSE 'Y' END AS '홍보확인서',
a.exp_movie_yn AS '동영상촬영',
a.exp_spc_yn AS '면적확인',
b.resYn AS '거주여부',
(CASE (SELECT 'x' FROM result_record WHERE rsrv_sq = b.rsrv_sq AND use_yn = 'Y')
WHEN 'x' THEN 'Y' ELSE 'N' END) AS '녹취여부',
a.excls_spc AS '전용면적',
a.sply_spc AS '공급면적',
a.cupnNo AS '쿠폰번호',
a.image_360_yn AS '360촬영여부',
a.rcpt_y AS '경도',
a.rcpt_y AS '위도',
a.check_list_img_yn AS '체크리스트',
", false);
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'inner');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd', 'inner');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left');
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left');
$login_dept_info = $this->getDeptDetail($dept_sq); // 로그인 사용자 소속부서정보
$child_dept = []; // 하위조직 목록
if (strcmp($usr_level, '40') == 0) {
$child = $this->getChildDept($login_dept_info);
if (!empty($child)) {
foreach ($child as $child) {
$child_dept[] = $child['dept_sq'];
}
}
}
if ((int) $usr_level >= 4 && $usr_level != '45') {
if (!empty($child_dept)) {
$builder->whereIn('b.dept_sq', $child_dept);
} else {
$builder->where('b.usr_sq', $usr_sq);
}
}
$builder->where('a.rcpt_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
if (!empty($data['rcpt_atclno'])) {
$builder->where('a.rcpt_atclno', $data['rcpt_atclno']);
} else {
if ($data['schDateGb'] == '1') {
$builder->where('a.rcpt_tm >=', $data['sdate'] . ' 00:00:00');
$builder->where('a.rcpt_tm <=', $data['edate'] . ' 23:59:59');
} else if ($data['schDateGb'] == '2') {
$builder->where('b.rsrv_date >=', $data['sdate'] . ' 00:00:00');
$builder->where('b.rsrv_date <=', $data['edate'] . ' 23:59:59');
}
// 지역
if (!empty($data['dong'])) {
$builder->where('a.rcpt_dong', $data['dong']);
} else {
if (!empty($data['gugun'])) {
$builder->like('a.rcpt_gugun', substr($data['gugun'], 0, 5), 'after');
} else {
if (!empty($data['sido'])) {
$builder->like('a.rcpt_gugun', substr($data['sido'], 0, 2), 'after');
}
}
}
// 관할조직
if (!empty($data['bonbu'])) {
$builder->where('d.pdept_sq', $data['bonbu']);
}
if (!empty($data['team'])) {
$builder->where('d.dept_sq', $data['team']);
}
if (!empty($data['user'])) {
$builder->where('d.usr_sq', $data['user']);
}
// 거래구분
if (!empty($data['rcpt_product_info1'])) {
$builder->where('a.rcpt_product_info1', $data['rcpt_product_info1']);
}
// 현재상태
if (!empty($data['rcpt_stat1'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat1'], 'after');
}
if (!empty($data['rcpt_stat2'])) {
$builder->like('a.rcpt_stat', $data['rcpt_stat2'], 'after');
}
if (!empty($data['rcpt_stat3'])) {
$builder->where('a.rcpt_stat', $data['rcpt_stat3']);
}
// 중개사명
if (!empty($data['agent_nm'])) {
$builder->like('a.agent_nm', $data['agent_nm'], 'both');
}
// 동영상촬영여부
if (!empty($data['exp_movie_yn'])) {
$builder->where('a.exp_movie_yn', $data['exp_movie_yn']);
}
// 홍보확인서여부
if ($data['conf_img_yn'] == 'Y') {
$builder->where('e.rsrv_sq IS NOT NULL', null, false);
} else if ($data['conf_img_yn'] == 'N') {
$builder->where('e.rsrv_sq IS NULL', null, false);
}
// 분양권
if ($data['parcel_out_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['parcel_out_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// CP ID
if (!empty($data['rcpt_cpid'])) {
if (strcmp($data['rcpt_cpid'], 'naver') == 0) {
$builder->where('a.rcpt_cpid =', '');
} else if (strcmp($data['rcpt_cpid'], 'cleancente') == 0) {
$builder->where("a.rcpt_cpid !=", "");
} else {
$builder->where('a.rcpt_cpid', $data['rcpt_cpid']);
}
}
// 매물종류
if (!empty($data['rcpt_product'])) {
$builder->where('a.parcel_out_yn', $data['rcpt_product']);
}
// 면적확인
if ($data['exp_spc_yn'] == 'Y') {
$builder->where('a.parcel_out_yn', 'Y');
} else if ($data['exp_spc_yn'] == 'N') {
$builder->where('a.parcel_out_yn', 'N');
}
// 체크리스트
if ($data['check_list_img_yn'] == 'Y') {
$builder->where('a.check_list_img_yn', 'Y');
} else if ($data['check_list_img_yn'] == 'N') {
$builder->where('a.check_list_img_yn', 'N');
}
// 평면도유무
if ($data['ground_plan_yn'] == 'Y') {
$builder->where('exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
} else if ($data['ground_plan_yn'] == 'N') {
$builder->where('not exists (select \'x\' from result_imgs imgs where imgs.rsrv_sq = b.rsrv_sq and imgs.img_type = \'I5\' and imgs.use_yn=\'Y\')', NULL, FALSE);
}
// 평면도요청
if (!empty($data['ground_plan'])) {
$builder->where('a.ground_plan', $data['ground_plan']);
}
// 직거래
if ($data['direct_trad_yn'] == "Y") {
$builder->where('a.direct_trad_yn', 'Y');
} else if ($data['direct_trad_yn'] == "N") {
$builder->where('a.direct_trad_yn', 'N');
}
// 360촬영여부
if ($data['image_360_yn'] == "Y") {
$builder->where('a.image_360_yn', 'Y');
} else if ($data['image_360_yn'] == "N") {
$builder->where('a.image_360_yn', 'N');
}
if (!empty($data['srchTxt'])) {
// 중개사
if ($data['srchType'] == '1') {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
// 주소
} else if ($data['srchType'] == '2') {
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
// 사업자번호
} else if ($data['srchType'] == '3') {
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
} else {
$builder->groupStart()
->like('a.agent_nm', $data['srchTxt'])
->orLike('a.sellr_nm', $data['srchTxt'])
->groupEnd();
$builder->groupStart()
->like('a.rcpt_dtl_addr', $data['srchTxt'])
->orLike('a.rcpt_hscp_nm', $data['srchTxt'])
->orLike('a.rcpt_jibun_addr', $data['srchTxt'])
->groupEnd();
$builder->like('a.image_360_yn', $data['srchTxt'], 'both');
}
}
}
$builder->orderBy('a.rcpt_atclno', 'DESC');
return $builder->get()->getResultArray();
}
// 상세
public function getDetail($id)
{
$builder = $this->db->table('receipt a');
$builder->select("
a.rcpt_sq
,a.comp_sq
,a.excls_spc
,a.rcpt_rating
,a.rcpt_key
,a.rcpt_atclno
,a.rcpt_type
,a.rcpt_product
,a.rcpt_product_nm
,a.rcpt_product_area
,a.rcpt_product_price
, a.rcpt_deal_type
,a.rcpt_product_info1
,a.rcpt_product_info2
,a.rcpt_product_info3
,a.rcpt_product_info4
,a.rcpt_product_info5
,a.rcpt_office
,(CASE WHEN a.rcpt_agent IS NULL THEN 'N' ELSE 'Y' END) as rcpt_agent
,a.rcpt_sido
,a.rcpt_gugun
,a.rcpt_dong
,a.rcpt_dtl_addr
,a.rcpt_li_addr
,a.rcpt_jibun_addr
,a.rcpt_etc_addr
,a.rcpt_ref_addr
,a.rcpt_ho
,a.rcpt_hscp_nm
,a.rcpt_floor
,a.rcpt_floor2
,a.chg_floor_yn
,a.rcpt_tm
,a.rcpt_stat
,a.rcpt_x
,a.rcpt_y
,a.rcpt_living_yn
,a.cust_nm
,a.cust_tel1
,a.cust_tel2
,a.cust_zip
,a.cust_addr1
,a.cust_addr2
,a.remark rcpt_remark
, a.rcpt_cpid
,a.agent_id
,a.agent_nm
,a.agent_head
,a.agent_head_tel
,a.agent_contact
,a.agent_contact_tel
,a.agent_fax
,a.agent_tel
,a.excls_spc
,a.excls_spc1
,a.excls_spc2
,a.sply_spc
,a.share_spc
,a.share_spc1
,a.share_spc2
,a.share_spc3
,a.share_spc4
,a.share_spc5
,a.room_cnt
,a.tot_spc
,a.tot_spc1
,a.tot_spc2
,a.grnd_spc
,a.grnd_spc1
,a.grnd_spc2
,a.grnd_spc3
,a.grnd_spc4
,a.grnd_spc5
,a.spc_stat
,a.exp_spc_yn
,DATE_FORMAT(COALESCE(b.rsrv_date, a.rsrv_date), '%Y-%m-%d') AS rsrv_date
,COALESCE(b.rsrv_tm_ap, a.rsrv_tm_ap) as rsrv_tm_ap
,a.insert_usr
,a.insert_tm
,a.update_usr
,a.update_tm
,a.svc_type1
,a.svc_type2
,a.reconf_yn
,a.cupnNo
,b.rsrv_sq
,b.dept_sq
,b.usr_sq
,b.req_rec_yn
,b.rec_yn
,b.rec_tel
,b.rec_nm
,b.remark
,b.rsrv_tm_hour
,b.result_cd1
,get_code_name('RECEIPT_STATUS1', b.result_cd1) AS result_cd1_nm
,b.result_cd2
,get_code_name('RECEIPT_STATUS2', b.result_cd2) AS result_cd2_nm
,b.result_cd3
,get_code_name('RECEIPT_STATUS3', b.result_cd3) AS result_cd3_nm
,b.result_msg
,b.rsrv_save_dt
,b.photo_save_dt
,DATE_FORMAT(b.photo_save_dt, '%Y-%m-%d') as photo_save_dt_dt
,DATE_FORMAT(b.photo_save_dt, '%H:%i:%s') as photo_save_dt_tm
,b.assign_save_dt
,b.result_save_dt
,b.request_msg
,b.rsrv_delay_dt
,DATE_FORMAT(b.rsrv_delay_dt, '%Y-%m-%d') as rsrv_delay_dt_dt
,DATE_FORMAT(b.rsrv_delay_dt, '%H:%i:%s') as rsrv_delay_dt_tm
,b.rsrv_cplt_dt
,DATE_FORMAT(b.rsrv_cplt_dt, '%Y-%m-%d') as rsrv_cplt_dt_dt
,DATE_FORMAT(b.rsrv_cplt_dt, '%H:%i:%s') as rsrv_cplt_dt_tm
,b.check_dt
,DATE_FORMAT(b.check_dt, '%Y-%m-%d') as check_dt_dt
,DATE_FORMAT(b.check_dt, '%H:%i:%s') as check_dt_tm
,b.check_cplt_dt
,DATE_FORMAT(b.check_cplt_dt, '%Y-%m-%d') as check_cplt_dt_dt
,DATE_FORMAT(b.check_cplt_dt, '%H:%i:%s') as check_cplt_dt_tm
,b.cancel_dt
,DATE_FORMAT(b.cancel_dt, '%Y-%m-%d') as cancel_dt_dt
,DATE_FORMAT(b.cancel_dt, '%H:%i:%s') as cancel_dt_tm
,b.check_delay_dt
,DATE_FORMAT(b.check_delay_dt, '%Y-%m-%d') as check_delay_dt_dt
,DATE_FORMAT(b.check_delay_dt, '%H:%i:%s') as check_delay_dt_tm
,b.check_fail_dt
,DATE_FORMAT(b.check_fail_dt, '%Y-%m-%d') as check_fail_dt_dt
,DATE_FORMAT(b.check_fail_dt, '%H:%i:%s') as check_fail_dt_tm
,get_code_name('RECEIPT_STATUS3', a.rcpt_stat) AS rcpt_stat_nm
,DATE_FORMAT(a.insert_tm, '%Y년 %m월 %d일') as insert_tm2
,DATE_FORMAT(a.rsrv_date, '%Y-%m-%d') as rsrv_date2
,c.region_nm as addr
,c.dept_sq as region_dept_sq
,c.usr_sq as region_usr_sq
,d.pdept_sq
,d.dept_nm
,a.rcpt_exps_type
,a.exp_photo_yn
,a.exp_movie_yn
,b.resYn
,DATE_ADD(a.insert_tm, INTERVAL +3 MONTH) as months
,b.dbUsageAgrYn
,a.trade_type
, a.rcpt_hscp_no
, a.rcpt_ptp_nm
, a.rcpt_ptp_no
, a.modify_yn
, a.ground_plan
,a.direct_trad_yn
,a.sellr_nm
,a.sellr_tel_no
,a.virAddr_yn
,a.isSiteVRVerification
,a.isPromotionApply
,DATE_FORMAT(b.vr_check_cplt_dt, '%Y-%m-%d') as vr_check_cplt_dt_dt
,DATE_FORMAT(b.vr_check_cplt_dt, '%H:%i:%s') as vr_check_cplt_dt_dm
", false);
$builder->join('result b', 'b.rcpt_sq = a.rcpt_sq', 'inner');
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd', 'inner');
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left');
$builder->where('a.rcpt_key', $id);
$builder->where('a.insert_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', NULL, FALSE);
return $builder->get()->getRowArray();
}
// 정보변경이력
public function getHistory($id)
{
$sql = "SELECT seq" .
" ,rcpt_sq" .
" ,rcpt_stat" .
" ,get_code_name('RECEIPT_STATUS3', rcpt_stat) AS rcpt_stat_nm" .
" ,rcpt_stat" .
" ,get_code_name('CHANGED_TYPE', changed_type) AS changed_type_nm" .
" ,changed_type" .
" ,changed_id" .
" ,remark" .
" ,DATE_FORMAT(changed_tm, '%Y.%m.%d %H:%i:%s') as changed_tm" .
" FROM changed_history" .
" WHERE rcpt_sq = ?" .
" ORDER BY changed_tm DESC";
$data = [$id];
$query = $this->db->query($sql, $data);
return $query->getResultArray();
}
// 시간대별통계
public function getUsrRsrvDateTmCount($id)
{
$sql = "SELECT b.usr_sq, b.rsrv_date FROM receipt a INNER JOIN result b ON a.rcpt_sq = b.rcpt_sq WHERE a.rcpt_key = ?";
$data = [$id];
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
if (!empty($row['usr_sq'])) {
$sql2 = "SELECT usr_sq, rsrv_tm_ap, rsrv_tm_hour, COUNT(rsrv_tm_hour) as cnt" .
" FROM result" .
" WHERE rsrv_date = ?" .
" AND usr_sq = ?" .
" GROUP BY usr_sq, rsrv_tm_ap, rsrv_tm_hour" .
" ORDER BY rsrv_tm_ap, rsrv_tm_hour";
$data2 = [$row['rsrv_date'], $row['usr_sq']];
} else {
$sql2 = "SELECT usr_sq, rsrv_tm_ap, rsrv_tm_hour, COUNT(rsrv_tm_hour) as cnt" .
" FROM result" .
" WHERE rsrv_date = ?" .
" AND usr_sq = (SELECT b.usr_sq FROM receipt a, region_codes b WHERE a.rcpt_dong = b.region_cd AND a.rcpt_key = ?)" .
" GROUP BY usr_sq, rsrv_tm_ap, rsrv_tm_hour" .
" ORDER BY rsrv_tm_ap, rsrv_tm_hour";
$data2 = [$row['rsrv_date'], $id];
}
$query2 = $this->db->query($sql2, $data2);
return $query2->getResultArray();
}
public function getAptGround($rcpt_dong)
{
$sql = "SELECT ";
$sql .= "* ";
$sql .= "FROM apt_ground ";
$sql .= "WHERE region_cd = ? ";
$data = [$rcpt_dong];
$query = $this->db->query($sql, $data);
return $query->getResultArray();
}
}

View File

@@ -54,4 +54,18 @@ class CodeModel extends Model
}
return $codes;
}
/**
* 코드 상세
*/
public function getCodeDetail($category, $code)
{
$sql = "SELECT category, category_nm, cd, cd_nm FROM codes" .
" WHERE category = ? and cd = ?";
$data = [$category, $code];
$query = $this->db->query($sql, $data);
$row = $query->getResultArray();
return $row;
}
}

View File

@@ -17,4 +17,12 @@ class CommonModel extends Model
return $query->getResultArray();
}
public function getCompanyInfo($compSq)
{
$sql = "SELECT api_server, api_key, comp_nm FROM companies WHERE comp_sq = ?";
$data = [$compSq];
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Models\interest;
use CodeIgniter\Model;
class RatesModel extends Model
{
public function getLists()
{
$builder = $this->db->table("tb_lender AS a");
$builder->select("a.seq
, IFNULL(CASE
WHEN a.bank_type = 'B' THEN (SELECT cd_nm FROM codes WHERE cd = a.bank AND category = 'BANK')
WHEN a.bank_type = 'I' THEN (SELECT cd_nm FROM codes WHERE cd = a.bank AND category = 'INSURANCE') END, a.bank_nm) AS bank
, a.bank_type
, a.product
, a.tel
, a.min_rate
, a.avg_rate
, a.max_rate
, a.chg_yn
, a.split_yn
, b.extra_fee
, b.late_rate
, b.join_method
, b.prepay_fee
, b.loan_limit
, IFNULL(DATE_FORMAT(b.prov_date, '%Y-%m-%d'), '') AS prov_date");
$builder->join("tb_lender_dtl AS b", "b.seq = a.seq", "LEFT");
$builder->where("a.use_yn", "Y");
// $builder->orderBy('a.seq', 'DESC');
return $builder->get()->getResultArray();
}
}

View File

@@ -6,5 +6,48 @@ use CodeIgniter\Model;
class ListFaxModel extends Model
{
public function getTotalCount($data)
{
$sql = "SELECT
COUNT(*) AS cnt
FROM
fax_imgs a
WHERE
a.RECV_TIME >= CONCAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL - 7 DAY), 'Y-m-d'), ' 00:00:00')
AND a.RECV_TIME <= CONCAT(DATE_FORMAT(NOW(), 'Y-m-d'), ' 23:59:59')
AND a.caller_no LIKE CONCAT('%', REPLACE(?, '-', ''), '%')
GROUP BY a.`MID`
";
$query = $this->db->query($sql . [$data['caller_no']]);
$row = $query->getRow();
return $row ? $row->cnt : 0;
}
public function getResultList($start, $end, $data)
{
$sql = "
SELECT
a.fax_sq, a.mid, GROUP_CONCAT(a.file_name) AS file_name, a.file_path, a.CALLER_NO, a.CALLEE_NO, a.RECV_TIME, a.SAVE_TIME, COUNT(a.file_name) AS cnt
FROM
fax_imgs a
WHERE
a.RECV_TIME >= CONCAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL - 7 DAY), 'Y-m-d'), ' 00:00:00')
AND a.RECV_TIME <= CONCAT(DATE_FORMAT(NOW(), 'Y-m-d'), ' 23:59:59')
AND a.caller_no LIKE CONCAT('%', REPLACE(?, '-', ''), '%')
GROUP BY a.`MID`
ORDER BY a.fax_sq DESC, a.RECV_TIME DESC
LIMIT {$start}, {$end}
";
$query = $this->db->query($sql, [$data['caller_no']]);
return $query->getResultArray();
}
}

View File

@@ -146,4 +146,21 @@ class ReceiptModel extends Model
$data = [$imgSq, $faxSq];
$this->db->query($sql, $data);
}
// receipt 에서 지정한 1건만 가져온다.
public function selectReceiptOne($rcpt_sq)
{
$sql = "SELECT a.rcpt_sq,a.comp_sq,a.rcpt_rating,a.rcpt_key,a.rcpt_atclno,a.rcpt_type,a.rcpt_product,a.rcpt_product_nm,a.rcpt_product_area,a.rcpt_product_price,a.rcpt_product_info1,a.rcpt_product_info2,a.rcpt_product_info3,a.rcpt_product_info4,a.rcpt_product_info5,a.rcpt_office,a.rcpt_agent,a.rcpt_sido,a.rcpt_gugun,a.rcpt_dong,a.rcpt_hscp_nm,a.rcpt_dtl_addr,a.rcpt_floor,a.rcpt_bunji,a.rcpt_ho,a.rcpt_tm,a.rcpt_stat,a.rcpt_x,a.rcpt_y,a.rcpt_living_yn,a.cust_nm,a.cust_tel1,a.cust_tel2,a.cust_zip,a.cust_addr1,a.cust_addr2,a.remark,a.agent_id,a.agent_nm,a.agent_head,a.agent_head_tel,a.agent_contact,a.agent_contact_tel,a.agent_fax,a.rsrv_date,a.rsrv_tm_ap,a.insert_usr,a.insert_tm,a.update_usr,a.update_tm,a.svc_type1,a.svc_type2,a.reconf_yn,a.rcpt_exps_type" .
", b.region_nm" .
", c.rsrv_sq" .
" FROM receipt a" .
" LEFT JOIN region_codes b ON b.region_cd = a.rcpt_dong" .
" LEFT JOIN result c on c.rcpt_sq = a.rcpt_sq" .
" WHERE a.rcpt_sq = ?" .
" limit 1";
$data = [$rcpt_sq];
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
}

View File

@@ -102,8 +102,7 @@ class AssignModel extends Model
COUNT(*) AS cnt
FROM result a
INNER JOIN users b ON b.usr_sq = a.usr_sq
INNER JOIN receipt d ON d.rcpt_sq = a.rcpt_sq
INNER JOIN departments c ON c.dept_sq = a.dept_sq
WHERE 1=1 ";
@@ -158,7 +157,7 @@ class AssignModel extends Model
public function getUserList($start, $end, $data)
{
$sql = "SELECT
b.usr_nm, b.usr_id, b.usr_sq, c.dept_sq, c.pdept_sq, c.depth
b.usr_nm, b.usr_id, b.usr_sq
, SUM(CASE WHEN a.rsrv_tm_hour IN ('00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24') THEN 1 ELSE 0 END) TODAY
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '09' THEN 1 ELSE 0 END) AM09
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '10' THEN 1 ELSE 0 END) AM10
@@ -175,8 +174,7 @@ class AssignModel extends Model
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('00','08','09','10','11','12','20','21','22','23','24') THEN 1 ELSE 0 END) PMETC
FROM result a
INNER JOIN users b ON b.usr_sq = a.usr_sq
INNER JOIN receipt d ON d.rcpt_sq = a.rcpt_sq
INNER JOIN departments c ON c.dept_sq = a.dept_sq
WHERE 1=1 ";

View File

@@ -191,6 +191,42 @@ class M415Model extends Model
return $res;
}
// 서류/전화 확인완료 시간 = 등기부등본 확인중 시간
public function getConfTimeForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '35'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 검증완료 시간
public function get_60_ForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '60'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 등기부등본 확인중 시간, 서류에서 등기로 넘어갈때 간혹 서류전화 확인 완료가 안찍히는 건들이 있다
public function get_cert_ing_TimeForHistory($vr_sq)
{
@@ -338,4 +374,228 @@ class M415Model extends Model
);
$this->db->query($sql, $data);
}
//전화확인 - 통화실패 카운트
public function getCallfailForHistory($vr_sq)
{
$sql = "SELECT 'x' from v2_chg_history" .
" WHERE vr_sq = ?" .
" AND chg_type= 'C29'" .
" ORDER BY seq desc" .
" LIMIT 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 서류/전화 인입시간
public function getSaveTimeForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '30'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 등기부등본 확인실패 시간
public function get_cert_failTimeForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '49'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
//등기부등본 확인완료(모바일)
public function insert_v2_time_required_M($atcl_no, $cpid, $vrfc_type, $insert_tm, $cert_comple_dt, $finishTime)
{
if (substr($insert_tm, 0, 10) == substr($cert_comple_dt, 0, 10)) {
if (('12:00:00' < substr($insert_tm, -8)) && (substr($insert_tm, -8) < '13:00:00')) {//접수시간이 12~13시 사이면 13시로 해준다
if ($cert_comple_dt > '13:00:00') { //검증완료가 13시 '이후'에 끝나면 접수시간을 13시로 변경해준다
$insert_tm = date("Y-m-d", time()) . " 13:00:00";
}
} else if (
(substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') && //접수와 확인완료시간이 모두 17:30:00 ~ 09:00:00 사이가 아니면
(substr($cert_comple_dt, -8) < '17:30:00' || substr($cert_comple_dt, -8) < '08:59:59')
) {
$insert_tm = date("Y-m-d", time()) . " 09:00:00";
}
} else {
if (substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') {
$insert_tm = date("Y-m-d", time()) . " 09:00:00";
}
}
$stan_date = substr($insert_tm, 0, 10);
$sql = "INSERT INTO v2_time_required(stan_date, atcl_no, cpid, vrfc_type, insert_tm, cert_comple_dt, cert_required_tm, tot_required_tm)" .
" VALUES(?, ?, ?, ?, ?, ?, TIMEDIFF(?,?), TIMEDIFF(?,?)) " .
" ON DUPLICATE KEY UPDATE insert_tm = VALUES(insert_tm), tel_doc_conf_dt=VALUES(tel_doc_conf_dt),conf_required_tm = VALUES(conf_required_tm),tot_required_tm = VALUES(tot_required_tm) ";
$data = array(
$stan_date,
$atcl_no,
$cpid,
$vrfc_type,
$insert_tm,
$cert_comple_dt,
$cert_comple_dt,
$insert_tm,
$cert_comple_dt,
$insert_tm
);
$this->db->query($sql, $data);
}
//등기부등본 확인완료(불일치)
public function update_v2_time_required_Conf($atcl_no, $cpid, $vrfc_type, $tel_doc_conf_dt, $cert_comple_dt, $sf)
{
if ($sf == 'F') {
if (substr($tel_doc_conf_dt, 0, 10) == substr($cert_comple_dt, 0, 10)) {
if (('12:00:00' < substr($tel_doc_conf_dt, -8)) && (substr($tel_doc_conf_dt, -8) < '13:00:00')) {//전서확인시간이 12~13시 사이면 13시로 해준다
// if (substr($finishTime, -8) > '13:00:00'){ //등본완료가 13시 '이후'에 끝나면 전서확인시간을 13시로 변경해준다
// $tel_doc_conf_dt = date("Y-m-d",time())." 13:00:00";
// }
}
}
}
$sql = "UPDATE v2_time_required " .
" SET cert_comple_dt = ?" .
" ,cert_required_tm = TIMEDIFF(?,?)" .//등본 소요시간 = 등본완료시간-/서확인완료시간
" WHERE atcl_no = ?";
$data = array(
$cert_comple_dt,
$cert_comple_dt,
$tel_doc_conf_dt,
$atcl_no
);
$this->db->query($sql, $data);
// echo $this->db->last_query().'<br>';
}
// 최초! 등기부등본 확인중 시간-모바일용
public function get_cert_M_timeForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '40'" .
" and chg_type= 'C9'" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 등기부등본 확인완료 시간
public function get_cert_confTimeForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '45'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
// 검증실패 시간
public function get_69_ForHistory($vr_sq)
{
$sql = "select insert_tm from v2_chg_history" .
" where vr_sq = ?" .
" and stat_cd = '69'" .
" and chg_type= 'C9'" .
" order by seq desc" .
" limit 1";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
//등기부등본 확인완료(일치/불일치), 검증완료/실패까지 갈때만!
public function update_v2_time_required_Conf_Done($atcl_no, $cpid, $vrfc_type, $tel_doc_conf_dt, $cert_comple_dt)
{
//1.검증소요시간 가져온다
$sql = "SELECT conf_required_tm" .
" FROM v2_time_required" .
" WHERE atcl_no = ?";
$data = array(
$atcl_no
);
$query = $this->db->query($sql, $data);
$res = $query->row_array();
if (substr($tel_doc_conf_dt, 0, 10) == substr($cert_comple_dt, 0, 10)) {
if (('12:00:00' < substr($tel_doc_conf_dt, -8)) && (substr($tel_doc_conf_dt, -8) < '13:00:00')) {//전서확인시간이 12~13시 사이면 13시로 해준다
if (substr($cert_comple_dt, -8) > '13:00:00') { //등본완료가 13시 '이후'에 끝나면 전서확인시간을 13시로 변경해준다
$tel_doc_conf_dt = date("Y-m-d", time()) . " 13:00:00";
}
}
}
//2.등본소요시간, 등본완료시간, 총소요시간을 넣는다
$sql = "UPDATE v2_time_required " .
" SET cert_comple_dt = ?" .
" ,cert_required_tm = TIMEDIFF(?,?)" . //등본 소요시간 = 등본완료시간-전/서확인완료시간
" ,tot_required_tm = ADDTIME(?,TIMEDIFF(?,?))" .//총소요시간 = 검증소요시간+등본소요시간
" WHERE atcl_no = ?";
$data = array(
$cert_comple_dt,
$cert_comple_dt,
$tel_doc_conf_dt,
$res['conf_required_tm'],
$cert_comple_dt,
$tel_doc_conf_dt,
$atcl_no
);
$this->db->query($sql, $data);
}
public function get_rlet_type_cd($vr_sq)
{
$sql = "SELECT rlet_type_cd
FROM v2_article_info
WHERE vr_sq = ?";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
$res = $query->getRowArray();
return $res;
}
}

View File

@@ -1,6 +1,7 @@
<?php
namespace App\Models\v2;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M701Model extends Model
@@ -308,13 +309,13 @@ class M701Model extends Model
b.stat_cd,
c.bild_nm,
b.vrfc_type,
c.rm_no,
IFNULL(c.rm_no, '') as rm_no,
c.floor,
c.address_code,
c.address2,
m.address2a,
m.address2b,
c.address3,
IFNULL(c.address_code, '') as address_code,
IFNULL(c.address2, '') as address2,
IFNULL(m.address2a, '') as address2a,
IFNULL(m.address2b, '') as address2b,
IFNULL(c.address3, '') as address3,
c.trade_type,
c.deal_amt,
c.wrrnt_amt,
@@ -331,7 +332,7 @@ class M701Model extends Model
d.insert_tm as update_res_tm,
greatest(ifnull(d45.insert_tm, ''), ifnull(d49.insert_tm, '')) as rgbk_check_tm,
e.insert_tm as result_tm,
f.region_nm,
IFNULL(f.region_nm, '') as region_nm,
g.cd_nm as pre_stat,
h.cd_nm as vrfc_type,
i.usr_nm,
@@ -747,7 +748,7 @@ class M701Model extends Model
c.bild_nm,
b.vrfc_type as vrfc_type_cd,
b.memo,
c.rm_no,
IFNULL(c.rm_no, '') as rm_no,
c.floor,
c.floor2,
c.address_code,
@@ -887,6 +888,179 @@ class M701Model extends Model
}
// 가격수정
public function changePrice($param)
{
$this->db->transStart();
$usr_id = session('usr_id');
$detail = $this->getDetail($param['rcpt_key']);
if ($param['trade_type'] != 'B2') {
// 월세가 아닐경우에는 월세가에 0으로 ....
$data['lease_amt'] = $param['atcl_amt3'];
}
if (!empty($param['atcl_amt1']))
$data['deal_amt'] = $param['atcl_amt1'];
if (!empty($param['atcl_amt2']))
$data['wrrnt_amt'] = $param['atcl_amt2'];
if (!empty($param['atcl_amt3']))
$data['lease_amt'] = $param['atcl_amt3']; // 월세이고 월세가격이 입력되지 않았으면... 원래 금액으로
if (!empty($param['atcl_amt4']))
$data['deal_amt'] = $param['atcl_amt4'];
if (!empty($param['isale_amt']))
$data['isale_amt'] = $param['isale_amt'];
if (!empty($param['prem_amt']))
$data['prem_amt'] = $param['prem_amt'];
$data['modify_yn'] = 'Y';
$builder = $this->db->table('v2_modify_info');
$ok = $builder->where('vr_sq', $param['rcpt_key'])->update($data);
if ($ok === false) {
return [
'success' => false,
'msg' => '저장 실패',
];
}
$memo = "가격변경 ";
$this->saveHistory($detail['vr_sq'], $detail['pre_stat_cd'], 'C25', $usr_id, $memo);
$this->db->transComplete();
return [
'success' => true,
];
}
// 정보수정
public function modifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2, $atcl_amt4, $isale_amt, $prem_amt)
{
$this->db->transStart();
$usr_id = session('usr_id');
$detail = $this->getDetail($atcl_vr_sq);
if ($trade_type != 'B2') {
// 월세가 아닐경우에는 월세가에 0으로 ....
$atcl_amt3 = '0';
$data['lease_amt'] = $atcl_amt3;
}
if (!empty($trade_type))
$data['trade_type'] = $trade_type;
if (!empty($atcl_hscp_nm))
$data['hscp_nm'] = $atcl_hscp_nm;
if (!empty($atcl_ptp_nm))
$data['ptp_nm'] = $atcl_ptp_nm;
if (!empty($atcl_addr1))
$data['address2'] = $atcl_addr1; // 폐기 예정
if (!empty($atcl_addr1a))
$data['address2a'] = $atcl_addr1a;
if (!empty($atcl_addr1b))
$data['address2b'] = $atcl_addr1b;
if (!empty($atcl_addr2))
$data['address3'] = $atcl_addr2;
if (!empty($atcl_hscp_no))
$data['hscp_no'] = $atcl_hscp_no;
if (!empty($atcl_ptp_no))
$data['ptp_no'] = $atcl_ptp_no;
if (!empty($atcl_amt1))
$data['deal_amt'] = $atcl_amt1;
if (!empty($atcl_amt2))
$data['wrrnt_amt'] = $atcl_amt2;
if (!empty($atcl_amt3))
$data['lease_amt'] = $atcl_amt3; // 월세이고 월세가격이 입력되지 않았으면... 원래 금액으로
if (!empty($atcl_amt4))
$data['deal_amt'] = $atcl_amt4;
if (!empty($isale_amt))
$data['isale_amt'] = $isale_amt;
if (!empty($prem_amt))
$data['prem_amt'] = $prem_amt;
if (!empty($atcl_floor))
$data['floor'] = $atcl_floor;
if (!empty($atcl_floor2))
$data['floor2'] = $atcl_floor2;
$data['modify_yn'] = 'Y';
$builder = $this->db->table('v2_modify_info');
$ok = $builder->where('vr_sq', $atcl_vr_sq)->update($data);
if ($ok === false) {
return [
'success' => false,
'msg' => '저장 실패',
];
}
$last_query = $this->db->getLastQuery();
$current_url = current_url();
$memo = "상세정보수정 ";
$this->saveHistory(vr_sq: $detail['vr_sq'], stat_cd: $detail['pre_stat_cd'], chg_type: 'C25', usr_id: $usr_id, memo: $memo);
$faxModel = new FaxModel();
$faxModel->updateAddress($atcl_vr_sq, $detail['address_code'], $data['address2'], $data['address3'], $data['hscp_no'], $data['hscp_nm']);
$this->db->transComplete();
return [
'success' => true,
];
}
public function saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type)
{
$usr_id = session('usr_id');
$list = $this->get_detail($atcl_vr_sq); //변경된 내용 비교를 위해.
$data['vrfc_type'] = $atcl_vrfc_type;
$this->db->where('vr_sq', $atcl_vr_sq);
$this->db->trans_start();
$this->db->update('v2_vrfc_req', $data);
$data['vrfc_type_cd'] = $atcl_vrfc_type;
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
if (empty($return['error_number'])) {
// 로그를 남긴다.
if ($this->db->affected_rows() > 0) {
// $changed = $this->what_is_changed($list['data'], $data, $atcl_vr_sq);
if (!empty($changed)) {
$this->saveHistory($list['data']['vr_sq'], $list['data']['pre_stat_cd'], 'C25', $usr_id, "상세정보 수정");
}
}
}
$this->db->transComplete();
return $return;
}
public function saveApiErr($err_sq, $err_code, $err_nm, $err_time, $err_no, $err_server = '')
{
$sql = "INSERT INTO err_api (err_sq, err_code, err_nm, err_time, err_no, err_server)" .
" VALUES (?, ?, ?, ?, ?, ?);";
$data = [
$err_sq,
$err_code,
$err_nm,
$err_time,
$err_no,
$err_server
];
$this->db->query($sql, $data);
}
// 상태변경
public function chgArticleStatus($data)
{
@@ -961,6 +1135,601 @@ class M701Model extends Model
];
}
// 현재상태확인
public function chkStat($vr_sq)
{
$sql = "SELECT stat_cd FROM v2_vrfc_req WHERE vr_sq = ?";
$data = [
$vr_sq
];
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function chkTryCnt($vr_sq)
{
$columns = 'a.try_cnt';
$builder = $this->db->table('v2_vrfc_req a');
$builder->select($columns);
$builder->where('vr_sq', $vr_sq);
$query = $builder->get();
return $query->getRowArray();
}
public function chkRegiTryCnt($atcl_vr_sq)
{ //1차 검증인지 2차 검증인지 확인.
$builder = $this->db->table('v2_vrfc_req a');
$builder->select('a.reg_try_cnt');
$builder->where('vr_sq', $atcl_vr_sq);
$query = $builder->get();
return $query->getRowArray();
}
public function chkConfirm($vr_sq, $reg_yn)
{
$columns = "a.vr_sq";
$builder = $this->db->table('v2_confirm a');
$builder->select($columns);
$builder->where('vr_sq', $vr_sq);
if ($reg_yn) {
$builder->where('vrfc_type', $reg_yn); // 등기부등본 정보 확인시
}
$query = $builder->get();
$result = $query->getNumRows();
return $result;
}
public function insertConfirm($vr_sq, $vrfc_type, $success, $type, $usr_id = '', $usr_sq = '')
{
if (empty($usr_sq))
$usr_sq = session('usr_sq');
if (empty($usr_id))
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW()) " .
" ON DUPLICATE KEY UPDATE" .
" success=values(success), charger=values(charger)
, date=values(date), update_user=values(update_user), update_tm=values(update_tm)";
$data = [
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
];
$this->db->query($sql, $data);
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success,
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
}
public function chgRegiTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET reg_try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->getDetail($vr_sq);
$this->db->transStart();
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
vr_sq = VALUES(vr_sq),
stat_cd = VALUES(stat_cd),
insert_user = VALUES(insert_user),
insert_tm = VALUES(insert_tm)";
$data = [
$vr_sq,
$stat_cd,
$usr_sq,
$insert_tm,
];
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '저장 실패',
];
}
$this->saveHistory($list['vr_sq'], $stat_cd, 'C9', $usr_id, '서류확인 정보 변경');
$this->db->transComplete();
return [
'success' => true,
];
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = [
'stat_cd' => $stat_cd,
];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = [
'stat_cd' => $stat_cd,
];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
}
// 파일정보 저장
public function saveFileInfo($file)
{
$this->db->transStart();
$fileType = $file['file_type'] ?? '1';
// 기존 파일 확인
$sql = "SELECT seq FROM v2_files WHERE vr_sq = ? AND use_yn = 'Y' AND file_type = ?";
$query = $this->db->query($sql, [$file['vr_sq'], $fileType]);
$result = $query->getRow();
if (!empty($result)) {
// 기존 파일을 비활성화
$sql = "UPDATE v2_files SET use_yn = 'N' WHERE vr_sq = ? AND file_type = ?";
$this->db->query($sql, [$file['vr_sq'], $fileType]);
}
// 새 파일 정보 INSERT
$data = [
'vr_sq' => $file['vr_sq'],
'use_yn' => 'Y',
'file_type' => $fileType,
'view_odr' => $file['view_odr'] ?? 0,
'file_path' => $file['file_path'],
'file_name' => $file['new_name'],
'file_ext' => $file['ext'],
'file_size' => $file['size'],
'insert_user' => session('usr_sq'),
'insert_tm' => date('Y-m-d H:i:s'),
'cloud_upload_yn' => 'Y',
];
$builder = $this->db->table('v2_files');
$builder->insert($data);
$this->db->transComplete();
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{
if (is_array($comment)) {
$comment = implode('|', $comment);
}
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = [
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
];
$res = $this->db->query($sql, $data);
}
public function chgTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
public function InsResChar($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET reg_charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
/**
* 검증결과 전송 API를 위한 데이터 조회..
*/
public function getDataConfirmAPI($vr_sq)
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm
FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowVrfcReq = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2
FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowArticleInfo = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, address4, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2
FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowModifyInfo = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type
FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $rowVrfcReq['vrfc_type']]);
$rowConfirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT type, code, comment, ownerNm, ownerBirth FROM v2_check_list WHERE vr_sq = ? AND vrfc_type = ? AND type LIKE CONCAT(vrfc_type, '%')";
$query = $this->db->query($sql, [$vr_sq, $rowVrfcReq['vrfc_type']]);
$resCheckList = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
if (!empty($rowConfirm)) {
log_message('debug', implode(', ', $rowConfirm));
}
$atclNo = $rowVrfcReq['atcl_no'] ?? null;
$success = !empty($rowConfirm['success']);
$charger = $rowConfirm['charger'] ?? null;
$date = $rowConfirm['date'] ?? null;
$tryCnt = $rowVrfcReq['try_cnt'] ?? 0;
$checkList = [];
foreach ($resCheckList as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['ownerBirth'],
];
}
$modifyInfo = [];
if (($rowModifyInfo['modify_yn'] ?? 'N') === 'Y') {
if (!empty($rowModifyInfo['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $rowModifyInfo['hscp_no'],
'ptpNo' => $rowModifyInfo['ptp_no'],
'bildNm' => $rowModifyInfo['address2'],
'rmNo' => $rowModifyInfo['address3'],
'tradeType' => $rowModifyInfo['trade_type'],
'dealAmt' => $rowModifyInfo['deal_amt'],
'wrrntAmt' => $rowModifyInfo['wrrnt_amt'],
'leaseAmt' => $rowModifyInfo['lease_amt'],
'isaleAmt' => $rowModifyInfo['isale_amt'],
'premAmt' => $rowModifyInfo['prem_amt'],
'floor' => $rowModifyInfo['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $rowModifyInfo['address_code'],
'address2' => $rowModifyInfo['address2'],
'address3' => $rowModifyInfo['address3'],
'tradeType' => $rowModifyInfo['trade_type'],
'dealAmt' => $rowModifyInfo['deal_amt'],
'wrrntAmt' => $rowModifyInfo['wrrnt_amt'],
'leaseAmt' => $rowModifyInfo['lease_amt'],
'splySpc' => $rowModifyInfo['sply_spc'],
'exclsSpc' => $rowModifyInfo['excls_spc'],
'totSpc' => $rowModifyInfo['tot_spc'],
'grndSpc' => $rowModifyInfo['grnd_spc'],
'bldgSpc' => $rowModifyInfo['bldg_spc'],
'floor' => $rowModifyInfo['floor'],
'floor2' => $rowModifyInfo['floor2'],
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'try_cnt' => $tryCnt,
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'try_cnt' => $tryCnt,
];
}
/* 등기부등본 API 호출*/
/**
* $vrfc_type: 값이 R이면 등기부등본
*/
public function getDatacertAPI($vr_sq, $vrfc_type = '')
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm, reg_try_cnt, owner_verifiable
FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowVrfcReq = $query->getRowArray();
if (!empty($vrfc_type)) {
$rowVrfcReq['vrfc_type'] = $vrfc_type;
}
log_message('debug', (string) $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2
FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowArticleInfo = $query->getRowArray();
log_message('debug', (string) $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2
FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$rowModifyInfo = $query->getRowArray();
log_message('debug', (string) $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type
FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $rowVrfcReq['vrfc_type']]);
$rowConfirm = $query->getRowArray();
log_message('debug', (string) $this->db->getLastQuery());
// 확인정보
$sql = "SELECT a.type, a.code, a.comment, b.ownerNm, b.owner_birth
FROM v2_check_list a
INNER JOIN v2_article_info b ON a.vr_sq = b.vr_sq
WHERE a.vr_sq = ? AND a.vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $rowVrfcReq['vrfc_type']]);
$resCheckList = $query->getResultArray();
log_message('debug', (string) $this->db->getLastQuery());
if (!empty($rowConfirm)) {
log_message('debug', implode(', ', $rowConfirm));
}
$atclNo = $rowVrfcReq['atcl_no'] ?? null;
$type = $rowVrfcReq['try_cnt'] ?? null;
$success = !empty($rowConfirm['success']);
$charger = $rowConfirm['charger'] ?? null;
$date = $rowConfirm['date'] ?? null;
switch ($rowVrfcReq['owner_verifiable'] ?? null) {
case '1':
case 'true':
$ownerVerifiable = true;
break;
default:
$ownerVerifiable = false;
break;
}
$checkList = [];
foreach ($resCheckList as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['owner_birth'],
];
}
$modifyInfo = [];
if (($rowModifyInfo['modify_yn'] ?? 'N') === 'Y') {
if (!empty($rowModifyInfo['hscp_no'])) {
$modifyInfo = [
'hscpNo' => $rowModifyInfo['hscp_no'],
'ptpNo' => $rowModifyInfo['ptp_no'],
'bildNm' => $rowModifyInfo['address2'],
'rmNo' => $rowModifyInfo['address3'],
'tradeType' => $rowModifyInfo['trade_type'],
'dealAmt' => $rowModifyInfo['deal_amt'],
'wrrntAmt' => $rowModifyInfo['wrrnt_amt'],
'leaseAmt' => $rowModifyInfo['lease_amt'],
'isaleAmt' => $rowModifyInfo['isale_amt'],
'premAmt' => $rowModifyInfo['prem_amt'],
'floor' => $rowModifyInfo['floor'],
];
} else {
$modifyInfo = [
'addressCode' => $rowModifyInfo['address_code'],
'address2' => $rowModifyInfo['address2'],
'address3' => $rowModifyInfo['address3'],
'tradeType' => $rowModifyInfo['trade_type'],
'dealAmt' => $rowModifyInfo['deal_amt'],
'wrrntAmt' => $rowModifyInfo['wrrnt_amt'],
'leaseAmt' => $rowModifyInfo['lease_amt'],
'splySpc' => $rowModifyInfo['sply_spc'],
'exclsSpc' => $rowModifyInfo['excls_spc'],
'totSpc' => $rowModifyInfo['tot_spc'],
'grndSpc' => $rowModifyInfo['grnd_spc'],
'bldgSpc' => $rowModifyInfo['bldg_spc'],
'floor' => $rowModifyInfo['floor'],
'floor2' => $rowModifyInfo['floor2'],
];
}
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
];
}
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
];
}
public function InsCharger($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$this->db->query($sql, $data);
}
public function getUpdateFailTime1($vr_sq)
{
$sql = "select vr_sq, stat_cd, insert_user, insert_tm " .
"from v2_chg_stat " .
"where vr_sq = ? and stat_cd = '39' " .
"order by insert_tm desc " .
"limit 1";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
public function getUpdateFailTime2($vr_sq)
{
$sql = "select vr_sq, stat_cd, insert_user, insert_tm " .
"from v2_chg_stat " .
"where vr_sq = ? and stat_cd = '49' " .
"order by insert_tm desc " .
"limit 1";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
public function deleteChkList($vr_sq, $vrfc_type, $type)
{
$sql = "delete from v2_check_list where vr_sq = ? and vrfc_type = ? and type = ?";
$data = array(
$vr_sq,
$vrfc_type,
$type
);
$this->db->query($sql, $data);
}
public function up_tel_fail_cause($vr_sq, $tel_fail_cause)
{
$sql = "UPDATE v2_vrfc_req" .
" SET tel_fail_cause = ? " .
" WHERE vr_sq = ?";
$data = array(
$tel_fail_cause,
$vr_sq
);
$this->db->query($sql, $data);
}
// 변경이력 저장
public function saveHistory($vr_sq, $stat_cd, $chg_type, $usr_id, $memo)

View File

@@ -1,6 +1,7 @@
<?php
namespace App\Models\v2;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M702Model extends Model
@@ -294,13 +295,13 @@ class M702Model extends Model
b.stat_cd,
c.bild_nm,
b.vrfc_type as vrfc_type_cd,
c.rm_no,
IFNULL(c.rm_no, '') as rm_no,
c.floor,
c.address_code,
c.address2,
k.address2a,
k.address2b,
c.address3,
IFNULL(c.address2, '') as address2,
IFNULL(k.address2a, '') as address2a,
IFNULL(k.address2b, '') as address2b,
IFNULL(c.address3, '') as address3,
c.trade_type,
c.deal_amt,
c.wrrnt_amt,
@@ -316,7 +317,7 @@ class M702Model extends Model
c.ptp_no,
d.insert_tm as update_res_tm,
e.insert_tm as result_tm,
f.region_nm,
IFNULL(f.region_nm , '') as region_nm,
g.cd_nm as pre_stat,
h.cd_nm as vrfc_type,
i.usr_nm,
@@ -740,6 +741,78 @@ class M702Model extends Model
];
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{ //상태변경 TABLE INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->getDetail($vr_sq);
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)" .
"VALUES (?, ?, ?, ?)" .
"ON DUPLICATE KEY " .
"UPDATE vr_sq=VALUES(vr_sq), stat_cd=VALUES(stat_cd), insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = array(
'vr_sq' => $vr_sq
,
'stat_cd' => $stat_cd
,
'usr_sq' => $usr_sq
,
'insert_tm' => $insert_tm
);
$this->db->transStart();
$res = $this->db->query($sql, $data);
// echo $this->db->last_query();
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
if (empty($return['error_number'])) {
//로그를 남긴다.
if ($this->db->affected_rows() > 0) {
if (!empty($changed)) {
$this->saveHistory($list['data']['vr_sq'], $stat_cd, 'C9', $usr_id, "등기부등본확인 정보 수정"); //검증결과 변동사항 HISTORY
}
}
}
$this->db->transComplete();
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'] ?? null;
$return['error_message'] = $error['message'] ?? null;
return $return;
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'] ?? null;
$return['error_message'] = $error['message'] ?? null;
return $return;
}
// 상태변경 시각 기록
public function saveV2ChgStat($vr_sq, $stat_cd, $insert_user)
{
@@ -752,6 +825,45 @@ class M702Model extends Model
$this->db->query($sql, [$vr_sq, $stat_cd, $insert_user]);
}
// 파일정보 저장
public function saveFileInfo($file)
{
$this->db->transStart();
$fileType = $file['file_type'] ?? '1';
// 기존 파일 확인
$sql = "SELECT seq FROM v2_files WHERE vr_sq = ? AND use_yn = 'Y' AND file_type = ?";
$query = $this->db->query($sql, [$file['vr_sq'], $fileType]);
$result = $query->getRow();
if (!empty($result)) {
// 기존 파일을 비활성화
$sql = "UPDATE v2_files SET use_yn = 'N' WHERE vr_sq = ? AND file_type = ?";
$this->db->query($sql, [$file['vr_sq'], $fileType]);
}
// 새 파일 정보 INSERT
$data = [
'vr_sq' => $file['vr_sq'],
'use_yn' => 'Y',
'file_type' => $fileType,
'view_odr' => $file['view_odr'] ?? 0,
'file_path' => $file['file_path'],
'file_name' => $file['new_name'],
'file_ext' => $file['ext'],
'file_size' => $file['size'],
'insert_user' => session('usr_sq'),
'insert_tm' => date('Y-m-d H:i:s'),
'cloud_upload_yn' => 'Y',
];
$builder = $this->db->table('v2_files');
$builder->insert($data);
$this->db->transComplete();
}
// 변경이력 저장
public function saveHistory($vr_sq, $stat_cd, $chg_type, $usr_id, $memo)
@@ -925,6 +1037,490 @@ class M702Model extends Model
}
/* 매물정보를 수정 */
//public function saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2){
public function saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2)
{
$usr_id = session('usr_id');
$list = $this->getDetail($atcl_vr_sq);
if ($trade_type !== 'B2') {
$atcl_amt3 = '0';
$data['lease_amt'] = $atcl_amt3;
}
if (!empty($trade_type)) {
$data['trade_type'] = $trade_type;
}
if (!empty($atcl_hscp_nm)) {
$data['hscp_nm'] = $atcl_hscp_nm;
}
if (!empty($atcl_ptp_nm)) {
$data['ptp_nm'] = $atcl_ptp_nm;
}
if (!empty($atcl_addr1)) {
$data['address2'] = $atcl_addr1;
}
if (!empty($atcl_addr1a)) {
$data['address2a'] = $atcl_addr1a;
}
if (!empty($atcl_addr1b)) {
$data['address2b'] = $atcl_addr1b;
}
if (!empty($atcl_addr2)) {
$data['address3'] = $atcl_addr2;
}
if (!empty($atcl_hscp_no)) {
$data['hscp_no'] = $atcl_hscp_no;
}
if (!empty($atcl_ptp_no)) {
$data['ptp_no'] = $atcl_ptp_no;
}
if (!empty($atcl_amt1)) {
$data['deal_amt'] = $atcl_amt1;
}
if (!empty($atcl_amt2)) {
$data['wrrnt_amt'] = $atcl_amt2;
}
if (!empty($atcl_amt3)) {
$data['lease_amt'] = $atcl_amt3;
}
if (!empty($atcl_floor)) {
$data['floor'] = $atcl_floor;
}
if (!empty($atcl_floor2)) {
$data['floor2'] = $atcl_floor2;
}
$data['modify_yn'] = 'Y';
$this->db->transStart();
$builder = $this->db->table('v2_modify_info');
$builder->where('vr_sq', $atcl_vr_sq);
$builder->update($data);
$lastQuery = (string) $this->db->getLastQuery();
$currentUrl = current_url();
log_message('debug', "{$currentUrl} :: {$lastQuery}");
$data['trade_type_cd'] = $trade_type;
$error = $this->db->error();
$return['error_number'] = $error['code'] ?? null;
$return['error_message'] = $error['message'] ?? null;
if (empty($return['error_number'])) {
if ($this->db->affectedRows() > 0) {
if (!empty($changed)) {
$this->saveHistory($list['data']['vr_sq'], $list['data']['pre_stat_cd'], 'C25', $usr_id, '매물정보 수정');
}
}
}
$this->db->transComplete();
$faxModel = new FaxModel();
$faxModel->updateAddress($atcl_vr_sq, $list['data']['address_code'], $data['address2'], $data['address3'], $data['hscp_no'], $data['hscp_nm']);
return $return;
}
public function saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type)
{
$usr_id = session('usr_id');
$list = $this->getDetail($atcl_vr_sq);
$data = [
'vrfc_type' => $atcl_vrfc_type,
];
$this->db->transStart();
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $atcl_vr_sq);
$builder->update($data);
$data['vrfc_type_cd'] = $atcl_vrfc_type;
$error = $this->db->error();
$return['error_number'] = $error['code'] ?? null;
$return['error_message'] = $error['message'] ?? null;
if (empty($return['error_number'])) {
if ($this->db->affectedRows() > 0) {
if (!empty($changed)) {
$this->saveHistory($list['data']['vr_sq'], $list['data']['pre_stat_cd'], 'C25', $usr_id, '매물정보 저장');
}
}
}
$this->db->transComplete();
return $return;
}
// 현재상태확인
public function chkStat($vr_sq)
{
$sql = "SELECT stat_cd FROM v2_vrfc_req WHERE vr_sq = ?";
$data = [
$vr_sq
];
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function InsResChar($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET reg_charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function chkRegiTryCnt($atcl_vr_sq)
{
$builder = $this->db->table('v2_vrfc_req a');
$builder->select('a.reg_try_cnt');
$builder->where('vr_sq', $atcl_vr_sq);
$query = $builder->get();
return $query->getRowArray();
}
public function chkConfirm($atcl_vr_sq, $reg_yn)
{ //검증결과 table에 있는지 확인.
$builder = $this->db->table('v2_confirm a');
$builder->select('a.vr_sq');
$builder->where('a.vr_sq', $atcl_vr_sq);
if (!empty($reg_yn)) {
$builder->where('a.vrfc_type', $reg_yn); // 등기부등본 정보 확인시
}
return $builder->get()->getNumRows();
}
public function insertConfirm($vr_sq, $vrfc_type, $success, $type)
{ //v2_confirm INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW())";
$data = array(
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
);
$this->db->query($sql, $data);
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success,
'update_user' => session('usr_sq'),
'update_tm' => date('Y-m-d H:i:s')
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'] ?? null;
$return['error_message'] = $error['message'] ?? null;
return $return;
}
public function saveApiErr($err_sq, $err_code, $err_nm, $err_time, $err_no, $err_server = '')
{
$sql = "INSERT INTO err_api (err_sq, err_code, err_nm, err_time, err_no, err_server)" .
" VALUES (?, ?, ?, ?, ?, ?);";
$data = array(
$err_sq,
$err_code,
$err_nm,
$err_time,
$err_no,
$err_server
);
$res = $this->db->query($sql, $data);
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{ //v2_check_list INSERT
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
);
$res = $this->db->query($sql, $data);
}
/* 등기부등본 API 호출*/
public function getDatacertAPI($vr_sq, $vrfc_type = '')
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm, owner_verifiable" .
" FROM v2_vrfc_req where vr_sq = ?";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row_vrfc_req = $query->getRowArray();
if (!empty($vrfc_type)) {
$row_vrfc_req['vrfc_type'] = $vrfc_type;
}
log_message('debug', $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2" .
" FROM v2_article_info where vr_sq = ?";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row_article_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2" .
" FROM v2_modify_info where vr_sq = ?";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm where vr_sq = ? and vrfc_type = ?";
$data = array($vr_sq, $row_vrfc_req['vrfc_type']);
$query = $this->db->query($sql, $data);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT a.type, a.code, a.comment, b.ownerNm, b.owner_birth" .
" FROM v2_check_list a " .
" INNER JOIN v2_article_info b on a.vr_sq = b.vr_sq" .
" WHERE a.vr_sq = ? and a.vrfc_type = ?";
// " FROM v2_check_list where vr_sq = ? and vrfc_type = ? and type like concat(vrfc_type, '%')";
$data = array($vr_sq, $row_vrfc_req['vrfc_type']);
$query = $this->db->query($sql, $data);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm));
$atclNo = $row_vrfc_req['atcl_no'];
$type = $row_vrfc_req['try_cnt'];
$success = empty($row_confirm['success']) ? FALSE : TRUE;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
if ($row_vrfc_req['owner_verifiable'] == 'false') {
$ownerVerifiable = FALSE;
} else {
$ownerVerifiable = TRUE;
}
$checkList = array();
foreach ($res_check_list as $row) {
$checkList[] = array(
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['owner_birth'],
);
}
$modifyInfo = array();
if ($row_modify_info['modify_yn'] == 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = array(
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
);
} else {
// 비공동주택
$modifyInfo = array(
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
);
}
return array(
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
);
} else {
return array(
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
);
}
}
public function chgRegiTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET reg_try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$res = $this->db->query($sql, $data);
}
public function InsCharger($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function chkTryCnt($atcl_vr_sq)
{
$builder = $this->db->table('v2_vrfc_req a');
$builder->select('a.try_cnt');
$builder->where('a.vr_sq', $atcl_vr_sq);
$query = $builder->get();
return $query->getRowArray();
}
public function saveMemo($data)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_vrfc_req SET
memo = ?
WHERE vr_sq = ?
";
if ($this->db->query($sql, [$data['memo'], $data['vr_sq']]) === false) {
return [
'success' => false,
'msg' => '저장 실패',
];
}
$detail = $this->getDetail($data['vr_sq']);
$memo = "메모변경 : " . $detail['memo'] . " => " . $data['memo'];
$this->saveHistory($data['vr_sq'], $data['pre_stat_cd'], 'C19', $usr_id, $memo);
return [
'success' => true,
];
}
public function chgTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
// 변경이력 조회
public function getHistory($vr_sq)
{

View File

@@ -2,6 +2,7 @@
namespace App\Models\v2;
use App\Models\receipt\ReceiptModel;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M703Model extends Model
@@ -1504,8 +1505,9 @@ class M703Model extends Model
$this->saveChangedHistory($vr_sq, '35', 'C9', $insert_id, '현장확인 매물');
$fax = $this->fax_model->selectFax($fax_sq); // fax 이미지 파일 가져오기
$receipt = $this->receipt_model->selectReceiptOne($vr_sq); // 매물정보 가져오기
$faxModel = new FaxModel();
$fax = $faxModel->selectFax($fax_sq); // fax 이미지 파일 가져오기
$receipt = $this->selectReceiptOne($vr_sq); // 매물정보 가져오기
// 40: 촬영, 70: 검수지연... 상태가 촬용 이전 또는 검수지연 상태일 경우에만 홍보확인서를 등록한다.
if (substr($receipt['rcpt_stat'], 0, 2) <= '40' || substr($receipt['rcpt_stat'], 0, 2) == '70') {
@@ -2115,8 +2117,8 @@ class M703Model extends Model
*/
public function saveChangeStep($fax_sq, $vr_sq, $stat_cd)
{
$insert_user = $this->session->userdata('usr_sq');
$insert_id = $this->session->userdata('usr_id');
$insert_user = session('usr_sq');
$insert_id = session('usr_id');
$this->db->transStart();

View File

@@ -1,6 +1,7 @@
<?php
namespace App\Models\v2;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M704Model extends Model
@@ -787,6 +788,149 @@ class M704Model extends Model
return $query->getRowArray();
}
/* 매물정보를 수정 */
//public function saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2, $atcl_amt4, $isale_amt, $prem_amt){
public function saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2, $atcl_amt4, $isale_amt, $prem_amt)
{
$usr_id = session('usr_id');
$list = $this->getDetail($atcl_vr_sq); // 변경된 내용 비교를 위해.
if ($trade_type != 'B2') {
// 월세가 아닐경우에는 월세가에 0으로 ....
$atcl_amt3 = '0';
$data['lease_amt'] = $atcl_amt3;
}
$data = [];
if (!empty($trade_type))
$data['trade_type'] = $trade_type;
if (!empty($atcl_hscp_nm))
$data['hscp_nm'] = $atcl_hscp_nm;
if (!empty($atcl_ptp_nm))
$data['ptp_nm'] = $atcl_ptp_nm;
if (!empty($atcl_addr1))
$data['address2'] = $atcl_addr1; // 폐기 예정
if (!empty($atcl_addr1a))
$data['address2a'] = $atcl_addr1a;
if (!empty($atcl_addr1b))
$data['address2b'] = $atcl_addr1b;
if (!empty($atcl_addr2))
$data['address3'] = $atcl_addr2;
if (!empty($atcl_hscp_no))
$data['hscp_no'] = $atcl_hscp_no;
if (!empty($atcl_ptp_no))
$data['ptp_no'] = $atcl_ptp_no;
if (!empty($atcl_amt1))
$data['deal_amt'] = $atcl_amt1;
if (!empty($atcl_amt2))
$data['wrrnt_amt'] = $atcl_amt2;
if (!empty($atcl_amt3))
$data['lease_amt'] = $atcl_amt3;
if (!empty($atcl_amt4))
$data['deal_amt'] = $atcl_amt4;
if (!empty($isale_amt))
$data['isale_amt'] = $isale_amt;
if (!empty($prem_amt))
$data['prem_amt'] = $prem_amt;
if (!empty($atcl_floor))
$data['floor'] = $atcl_floor;
if (!empty($atcl_floor2))
$data['floor2'] = $atcl_floor2;
$data['modify_yn'] = 'Y';
$this->db->transStart();
$builder = $this->db->table('v2_modify_info');
$builder->where('vr_sq', $atcl_vr_sq);
$builder->update($data);
$last_query = $this->db->getLastQuery();
$current_url = current_url();
log_message('debug', "{$current_url} :: {$last_query}");
$data['trade_type_cd'] = $trade_type;
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
if (empty($return['error_number'])) {
// 로그를 남긴다.
if ($this->db->affectedRows() > 0) {
$changed = $this->whatIsChanged($list, $data, $atcl_vr_sq);
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $list['pre_stat_cd'], 'C25', $usr_id, $changed);
}
}
}
$this->db->transComplete();
// 홍보확인서인 경우 주소 변경시 FAX 이미지의 정보도 함께 변경한다.
$faxModel = new FaxModel();
$faxModel->updateAddress($atcl_vr_sq, $list['address_code'], $data['address2'] ?? '', $data['address3'] ?? '', $data['hscp_no'] ?? '', $data['hscp_nm'] ?? '');
return $return;
}
public function saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type)
{
$usr_id = session('usr_id');
$list = $this->getDetail($atcl_vr_sq); // 변경된 내용 비교를 위해.
$data = [];
$data['vrfc_type'] = $atcl_vrfc_type;
$this->db->transStart();
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $atcl_vr_sq);
$builder->update($data);
$last_query = $this->db->getLastQuery();
$current_url = current_url();
log_message('debug', "{$current_url} :: {$last_query}");
$data['vrfc_type_cd'] = $atcl_vrfc_type;
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
if (empty($return['error_number'])) {
// 로그를 남긁다.
if ($this->db->affectedRows() > 0) {
$changed = $this->whatIsChanged($list, $data, $atcl_vr_sq);
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $list['pre_stat_cd'], 'C25', $usr_id, $changed);
}
}
}
$this->db->transComplete();
return $return;
}
public function saveApiErr($err_sq, $err_code, $err_nm, $err_time, $err_no, $err_server = '')
{
$sql = "INSERT INTO err_api (err_sq, err_code, err_nm, err_time, err_no, err_server)" .
" VALUES (?, ?, ?, ?, ?, ?);";
$data = array(
$err_sq,
$err_code,
$err_nm,
$err_time,
$err_no,
$err_server
);
$this->db->query($sql, $data);
}
// 메모조회
public function getMemo($vr_sq)
{
@@ -971,6 +1115,30 @@ class M704Model extends Model
];
}
// 전화실패
public function saveContactFail($vr_sq)
{
$usr_id = session('usr_id');
$sql = "update v2_vrfc_req set contact_fail_cnt = ifnull(contact_fail_cnt, 0) +1 where vr_sq = ?";
$data = array($vr_sq);
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '통화실패 처리중 오류가 발생했습니다.',
];
}
$row = $this->getDetail($vr_sq);
$this->saveChangedHistory($vr_sq, $row['data']['stat_cd'], 'C29', $usr_id, '통화실패');
return [
'success' => true
];
}
// 다음 전화매물 가져오기
public function getNextTelInfo($vr_sq)
{
@@ -1003,4 +1171,409 @@ class M704Model extends Model
return $row;
}
/* 현재 상태 확인 */
public function chkStat($vr_sq)
{
$sql = "SELECT stat_cd FROM v2_vrfc_req WHERE vr_sq = ?";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function InsCharger($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function chkTryCnt($atcl_vr_sq)
{
// 1차 검증인지 2차 검증인지 확인.
$sql = "SELECT try_cnt FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$atcl_vr_sq]);
return $query->getRowArray();
}
/*
* 등기부등본 확인중의 상태인 적이 있었는지 확인
*/
public function chkHistoryStat($atcl_vr_sq)
{
$sql = "select count(a.stat_cd) from v2_chg_history a " .
"where vr_sq = ? and stat_cd = 40 " .
"order by vr_sq desc;";
$data = array(
$atcl_vr_sq
);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function chkConfirm($atcl_vr_sq, $reg_yn = null)
{
$builder = $this->db->table('v2_confirm');
$builder->select('vr_sq');
$builder->where('vr_sq', $atcl_vr_sq);
if ($reg_yn) {
$builder->where('vrfc_type', $reg_yn);
}
$query = $builder->get();
return $query->getNumRows();
}
public function insertConfirm($vr_sq, $vrfc_type, $success, $type)
{ //v2_confirm INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW())";
$data = array(
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
);
$this->db->query($sql, $data);
}
public function getUpdateFailTime($vr_sq)
{
$sql = "select vr_sq, stat_cd, insert_user, insert_tm " .
"from v2_chg_stat " .
"where vr_sq = ? and stat_cd = 39 " .
"order by insert_tm desc " .
"limit 1";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
return $return;
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{
// 상태변경 TABLE INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->getDetail($vr_sq);
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)" .
"VALUES (?, ?, ?, ?)" .
"ON DUPLICATE KEY " .
"UPDATE vr_sq=VALUES(vr_sq), stat_cd=VALUES(stat_cd), insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = [
$vr_sq,
$stat_cd,
$usr_sq,
$insert_tm
];
$this->db->transStart();
$res = $this->db->query($sql, $data);
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
if (empty($return['error_number'])) {
// 로그를 남긴다.
if ($this->db->affectedRows() > 0) {
$changed = "전화확인 정보 저장";
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $stat_cd, 'C9', $usr_id, $changed);
}
}
}
$this->db->transComplete();
return $return;
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
return $return;
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
$return['error_number'] = $error['code'];
$return['error_message'] = $error['message'];
return $return;
}
public function chgRegTryCnt($vr_sq, $reg_try_cnt)
{
$sql = "UPDATE v2_vrfc_req" .
" SET reg_try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$reg_try_cnt,
$vr_sq
);
$res = $this->db->query($sql, $data);
}
public function chgTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{ //v2_check_list INSERT
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', "704 => " . $log_v);
}
public function deleteChkList($vr_sq, $vrfc_type, $type)
{
$sql = "delete from v2_check_list where vr_sq = ? and vrfc_type = ? and type = ?";
$data = array(
$vr_sq,
$vrfc_type,
$type
);
$this->db->query($sql, $data);
}
public function up_tel_fail_cause($vr_sq, $tel_fail_cause)
{
$sql = "UPDATE v2_vrfc_req" .
" SET tel_fail_cause = ? " .
" WHERE vr_sq = ?";
$data = array(
$tel_fail_cause,
$vr_sq
);
$res = $this->db->query($sql, $data);
echo $this->db->getLastQuery();
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
return $return;
}
/* 검증결과 전송 API를 위한 데이터 조회. */
public function getDataConfirmAPI($vr_sq)
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm" .
" FROM v2_vrfc_req where vr_sq = ?";
$data = [$vr_sq];
$query = $this->db->query($sql, $data);
$row_vrfc_req = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2" .
" FROM v2_article_info where vr_sq = ?";
$data = [$vr_sq];
$query = $this->db->query($sql, $data);
$row_article_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, address4, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2" .
" FROM v2_modify_info where vr_sq = ?";
$data = [$vr_sq];
$query = $this->db->query($sql, $data);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm where vr_sq = ? and vrfc_type = ?";
$data = [$vr_sq, $row_vrfc_req['vrfc_type']];
$query = $this->db->query($sql, $data);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT cl_sq, vr_sq, vrfc_type, type, code, comment, ownerNm, ownerBirth insert_user, insert_tm " .
" FROM v2_check_list where vr_sq = ? and vrfc_type = ? and type like concat(vrfc_type, '%')";
$data = [$vr_sq, $row_vrfc_req['vrfc_type']];
$query = $this->db->query($sql, $data);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm));
$atclNo = $row_vrfc_req['atcl_no'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['ownerBirth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] == 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'try_cnt' => '',
];
} else {
return array(
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
);
}
}
}

View File

@@ -248,22 +248,22 @@ class M705Model extends Model
}
// 본부
if (!empty($data['bonbu'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
} else {
$sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
}
}
// if (!empty($data['bonbu'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
// } else {
// $sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
// }
// }
// 팀
if (!empty($data['team'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept2_sq = '{$data['team']}' ";
} else {
$sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
}
}
// if (!empty($data['team'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept2_sq = '{$data['team']}' ";
// } else {
// $sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
// }
// }
// 매물종류
if (!empty($data['rlet_type_cd'])) {
@@ -479,22 +479,22 @@ class M705Model extends Model
}
// 본부
if (!empty($data['bonbu'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
} else {
$sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
}
}
// if (!empty($data['bonbu'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
// } else {
// $sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
// }
// }
// 팀
if (!empty($data['team'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept2_sq = '{$data['team']}' ";
} else {
$sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
}
}
// if (!empty($data['team'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept2_sq = '{$data['team']}' ";
// } else {
// $sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
// }
// }
// 매물종류
if (!empty($data['rlet_type_cd'])) {
@@ -526,6 +526,8 @@ class M705Model extends Model
$sql .= "LIMIT {$start}, {$end}";
// echo $sql;
$query = $this->db->query($sql);
return $query->getResultArray();
@@ -739,22 +741,22 @@ class M705Model extends Model
}
// 본부
if (!empty($data['bonbu'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
} else {
$sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
}
}
// if (!empty($data['bonbu'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept1_sq = '{$data['bonbu']}' ";
// } else {
// $sql .= "AND a.reg_dept1_sq = '{$data['bonbu']}' ";
// }
// }
// 팀
if (!empty($data['team'])) {
if ($data['charger_gbn'] === "1") {
$sql .= "AND a.dept2_sq = '{$data['team']}' ";
} else {
$sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
}
}
// if (!empty($data['team'])) {
// if ($data['charger_gbn'] === "1") {
// $sql .= "AND a.dept2_sq = '{$data['team']}' ";
// } else {
// $sql .= "AND a.reg_dept2_sq = '{$data['team']}' ";
// }
// }
// 매물종류
if (!empty($data['rlet_type_cd'])) {
@@ -1032,32 +1034,32 @@ class M705Model extends Model
$sql = "UPDATE v2_files SET use_yn = 'N' WHERE vr_sq = {$data['vr_sq']} AND use_yn = 'Y' AND file_type '2'";
$this->db->query($sql);
}
$sql = "INSERT INTO v2_files
$sql = "INSERT INTO v2_files
(vr_sq, file_type, view_odr, file_path, file_name, file_ext, file_size, insert_user, insert_tm, cloud_upload_yn)
VALUES
(?, '2', 0, ?, ?, ?, ?, ?, NOW(), 'Y')
";
$param = [
$data['vr_sq'],
$data['file_path'],
$data['new_name'],
$data['ext'],
$data['size'],
$data['usr_id'],
$param = [
$data['vr_sq'],
$data['file_path'],
$data['new_name'],
$data['ext'],
$data['size'],
$data['usr_id'],
];
if ($this->db->query($sql, $param) === false) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
if ($this->db->query($sql, $param)) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
}
}
$this->db->transComplete();
return [
@@ -1094,4 +1096,476 @@ class M705Model extends Model
return $row;
}
public function chkRegiTryCnt($atcl_vr_sq)
{
// 1차 검증인지 2차 검증인지 확인
$sql = "SELECT reg_try_cnt
FROM v2_vrfc_req
WHERE vr_sq = ?";
$query = $this->db->query($sql, [$atcl_vr_sq]);
return $query->getRowArray();
}
public function chkConfirm($atcl_vr_sq, $reg_yn)
{
// 검증결과 table에 있는지 확인.
$builder = $this->db->table('v2_confirm');
$builder->select('vr_sq');
$builder->where('vr_sq', $atcl_vr_sq);
if ($reg_yn) {
$builder->where('vrfc_type', $reg_yn); // 등기부등본 정보 확인시
}
$query = $builder->get();
$result = $query->getNumRows();
return $result;
}
public function getUpdateFailTime($vr_sq)
{
$sql = "select vr_sq, stat_cd, insert_user, insert_tm " .
"from v2_chg_stat " .
"where vr_sq = ? and stat_cd = '49' " .
"order by insert_tm desc " .
"limit 1";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
public function insertConfirm($vr_sq, $vrfc_type, $success, $type)
{ //v2_confirm INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW())";
$data = array(
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
);
$this->db->query($sql, $data);
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success,
'update_user' => session('usr_sq'),
'update_tm' => date('Y-m-d H:i:s')
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
$error = $this->db->error();
return [
'error_number' => $error['code'],
'error_message' => $error['message']
];
}
public function InsResChar($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET reg_charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function add_cert_uncnfrm_status($vr_sq, $cert_uncnfrm_status)
{
$builder = $this->db->table('v2_article_info');
$builder->select('vr_sq, atcl_no');
$builder->where('vr_sq', $vr_sq);
$query = $builder->get();
if ($query->getNumRows() > 0) {
$row = $query->getRowArray();
$atcl_no = $row['atcl_no'];
$sql = "INSERT INTO v2_article_info_etc (vr_sq, atcl_no, cert_uncnfrm_status)" .
" VALUES (?, ?, ?)" .
" ON DUPLICATE KEY UPDATE cert_uncnfrm_status = ?";
$data = [
$vr_sq,
$atcl_no,
$cert_uncnfrm_status,
$cert_uncnfrm_status
];
$this->db->query($sql, $data);
}
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{ //v2_check_list INSERT
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
);
$res = $this->db->query($sql, $data);
}
// 메모저장
public function saveMemo($data)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_vrfc_req SET
memo = ?
WHERE vr_sq = ?";
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
}
$row = $this->getDetail($data[1]);
$memo = "메모변경 : " . $row['memo'] . " => " . $data[0];
$this->saveChangedHistory($data[1], $row['pre_stat_cd'], 'C19', $usr_id, $memo);
return [
'success' => true
];
}
public function update_owner_verifiable($vr_sq, $owner_verifiable)
{
$sql = "UPDATE v2_vrfc_req" .
" SET owner_verifiable = ?" .
" WHERE vr_sq = ?";
$data = array(
$owner_verifiable,
$vr_sq
);
$this->db->query($sql, $data);
$s = $this->db->getLastQuery();
log_message('debug', "====update_owner_verifiable====" . $s);
}
/* 등기부등본 API 호출*/
public function getDatacertAPI($vr_sq, $vrfc_type = '')
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm, owner_verifiable" .
" FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_vrfc_req = $query->getRowArray();
if (!empty($vrfc_type)) {
$row_vrfc_req['vrfc_type'] = $vrfc_type;
}
log_message('debug', 'getDatacertApi_query => ' . $this->db->getLastQuery());
log_message('debug', 'getDatacertApi_result => ' . json_encode($row_vrfc_req));
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2, vrfc_type_sub" .
" FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_article_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2" .
" FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT a.type, a.code, a.comment, b.ownerNm, b.owner_birth" .
" FROM v2_check_list a" .
" INNER JOIN v2_article_info b ON a.vr_sq = b.vr_sq" .
" WHERE a.vr_sq = ? AND a.vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm));
$atclNo = $row_vrfc_req['atcl_no'];
$type = $row_vrfc_req['try_cnt'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
switch ($row_vrfc_req['owner_verifiable']) {
case "1":
case "true":
$ownerVerifiable = true;
break;
default:
$ownerVerifiable = false;
break;
}
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['owner_birth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] == 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
$return_data = [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'vrfcType' => $row_article_info['vrfc_type_sub'],
'ownerVerifiable' => $ownerVerifiable,
];
log_message('debug', "705 getDatacertAPI_1 {$atclNo} ::: " . json_encode($return_data) . PHP_EOL);
return $return_data;
} else {
$return_data = [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'vrfcType' => $row_article_info['vrfc_type_sub'],
'ownerVerifiable' => $ownerVerifiable,
];
log_message('debug', "705 getDatacertAPI_2 {$atclNo} ::: " . json_encode($return_data) . PHP_EOL);
return $return_data;
}
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->getDetail($vr_sq);
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)" .
" VALUES (?, ?, ?, ?)" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=VALUES(vr_sq), stat_cd=VALUES(stat_cd), insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = [
$vr_sq,
$stat_cd,
$usr_sq,
$insert_tm
];
$this->db->transStart();
$this->db->query($sql, $data);
$error = $this->db->error();
$return = [
'error_number' => $error['code'],
'error_message' => $error['message']
];
if (empty($return['error_number'])) {
if ($this->db->affectedRows() > 0) {
$changed = $this->whatIsChanged($list, $data, '');
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $stat_cd, 'C9', $usr_id, $changed);
}
}
}
$this->db->transComplete();
return $return;
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
return [
'error_number' => $error['code'],
'error_message' => $error['message']
];
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
return [
'error_number' => $error['code'],
'error_message' => $error['message']
];
}
public function updateStat($vr_sq, $reg_status)
{
$data = ['reg_status' => $reg_status];
$builder = $this->db->table('v2_article_info');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$error = $this->db->error();
return [
'error' => [
'code' => $error['code'],
'message' => $error['message']
]
];
}
public function chgRegiTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET reg_try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
public function resetTelConf($vr_sq)
{
$sql = "update v2_check_list " .
"set code = '' " .
"where type in ('T11', 'T12', 'T13', 'T14') " .
"and vr_sq = ?";
$data = array($vr_sq);
$this->db->query($sql, $data);
}
}

View File

@@ -1,6 +1,7 @@
<?php
namespace App\Models\v2;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M706Model extends Model
@@ -757,6 +758,679 @@ class M706Model extends Model
return $query->getRowArray();
}
/* 매물정보를 수정 */
public function saveModifyInfo($atcl_vr_sq, $atcl_hscp_nm, $atcl_ptp_nm, $atcl_vrfc_type, $trade_type, $atcl_addr1, $atcl_addr1a, $atcl_addr1b, $atcl_addr2, $atcl_hscp_no, $atcl_ptp_no, $atcl_amt1, $atcl_amt2, $atcl_amt3, $atcl_floor, $atcl_floor2)
{
$session = session();
$usr_id = $session->get('usr_id');
$list = $this->getDetail($atcl_vr_sq);
$data = [];
if ($trade_type != 'B2') {
$atcl_amt3 = '0';
$data['lease_amt'] = $atcl_amt3;
}
if (!empty($trade_type))
$data['trade_type'] = $trade_type;
if (!empty($atcl_hscp_nm))
$data['hscp_nm'] = $atcl_hscp_nm;
if (!empty($atcl_ptp_nm))
$data['ptp_nm'] = $atcl_ptp_nm;
if (!empty($atcl_addr1))
$data['address2'] = $atcl_addr1;
if (!empty($atcl_addr1a))
$data['address2a'] = $atcl_addr1a;
if (!empty($atcl_addr1b))
$data['address2b'] = $atcl_addr1b;
if (!empty($atcl_addr2))
$data['address3'] = $atcl_addr2;
if (!empty($atcl_hscp_no))
$data['hscp_no'] = $atcl_hscp_no;
if (!empty($atcl_ptp_no))
$data['ptp_no'] = $atcl_ptp_no;
if (!empty($atcl_amt1))
$data['deal_amt'] = $atcl_amt1;
if (!empty($atcl_amt2))
$data['wrrnt_amt'] = $atcl_amt2;
if (!empty($atcl_amt3))
$data['lease_amt'] = $atcl_amt3;
if (!empty($atcl_floor))
$data['floor'] = $atcl_floor;
if (!empty($atcl_floor2))
$data['floor2'] = $atcl_floor2;
$data['modify_yn'] = 'Y';
$this->db->transStart();
$builder = $this->db->table('v2_modify_info');
$builder->where('vr_sq', $atcl_vr_sq);
$builder->update($data);
$last_query = $this->db->getLastQuery();
$current_url = current_url();
log_message('debug', $current_url . ' :: ' . $last_query);
$data['trade_type_cd'] = $trade_type;
$return['error_number'] = $this->db->error()['code'];
$return['error_message'] = $this->db->error()['message'];
if (empty($return['error_number'])) {
if ($this->db->affectedRows() > 0) {
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $list['pre_stat_cd'], 'C25', $usr_id, "매물정보 수정");
}
}
}
$this->db->transComplete();
// 홍보확인서인 경우 주소 변경시 FAX 이미지의 정보도 함께 변경한다.
$faxModel = new FaxModel();
$faxModel->updateAddress($atcl_vr_sq, $list['address_code'], $data['address2'] ?? '', $data['address3'] ?? '', $data['hscp_no'] ?? '', $data['hscp_nm'] ?? '');
return $return;
}
public function saveModifyVrfc($atcl_vr_sq, $atcl_vrfc_type)
{
$usr_id = session('usr_id');
$list = $this->getDetail($atcl_vr_sq); //변경된 내용 비교를 위해.
$data['vrfc_type'] = $atcl_vrfc_type;
$this->db->where('vr_sq', $atcl_vr_sq);
$this->db->trans_start();
$this->db->update('v2_vrfc_req', $data);
$data['vrfc_type_cd'] = $atcl_vrfc_type;
//echo $this->db->last_query();
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
if (empty($return['error_number'])) {
// 로그를 남긴다.
if ($this->db->affected_rows() > 0) {
if (!empty($changed)) {
$this->saveChangedHistory($list['data']['vr_sq'], $list['data']['pre_stat_cd'], 'C25', $usr_id, "매물정보 저장");
}
}
}
$this->db->trans_complete();
return $return;
}
/* 현재 상태 확인 */
public function chkStat($vr_sq)
{
$sql = "SELECT stat_cd FROM v2_vrfc_req WHERE vr_sq = ?";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function InsCharger($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function chkTryCnt($atcl_vr_sq)
{
// 1차 검증인지 2차 검증인지 확인.
$builder = $this->db->table('v2_vrfc_req');
$builder->select('try_cnt');
$builder->where('vr_sq', $atcl_vr_sq);
$query = $builder->get();
return $query->getRowArray();
}
public function chkConfirm($atcl_vr_sq, $reg_yn = null)
{
// 검증결과 table에 있는지 확인.
$builder = $this->db->table('v2_confirm');
$builder->select('vr_sq');
$builder->where('vr_sq', $atcl_vr_sq);
if ($reg_yn) {
$builder->where('vrfc_type', $reg_yn); // 등기부등본 정보 확인시
}
$query = $builder->get();
return $query->getNumRows();
}
public function insertConfirm($vr_sq, $vrfc_type, $success, $type)
{ //v2_confirm INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW())";
$data = array(
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
);
$this->db->query($sql, $data);
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success,
'update_tm' => date('Y-m-d H:i:s')
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
$return = [
'error_number' => $this->db->error()['code'],
'error_message' => $this->db->error()['message']
];
return $return;
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{
// 상태변경 TABLE INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->getDetail($vr_sq);
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm) " .
"VALUES (?, ?, ?, ?) " .
"ON DUPLICATE KEY UPDATE " .
"vr_sq=VALUES(vr_sq), stat_cd=VALUES(stat_cd), insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = [
$vr_sq,
$stat_cd,
$usr_sq,
$insert_tm
];
$this->db->transStart();
$query = $this->db->query($sql, $data);
$last_query = $this->db->getLastQuery();
log_message('debug', $last_query);
$return['error_number'] = $this->db->error()['code'];
$return['error_message'] = $this->db->error()['message'];
if (empty($return['error_number'])) {
// 로그를 남긴다.
if ($this->db->affectedRows() > 0) {
$changed = $this->whatIsChanged($list, $data, '');
if (!empty($changed)) {
$this->saveChangedHistory($list['vr_sq'], $stat_cd, 'C9', $usr_id, $changed);
}
}
}
$this->db->transComplete();
return $return;
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$last_query = $this->db->getLastQuery();
log_message('debug', $last_query);
$return['error_number'] = $this->db->error()['code'];
$return['error_message'] = $this->db->error()['message'];
return $return;
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
$last_query = $this->db->getLastQuery();
log_message('debug', $last_query);
$return['error_number'] = $this->db->error()['code'];
$return['error_message'] = $this->db->error()['message'];
return $return;
}
public function chgTryCnt($vr_sq, $try_cnt)
{ //v2_vrfc_req try_cnt 값 변경.
$sql = "UPDATE v2_vrfc_req" .
" SET try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$this->db->query($sql, $data);
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{ //v2_check_list INSERT
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
);
$this->db->query($sql, $data);
}
/**
* 검증결과 전송 API를 위한 데이터 조회..
*/
public function getDataConfirmAPI($vr_sq)
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm" .
" FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_vrfc_req = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2" .
" FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, address4, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2 FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT type, code, comment, ownerNm, ownerBirth FROM v2_check_list WHERE vr_sq = ? AND vrfc_type = ? AND type LIKE CONCAT(vrfc_type, '%')";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm));
$atclNo = $row_vrfc_req['atcl_no'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
$try_cnt = $row_vrfc_req['try_cnt'];
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['ownerBirth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] === 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'try_cnt' => $try_cnt,
];
} else {
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'try_cnt' => $try_cnt,
];
}
}
public function InsResChar($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET reg_charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function chkRegiTryCnt($atcl_vr_sq)
{
// 1차 검증인지 2차 검증인지 확인.
$builder = $this->db->table('v2_vrfc_req');
$builder->select('reg_try_cnt');
$builder->where('vr_sq', $atcl_vr_sq);
$query = $builder->get();
$last_query = $this->db->getLastQuery();
log_message('debug', $last_query);
return $query->getRowArray();
}
/* 등기부등본 API 호출*/
public function getDatacertAPI($vr_sq, $vrfc_type = '')
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm, owner_verifiable" .
" FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_vrfc_req = $query->getRowArray();
if (!empty($vrfc_type)) {
$row_vrfc_req['vrfc_type'] = $vrfc_type;
}
log_message('debug', $this->db->getLastQuery());
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2" .
" FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2" .
" FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT a.type, a.code, a.comment, b.ownerNm, b.owner_birth" .
" FROM v2_check_list a " .
" INNER JOIN v2_article_info b ON a.vr_sq = b.vr_sq" .
" WHERE a.vr_sq = ? AND a.vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm));
$atclNo = $row_vrfc_req['atcl_no'];
$type = $row_vrfc_req['try_cnt'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
$ownerVerifiable = ($row_vrfc_req['owner_verifiable'] === 'false') ? false : true;
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['owner_birth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] === 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
];
} else {
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'ownerVerifiable' => $ownerVerifiable,
];
}
}
// 메모저장
public function saveMemo($data)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_vrfc_req SET
memo = ?
WHERE vr_sq = ?";
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
}
$row = $this->getDetail($data[1]);
$memo = "메모변경 : " . $row['memo'] . " => " . $data[0];
$this->saveChangedHistory($data[1], $row['pre_stat_cd'], 'C19', $usr_id, $memo);
return [
'success' => true
];
}
public function saveApiErr($err_sq, $err_code, $err_nm, $err_time, $err_no, $err_server = '')
{
$sql = "INSERT INTO err_api (err_sq, err_code, err_nm, err_time, err_no, err_server)" .
" VALUES (?, ?, ?, ?, ?, ?);";
$data = array(
$err_sq,
$err_code,
$err_nm,
$err_time,
$err_no,
$err_server
);
$this->db->query($sql, $data);
}
// 정보변경 이력 저장
public function saveChangedHistory($vr_sq, $stat_cd, $chg_type, $usr_id, $memo)
{
$sql = "INSERT INTO v2_chg_history" .
" (vr_sq, stat_cd, chg_type, insert_id, insert_tm, memo)" .
" VALUES" .
" (?, ?, ?, ?, now(), ?)";
$data = [
$vr_sq,
$stat_cd,
$chg_type,
$usr_id,
$memo
];
$res = $this->db->query($sql, $data);
}
// 변경이력 조회
public function getHistory($id)
{

View File

@@ -1,6 +1,8 @@
<?php
namespace App\Models\v2;
use App\Models\receipt\ReceiptModel;
use App\Models\webfax\FaxModel;
use CodeIgniter\Model;
class M708Model extends Model
@@ -961,7 +963,7 @@ class M708Model extends Model
$current_tm = date('Y-m-d H:i:s');
$article = $this->getArticleInfo2($atcl_no, $vr_sq);
$this->saveFaxImgs($fax_sq, '2', $vr_sq, $atcl_no, $article['cpid'], $article['realtor_nm'], $article['stat_cd'], $current_tm, $article['address_code'], $article['address2']);
$this->saveFaxImgs($fax_sq, '2', $vr_sq, $atcl_no, $article['cpid'], $article['realtor_nm'], $article['stat_cd'], $current_tm, $article['address_code'], $article['address2'], 'Y');
return [
'success' => true,
@@ -1215,6 +1217,754 @@ class M708Model extends Model
return $row;
}
/**
* 매물정보와 FAX를 연결해 준다.
*/
public function saveArticleFAX($memo, $fax_sq, $vr_sq, $atcl_no, $work_type, $result_d11, $comment_d11, $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3, $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3, $stat_cd = '')
{
// 1. 매물정보 저장 fax_imgs
// 2.1 확인결과 저장 v2_confirms
// 2.2 확인정보 체크 v2_check_list
// 3.1 검증요청 상태변경 v2_vrfc_req
// 3.2 상태변경 저장 v2_chg_stat
// 4. 첨부파일 저장 v2_files
// 5. 변경이력 저장 v2_chg_history
// 6. kiso 전송하기
$this->db->transStart();
$article = NULL;
$current_tm = date('Y-m-d H:i:s');
$insert_user = session('usr_sq');
$insert_id = session('usr_id');
$update_user = $insert_user;
switch ($work_type) {
case '1': // 현장확인매물
$article = $this->getArticleInfo1($atcl_no, $vr_sq);
// 1. 매물정보 저장 fax_imgs
$this->saveFaxImgs($fax_sq, $work_type, $vr_sq, $atcl_no, $article['cpid'], $article['realtor_nm'], '35', $current_tm, $article['address_code'], $article['address2'], 'Y');
// 2.1 확인결과 저장 v2_confirm
if ($result_d11 == '10000' && $fax_conf_yn_1 == 'Y' && $fax_conf_yn_2 == 'Y' && $fax_conf_yn_3 == 'Y') {
$success = TRUE;
} else {
$success = FALSE;
}
$fax = $this->getDetail($fax_sq);
$this->saveV2Confirm($vr_sq, 'D', $success, '1', $fax['charger'], $current_tm, $insert_user, $update_user, $work_type);
// 2.2 확인정보 체크 v2_check_list
// $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3,
// $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3
if (is_array($comment_d11)) {
$comment = implode('|', $comment_d11);
} else {
$comment = $comment_d11;
}
$this->saveV2CheckList($vr_sq, 'D', 'D11', $result_d11, $comment, $insert_user);
if ($fax_conf_yn_1 == 'Y') {
$fax_conf_yn_1 = '10000';
} else {
$fax_conf_yn_1 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D12', $fax_conf_yn_1, $fax_conf_info_1, $insert_user);
if ($fax_conf_yn_2 == 'Y') {
$fax_conf_yn_2 = '10000';
} else {
$fax_conf_yn_2 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D13', $fax_conf_yn_2, $fax_conf_info_2, $insert_user);
if ($fax_conf_yn_3 == 'Y') {
$fax_conf_yn_3 = '10000';
} else {
$fax_conf_yn_3 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D14', $fax_conf_yn_3, $fax_conf_info_3, $insert_user);
$this->saveV2ChgHistory($vr_sq, '35', 'C9', $insert_id, '현장확인 매물');
$faxModel = new FaxModel();
$fax = $faxModel->selectFax($fax_sq); // fax 이미지 파일 가져오기
$receiptModel = new ReceiptModel();
$receipt = $receiptModel->selectReceiptOne($vr_sq); // 매물정보 가져오기
// 40: 촬영, 70: 검수지연... 상태가 촬용 이전 또는 검수지연 상태일 경우에만 홍보확인서를 등록한다.
if (substr($receipt['rcpt_stat'], 0, 2) <= '40' || substr($receipt['rcpt_stat'], 0, 2) == '70') {
$arrImagePath = array(
'/home/confirms/test-admin.confirms.co.kr/upload/',
'/home/confirms/upload/',
'/home/www/admin.confirms.co.kr/upload/',
'/home/www/upload/',
'/image/confirms_upload/',
'/misc/image/confirms_upload/',
'/storage/web/admin.confirms.co.kr/src/upload/',
'/storage/web/admin.confirms.co.kr/upload/',
$_SERVER['DOCUMENT_ROOT'] . '/upload/',
);
$image_path = str_replace($arrImagePath, '/upload/', $fax['file_path']);
$receiptModel->saveFaxImage($fax_sq, $receipt['rcpt_sq'], $receipt['rsrv_sq'], 'I1', $image_path, $fax['file_name'], '.jpg', $fax['img_size'], $fax['img_width'], $fax['img_height'], $receipt);
}
break;
case '2': // 일반확인매물
$article = $this->getArticleInfo2($atcl_no, $vr_sq);
$try_cnt = $article['try_cnt']; // 0 -> 1 차시도, 1 -> 2 차시도
$try_cnt = $try_cnt + 1;
//memo 저장
$res_memo = $this->saveMemo([$memo, $vr_sq]);
$stat_cd = "30"; // 전화/서류 확인 중
if ($result_d11 == '10000' && $fax_conf_yn_1 == 'Y' && $fax_conf_yn_2 == 'Y' && $fax_conf_yn_3 == 'Y') {
$success = TRUE; // 전화/서류 확인 성공
} else {
$success = FALSE; // 전화/서류 확인 실패
}
// 1. 매물정보 저장 fax_imgs
$r = $this->saveFaxImgs($fax_sq, $work_type, $article['vr_sq'], $article['atcl_no'], $article['cpid'], $article['realtor_nm'], $stat_cd, $current_tm, $article['address_code'], $article['address2'], 'Y');
// 2.1 확인결과 저장 v2_confirm
$fax = $this->getDetail($fax_sq);
$this->saveV2Confirm($vr_sq, 'D', $success, $try_cnt, $fax['charger'], $current_tm, $insert_user, $update_user, $work_type);
// 2.2 확인정보 체크 v2_check_list
// $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3,
// $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3
if (is_array($comment_d11)) {
$comment = implode('|', $comment_d11);
} else {
$comment = $comment_d11;
}
$this->saveV2CheckList($vr_sq, 'D', 'D11', $result_d11, $comment, $insert_user);
if ($fax_conf_yn_1 == 'Y') {
$fax_conf_yn_1 = '10000';
} else {
$fax_conf_yn_1 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D12', $fax_conf_yn_1, $fax_conf_info_1, $insert_user);
if ($fax_conf_yn_2 == 'Y') {
$fax_conf_yn_2 = '10000';
} else {
$fax_conf_yn_2 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D13', $fax_conf_yn_2, $fax_conf_info_2, $insert_user);
if ($fax_conf_yn_3 == 'Y') {
$fax_conf_yn_3 = '10000';
} else {
$fax_conf_yn_3 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D14', $fax_conf_yn_3, $fax_conf_info_3, $insert_user);
if ($success == TRUE) {
$stat_cd = '35'; // 서류확인완료
$this->saveV2ChgStat($vr_sq, $stat_cd, $insert_user);
$rgbk_confirm = $this->getRgbk_confirm($vr_sq);
if (empty($rgbk_confirm)) {
// 등기부등본 확인이 불필요할 경우
$stat_cd = '60'; // 등기부등본 확인 중
$this->saveV2ChgStat($vr_sq, $stat_cd, $insert_user);
} else {
// 등기부등본 확인이 필요할 경우
$stat_cd = '40'; // 등기부등본 확인 중
$this->saveV2ChgStat($vr_sq, $stat_cd, $insert_user);
}
} else {
$stat_cd = '39'; // 서류확인 불일치
$this->saveV2ChgStat($vr_sq, $stat_cd, $insert_user);
}
// 3.1 검증요청 상태변경 v2_vrfc_req
$this->saveV2VrfcReq($vr_sq, $stat_cd);
// 4. 첨부파일 저장 v2_files
// fax_sq, mid, file_name, file_path, thumbnail, img_width, img_height, img_size, img_sq, remark, work_type, atcl_no, cpid, realtor_nm, stat_cd, proc_tm, send_tm, address_code, address2, charger
$pos = strpos($fax['file_name'], '.');
if ($pos === false) {
$file_ext = '';
} else {
$file_ext = substr($fax['file_name'], $pos);
}
$this->saveV2Files($vr_sq, $fax['file_path'], $fax['file_name'], $file_ext, $fax['img_size'], $fax['img_width'], $fax['img_height'], $insert_user);
// 5. 변경이력 저장 v2_chg_history
$memo = '';
$this->saveV2ChgHistory($vr_sq, $stat_cd, 'C9', $insert_id, $memo);
break;
default: // 오류
break;
}
}
public function saveHongBoFAX($fax_sq, $vr_sq, $atcl_no, $work_type, $send_yn, $result_d11, $comment_d11, $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3, $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3, $file_type, $stat_cd = '')
{
// 1. 매물정보 저장 fax_imgs
// 2.1 확인결과 저장 v2_confirms
// 2.2 확인정보 체크 v2_check_list
// 3.1 검증요청 상태변경 v2_vrfc_req
// 3.2 상태변경 저장 v2_chg_stat
// 4. 첨부파일 저장 v2_files
// 5. 변경이력 저장 v2_chg_history
// 6. kiso 전송하기
$this->db->transStart();
$article = NULL;
$current_tm = date('Y-m-d H:i:s');
$insert_user = session('usr_sq');
$insert_id = session('usr_id');
$update_user = $insert_user;
$article = $this->getArticleInfo1($atcl_no, $vr_sq);
// 1. 매물정보 저장 fax_imgs
$this->saveFaxImgs($fax_sq, $work_type, $vr_sq, $atcl_no, $article['cpid'], $article['realtor_nm'], '35', $current_tm, $article['address_code'], $article['address2'], $send_yn);
// 2.1 확인결과 저장 v2_confirm
if ($result_d11 == '10000' && $fax_conf_yn_1 == 'Y' && $fax_conf_yn_2 == 'Y' && $fax_conf_yn_3 == 'Y') {
$success = TRUE;
} else {
$success = FALSE;
}
$fax = $this->getDetail($fax_sq);
$this->saveV2Confirm($vr_sq, 'D', $success, '1', $fax['charger'], $current_tm, $insert_user, $update_user, $work_type);
// 2.2 확인정보 체크 v2_check_list
// $fax_conf_yn_1, $fax_conf_yn_2, $fax_conf_yn_3,
// $fax_conf_info_1, $fax_conf_info_2, $fax_conf_info_3
if (is_array($comment_d11)) {
$comment = implode('|', $comment_d11);
} else {
$comment = $comment_d11;
}
$this->saveV2CheckList($vr_sq, 'D', 'D11', $result_d11, $comment, $insert_user);
if ($fax_conf_yn_1 == 'Y') {
$fax_conf_yn_1 = '10000';
} else {
$fax_conf_yn_1 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D12', $fax_conf_yn_1, $fax_conf_info_1, $insert_user);
if ($fax_conf_yn_2 == 'Y') {
$fax_conf_yn_2 = '10000';
} else {
$fax_conf_yn_2 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D13', $fax_conf_yn_2, $fax_conf_info_2, $insert_user);
if ($fax_conf_yn_3 == 'Y') {
$fax_conf_yn_3 = '10000';
} else {
$fax_conf_yn_3 = '20000';
}
$this->saveV2CheckList($vr_sq, 'D', 'D14', $fax_conf_yn_3, $fax_conf_info_3, $insert_user);
$this->saveV2ChgHistory($vr_sq, '35', 'C9', $insert_id, '현장확인 매물');
$faxModel = new FaxModel();
$fax = $faxModel->selectFax($fax_sq); // fax 이미지 파일 가져오기
$receiptModel = new ReceiptModel();
$receipt = $receiptModel->selectReceiptOne($vr_sq); // 매물정보 가져오기
// 40: 촬영, 70: 검수지연... 상태가 촬용 이전 또는 검수지연 상태일 경우에만 홍보확인서를 등록한다.
if (substr($receipt['rcpt_stat'], 0, 2) <= '40' || substr($receipt['rcpt_stat'], 0, 2) == '70') {
$arrImagePath = array(
'/home/confirms/test-admin.confirms.co.kr/upload/',
'/home/confirms/upload/',
'/home/www/admin.confirms.co.kr/upload/',
'/home/www/upload/',
'/image/confirms_upload/',
'/misc/image/confirms_upload/',
'/storage/web/admin.confirms.co.kr/src/upload/',
'/storage/web/admin.confirms.co.kr/upload/',
$_SERVER['DOCUMENT_ROOT'] . '/upload/',
);
$image_path = str_replace($arrImagePath, '/upload/', $fax['file_path']);
$receiptModel->saveFaxImage($fax_sq, $receipt['rcpt_sq'], $receipt['rsrv_sq'], $file_type, $image_path, $fax['file_name'], '.jpg', $fax['img_size'], $fax['img_width'], $fax['img_height'], $receipt);
}
$this->db->transComplete();
$return = array(
'code' => $this->db->_error_number(),
'message' => $this->db->_error_message(),
);
return $return;
}
/**
* 검증결과 저장하기
*/
public function saveV2Confirm($vr_sq, $vrfc_type, $success, $type, $charger, $date, $insert_user, $update_user, $work_type = '2')
{
$insert_user = session('usr_sq');
$insert_id = session('usr_id');
$update_user = $insert_user;
// DB에서 변경되지 전 값을 읽어온다.
$sql = "select success, type, charger, date from v2_confirm" .
" where vr_sq = ?" .
" and vrfc_type = ?";
$data = array(
$vr_sq,
$vrfc_type
);
$query = $this->db->query($sql, $data);
$data_table = array();
if ($query->getNumRows() > 0) {
$data_table = $query->getRowArray();
}
$date = str_replace(array(' ', '-', ':'), '', $date);
$sql = "INSERT INTO v2_confirm" .
" (vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type)" .
" VALUES" .
" (?, ?, ?, ?, ?, ?, ?, now(), ?, now(), ?)" .
" ON DUPLICATE KEY UPDATE" .
" success=values(success), type=values(type), charger=values(charger), date=values(date), update_user=values(update_user), update_tm=values(update_tm), work_type=values(work_type)";
$data = array(
'vr_sq' => $vr_sq,
'vrfc_type' => $vrfc_type,
'success' => $success,
'type' => $type,
'charger' => $charger,
'date' => $date,
'insert_user' => $insert_user,
'update_user' => $update_user,
'work_type' => $work_type
);
$this->db->query($sql, $data);
// 변경이력 저장하기
if (!empty($data_table)) {
$this->saveV2ChgHistory($vr_sq, '30', 'C27', $insert_id, "검증결과 정보 저장");
}
}
/**
* 확인정보 저장하기
*/
public function saveV2CheckList($vr_sq, $vrfc_type, $type, $code, $comment, $insert_user)
{
$insert_id = session('usr_id');
$sql = "select code, comment from v2_check_list" .
" where vr_sq = ?" .
" and type = ?";
$data = array(
$vr_sq,
$type
);
$query = $this->db->query($sql, $data);
$data_table = array();
if ($query->getNumRows() > 0) {
$data_table = $query->getRowArray();
}
$sql = "INSERT INTO v2_check_list" .
" (vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
" VALUES" .
" (?, ?, ?, ?, ?, ?, now())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
'vr_sq' => $vr_sq,
'vrfc_type' => $vrfc_type,
'type' => $type,
'code' => $code,
'comment' => $comment,
'insert_user' => $insert_user
);
$this->db->query($sql, $data);
// 변경이력 저장하기
if (!empty($data_table)) {
$this->saveV2ChgHistory($vr_sq, '30', 'C27', $insert_id, "확인정보 저장");
}
}
/**
* 상태변경시간 등록
*/
public function saveV2ChgStat($vr_sq, $stat_cd, $insert_user)
{
$sql = "INSERT INTO v2_chg_stat" .
" (vr_sq, stat_cd, insert_user, insert_tm)" .
" VALUES" .
" (?, ?, ?, now())" .
" ON DUPLICATE KEY UPDATE" .
" insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = array($vr_sq, $stat_cd, $insert_user);
$this->db->query($sql, $data);
log_message('debug', $this->db->getLastQuery());
}
/**
* 전송 후 FAX에 상태 및 전송시간을 저장한다.
*/
public function saveFaxImgsAfterSend($fax_sq, $vr_sq, $stat_cd, $send_tm = '')
{
if (empty($send_tm))
$send_tm = date('Y-m-d H:i:s');
$data_fax_imgs = [
'stat_cd' => $stat_cd,
'send_tm' => $send_tm,
];
$builder = $this->db->table('fax_imgs');
$builder->where('fax_sq', $fax_sq);
$builder->where('vr_sq', $vr_sq);
$builder->update($data_fax_imgs);
log_message('debug', $this->db->getLastQuery());
}
/**
* 검증요청 v2_vrfc_req의 상태 stat_cd를 업데이트한다.
*/
public function saveV2VrfcReq($vr_sq, $stat_cd)
{
$sql = "update v2_vrfc_req" .
" set stat_cd = ?" .
" where vr_sq = ?";
$data = array($stat_cd, $vr_sq);
$res = $this->db->query($sql, $data);
log_message('debug', $this->db->getLastQuery());
log_message('debug', $res);
}
/**
* 홍보확인서를 매물정보에 등록한다.
*/
public function saveV2Files($vr_sq, $file_path, $file_name, $file_ext, $file_size, $img_width, $img_height, $insert_user)
{
$arrImagePath = array(
'/home/confirms/test-admin.confirms.co.kr/upload/',
'/home/confirms/upload/',
'/home/www/admin.confirms.co.kr/upload/',
'/home/www/upload/',
'/image/confirms_upload/',
'/misc/image/confirms_upload/',
'/storage/web/admin.confirms.co.kr/src/upload/',
'/storage/web/admin.confirms.co.kr/upload/',
$_SERVER['DOCUMENT_ROOT'] . '/upload/',
);
$file_path = str_replace($arrImagePath, '/upload/', $file_path);
$file_type = '1'; // 홍보확인서
// 1. 홍보확이서 등록여부 확인
$sql = "SELECT count(*) file_cnt FROM v2_files" .
" WHERE vr_sq = ?" .
" AND file_type = ?" .
" AND file_path = ?" .
" AND file_name = ?" .
" AND use_yn = 'Y'";
$data = array(
$vr_sq,
$file_type,
$file_path,
$file_name
);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
if (empty($row['file_cnt'])) {
// 2. 다른파일로 등록된 경우를 위해서 업데이트
$sql = "UPDATE v2_files SET use_yn = 'N' WHERE vr_sq = ? AND file_type = ?";
$data = array($vr_sq, $file_type);
$this->db->query($sql, $data);
// 3. 등록
$sql = "INSERT INTO v2_files " .
" (vr_sq, use_yn, file_type, view_odr, file_path, file_name, file_ext, file_size, img_width, img_height, insert_user, insert_tm)" .
" VALUES" .
" (?, 'Y', ?, '1', ?, ?, ?, ?, ?, ?, ?, NOW())";
$data = array($vr_sq, $file_type, $file_path, $file_name, $file_ext, $file_size, $img_width, $img_height, $insert_user);
$this->db->query($sql, $data);
}
}
/**
* 검증결과 전송 API를 위한 데이터 조회..
*/
public function getDataConfirmAPI($vr_sq)
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm" .
" FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_vrfc_req = $query->getRowArray();
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2" .
" FROM v2_article_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$query->getRowArray();
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, address4, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2 FROM v2_modify_info WHERE vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_modify_info = $query->getRowArray();
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm WHERE vr_sq = ? AND vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$row_confirm = $query->getRowArray();
// 확인정보
$sql = "SELECT type, code, comment, ownerNm, ownerBirth FROM v2_check_list WHERE vr_sq = ? AND vrfc_type = ? AND type LIKE CONCAT(vrfc_type, '%')";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$res_check_list = $query->getResultArray();
$atclNo = $row_vrfc_req['atcl_no'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'];
$date = $row_confirm['date'];
$try_cnt = $row_vrfc_req['try_cnt'];
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['ownerBirth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] == 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'try_cnt' => $try_cnt,
];
}
return [
'atclNo' => $atclNo,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'try_cnt' => $try_cnt,
];
}
/**
* 담당자를 지정해준다.
*/
public function InsCharger($vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$vr_sq
);
$this->db->query($sql, $data);
}
/**
* 상태를 변경한다.
*/
public function saveChangeStep($fax_sq, $vr_sq, $stat_cd)
{
$insert_user = session('usr_sq');
$insert_id = session('usr_id');
$this->db->transStart();
// 1. 검증요청 상태변경 v2_vrfc_req
$this->saveV2VrfcReq($vr_sq, $stat_cd);
// 2. 상태변경 저장 v2_chg_stat
$this->saveV2ChgStat($vr_sq, $stat_cd, $insert_user);
// 3. 변경이력 저장 v2_chg_history
$this->saveV2ChgHistory($vr_sq, $stat_cd, 'C9', $insert_id, "");
// 4. FAX에 최종 저장시 상태값 저장
$this->saveFaxImgsAfterSend($fax_sq, $vr_sq, $stat_cd, $send_tm = '');
$this->db->transComplete();
$return = array(
'code' => $this->db->_error_number(),
'message' => $this->db->_error_message(),
);
return $return;
}
/**
* 값을 실패횟수 값을 증가시킨다.
*/
public function increseTryCnt($vr_sq)
{
$sql = "update v2_vrfc_req set try_cnt = ifnull(try_cnt,0) +1 where vr_sq = ?";
$data = array($vr_sq);
$this->db->query($sql, $data);
}
public function getI8Cnt($rsrv_sq)
{
$sql = "SELECT COUNT(img_sq) cnt" .
" FROM result_imgs" .
" WHERE rsrv_sq = ?" .
" AND img_type = 'I8'" .
" AND use_yn = 'Y'";
$data = array($rsrv_sq);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function get_rsrv_sq($rcpt_sq)
{
$sql = "SELECT rsrv_sq " .
" FROM result" .
" WHERE rcpt_sq = ?";
$data = array($rcpt_sq);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
// 메모저장
public function saveMemo($data)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_vrfc_req SET
memo = ?
WHERE vr_sq = ?";
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
}
$row = $this->getDetail($data[1]);
$memo = "메모변경 : " . $row['memo'] . " => " . $data[0];
$this->saveChangedHistory($data[1], $row['pre_stat_cd'], 'C19', $usr_id, $memo);
return [
'success' => true
];
}
/**
* 변경이력 저장하기
*/
public function saveV2ChgHistory($vr_sq, $stat_cd, $chg_type, $insert_id, $memo)
{
$sql = "INSERT INTO v2_chg_history" .
" (vr_sq, stat_cd, chg_type, insert_id, insert_tm, memo)" .
" VALUES" .
" (?, ?, ?, ?, now(), ?)";
$data = array($vr_sq, $stat_cd, $chg_type, $insert_id, $memo);
$this->db->query($sql, $data);
log_message('debug', $this->db->getLastQuery());
}
// 변경내용 저장
public function saveChangedHistory($rcpt_sq, $rcpt_stat, $changed_type, $usr_id, $remark)

View File

@@ -704,4 +704,19 @@ class M710Model extends Model
}
public function get_send_yn($type)
{
$sql = "SELECT stop_yn
FROM v2_stop_api_chg_stat
WHERE TYPE = ?
ORDER BY pk DESC
LIMIT 1";
$date = array(
$type
);
$query = $this->db->query($sql, $date);
$return = $query->getRowArray();
return $return;
}
}

View File

@@ -906,6 +906,504 @@ class M712Model extends Model
}
}
/* 현재 상태 확인 */
public function chkStat($vr_sq)
{
$sql = "SELECT stat_cd FROM v2_vrfc_req WHERE vr_sq = ?";
$data = array(
$vr_sq
);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
//1차 검증인지 2차 검증인지 확인.
public function chkRegiTryCnt($atcl_vr_sq)
{
$sql = "SELECT reg_try_cnt FROM v2_vrfc_req WHERE vr_sq = ?";
$query = $this->db->query($sql, [$atcl_vr_sq]);
return $query->getRowArray();
}
//검증결과 table에 있는지 확인.
public function chkConfirm($atcl_vr_sq, $reg_yn)
{
$builder = $this->db->table('v2_confirm a');
$builder->select('a.vr_sq');
$builder->where('vr_sq', $atcl_vr_sq);
if ($reg_yn) {
$builder->where('vrfc_type', $reg_yn);
}
$query = $builder->get();
return $query->getNumRows();
}
public function getUpdateFailTime($vr_sq)
{
$sql = "select vr_sq, stat_cd, insert_user, insert_tm " .
"from v2_chg_stat " .
"where vr_sq = ? and stat_cd = '49' " .
"order by insert_tm desc " .
"limit 1";
$data = array($vr_sq);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
//v2_confirm INSERT
public function insertConfirm($vr_sq, $vrfc_type, $success, $type, $usr_id = '', $usr_sq = '')
{
if (empty($usr_sq))
$usr_sq = session('usr_sq');
if (empty($usr_id))
$usr_id = session('usr_id');
$sql = "INSERT INTO v2_confirm" .
"(vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, '" . date('YmdHis') . "', ?, NOW(), ?, NOW()) " .
" ON DUPLICATE KEY UPDATE" .
" success=values(success), type=values(type), charger=values(charger), date=values(date)
, update_user=values(update_user), update_tm=values(update_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$success,
$type,
$usr_id,
$usr_sq,
$usr_sq
);
$this->db->query($sql, $data);
}
public function updateConfirm($vr_sq, $vrfc_type, $success)
{
$data = [
'success' => $success,
];
$builder = $this->db->table('v2_confirm');
$builder->where('vr_sq', $vr_sq);
$builder->where('vrfc_type', $vrfc_type);
$builder->update($data);
return [
'error_number' => $this->db->error()['code'],
'error_message' => $this->db->error()['message']
];
}
public function InsResChar($atcl_vr_sq)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_article_info" .
" SET reg_charger = ?" .
" WHERE vr_sq = ?";
$data = array(
$usr_id,
$atcl_vr_sq
);
//echo $this->db->last_query();
$res = $this->db->query($sql, $data);
$log_v = $this->db->getLastQuery();
log_message('debug', $log_v);
}
public function add_cert_uncnfrm_status($vr_sq, $cert_uncnfrm_status)
{
$sql = "UPDATE v2_article_info_etc" .
" SET cert_uncnfrm_status = ?" .
" WHERE vr_sq = ?";
$data = array(
$cert_uncnfrm_status,
$vr_sq
);
$this->db->query($sql, $data);
}
public function insertChkList($vr_sq, $vrfc_type, $type, $code, $comment)
{ //v2_check_list INSERT
$usr_sq = session('usr_sq');
$sql = "INSERT INTO v2_check_list" .
"(vr_sq, vrfc_type, type, code, comment, insert_user, insert_tm)" .
"VALUES" .
"(?, ?, ?, ?, ?, ?, NOW())" .
" ON DUPLICATE KEY UPDATE" .
" vr_sq=values(vr_sq), vrfc_type=values(vrfc_type), type=values(type), code=values(code), comment=values(comment), insert_user=values(insert_user), insert_tm=values(insert_tm)";
$data = array(
$vr_sq,
$vrfc_type,
$type,
$code,
$comment,
$usr_sq
);
$this->db->query($sql, $data);
}
/**
* update updatedocument_cert_method
*/
public function updatedocument_cert_method($vr_sq, $document_cert_method)
{
$sql = "UPDATE v2_article_info_etc SET " .
" document_cert_method = ? " .
" WHERE vr_sq = ? ";
$document_cert_method = json_encode($document_cert_method, JSON_UNESCAPED_UNICODE);
if ($document_cert_method == 'false') {
$document_cert_method = NULL;
}
$data = array(
$document_cert_method,
$vr_sq
);
$this->db->query($sql, $data);
$s = $this->db->getLastQuery();
log_message('debug', "====updatedocument_cert_method:712====" . $s);
}
public function update_owner_verifiable($vr_sq, $owner_verifiable)
{
$sql = "UPDATE v2_vrfc_req" .
" SET owner_verifiable = ?" .
" WHERE vr_sq = ?";
$data = array(
$owner_verifiable,
$vr_sq
);
$this->db->query($sql, $data);
$s = $this->db->getLastQuery();
log_message('debug', "====update_owner_verifiable:712====" . $s);
}
/* 등기부등본 API 호출*/
public function getDatacertAPI($vr_sq, $vrfc_type = '')
{
// 요청정보
$sql = "SELECT vr_sq, atcl_no, step, cpid, cp_atcl_id, trade_type, realtor_nm, realtor_tel_no, seller_tel_no, vrfc_type, rgbk_confirm, req_type, rdate, stat_cd, try_cnt, insert_user, insert_tm, owner_verifiable" .
" FROM v2_vrfc_req where vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_vrfc_req = $query->getRowArray();
if (!empty($vrfc_type)) {
$row_vrfc_req['vrfc_type'] = $vrfc_type;
}
log_message('debug', 'getDatacertApi_query => ' . $this->db->getLastQuery());
log_message('debug', 'getDatacertApi_result => ' . json_encode($row_vrfc_req));
// 매물정보
$sql = "SELECT vr_sq, atcl_no, cpid, cp_atcl_id, rlet_type_cd, trade_type, address_code, address1, address2, address3, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sise, floor, rdate, seller_tel_no, seller_nm, realtor_nm, realtor_tel_no, hscp_no, hscp_nm, ptp_no, ptp_nm, charger, req_price_yn, reg_charger, dept1_sq, dept2_sq, reg_dept1_sq, reg_dept2_sq, floor2, vrfc_type_sub" .
" FROM v2_article_info where vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_article_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 수정정보
$sql = "SELECT vr_sq, bild_nm, rm_no, floor, address_code, address2, address3, trade_type, deal_amt, wrrnt_amt, lease_amt, isale_amt, prem_amt, sply_spc, excls_spc, tot_spc, grnd_spc, bldg_spc, hscp_no, hscp_nm, ptp_no, ptp_nm, modify_yn, floor2" .
" FROM v2_modify_info where vr_sq = ?";
$query = $this->db->query($sql, [$vr_sq]);
$row_modify_info = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 검증결과
$sql = "SELECT vr_sq, vrfc_type, success, type, charger, date, insert_user, insert_tm, update_user, update_tm, work_type" .
" FROM v2_confirm where vr_sq = ? and vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$row_confirm = $query->getRowArray();
log_message('debug', $this->db->getLastQuery());
// 확인정보
$sql = "SELECT a.type, a.code, a.comment, b.ownerNm, b.owner_birth" .
" FROM v2_check_list a " .
" INNER JOIN v2_article_info b on a.vr_sq = b.vr_sq" .
" WHERE a.vr_sq = ? and a.vrfc_type = ?";
$query = $this->db->query($sql, [$vr_sq, $row_vrfc_req['vrfc_type']]);
$res_check_list = $query->getResultArray();
log_message('debug', $this->db->getLastQuery());
log_message('debug', implode(', ', $row_confirm ?? []));
$atclNo = $row_vrfc_req['atcl_no'];
$type = $row_vrfc_req['try_cnt'];
$success = empty($row_confirm['success']) ? false : true;
$charger = $row_confirm['charger'] ?? '';
$date = $row_confirm['date'] ?? '';
switch ($row_vrfc_req['owner_verifiable']) {
case "1":
case "true":
$ownerVerifiable = true;
break;
default:
$ownerVerifiable = false;
break;
}
$checkList = [];
foreach ($res_check_list as $row) {
$checkList[] = [
'type' => $row['type'],
'code' => $row['code'],
'comment' => $row['comment'],
'ownerNm' => $row['ownerNm'],
'ownerBirth' => $row['owner_birth'],
];
}
$modifyInfo = [];
if ($row_modify_info['modify_yn'] == 'Y') {
if (!empty($row_modify_info['hscp_no'])) {
// 공동주택
$modifyInfo = [
'hscpNo' => $row_modify_info['hscp_no'],
'ptpNo' => $row_modify_info['ptp_no'],
'bildNm' => $row_modify_info['address2'],
'rmNo' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'isaleAmt' => $row_modify_info['isale_amt'],
'premAmt' => $row_modify_info['prem_amt'],
'floor' => $row_modify_info['floor'],
];
} else {
// 비공동주택
$modifyInfo = [
'addressCode' => $row_modify_info['address_code'],
'address2' => $row_modify_info['address2'],
'address3' => $row_modify_info['address3'],
'tradeType' => $row_modify_info['trade_type'],
'dealAmt' => $row_modify_info['deal_amt'],
'wrrntAmt' => $row_modify_info['wrrnt_amt'],
'leaseAmt' => $row_modify_info['lease_amt'],
'splySpc' => $row_modify_info['sply_spc'],
'exclsSpc' => $row_modify_info['excls_spc'],
'totSpc' => $row_modify_info['tot_spc'],
'grndSpc' => $row_modify_info['grnd_spc'],
'bldgSpc' => $row_modify_info['bldg_spc'],
'floor' => $row_modify_info['floor'],
'floor2' => $row_modify_info['floor2'],
];
}
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'modifyInfo' => $modifyInfo,
'date' => $date,
'vrfcType' => $row_article_info['vrfc_type_sub'],
'ownerVerifiable' => $ownerVerifiable,
];
} else {
return [
'atclNo' => $atclNo,
'type' => $type,
'success' => $success,
'checkList' => $checkList,
'charger' => $charger,
'date' => $date,
'vrfcType' => $row_article_info['vrfc_type_sub'],
'ownerVerifiable' => $ownerVerifiable,
];
}
}
public function get_send_yn($type)
{
$sql = "SELECT stop_yn
FROM v2_stop_api_chg_stat
WHERE TYPE = ?
ORDER BY pk DESC
LIMIT 1";
$date = array(
$type
);
$query = $this->db->query($sql, $date);
$return = $query->getRowArray();
return $return;
}
public function insert_v2_stop_api_save_info($atcl_no, $vr_sq, $type, $fax_sq)
{
$sql = "INSERT INTO v2_stop_api_save_info(atcl_no,vr_sq,type,status,stop_dt,fax_sq)" .
" VALUE(?,?,?,'stop',now(),?)";
$date = array(
$atcl_no,
$vr_sq,
$type,
$fax_sq
);
$this->db->query($sql, $date);
}
/**
* 712 소유자 확인 을 위한 쿼리
*/
public function getOwnerVerifiable($atcl_no)
{
$sql = "select * ,
case
when owner_verifiable = 'true' then '1'
when owner_verifiable = '1' then '1'
when owner_verifiable = 'false' then '0'
when owner_verifiable = '0' then '0'
ELSE null
END AS OwnerVerifiable_change
from v2_vrfc_req where atcl_no = ? ";
$data = array(
$atcl_no
);
$query = $this->db->query($sql, $data);
$row = $query->getRowArray();
return $row;
}
public function chgStat($vr_sq, $stat_cd, $insert_tm)
{ //상태변경 TABLE INSERT
$usr_sq = session('usr_sq');
$usr_id = session('usr_id');
$list = $this->get_detail($vr_sq);
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)" .
"VALUES (?, ?, ?, ?)" .
"ON DUPLICATE KEY " .
"UPDATE vr_sq=VALUES(vr_sq), stat_cd=VALUES(stat_cd), insert_user=VALUES(insert_user), insert_tm=VALUES(insert_tm)";
$data = array(
'vr_sq' => $vr_sq,
'stat_cd' => $stat_cd,
'usr_sq' => $usr_sq,
'insert_tm' => $insert_tm
);
$this->db->transStart();
$res = $this->db->query($sql, $data);
$return['error_number'] = $this->db->_error_number();
$return['error_message'] = $this->db->_error_message();
if (empty($return['error_number'])) {
//로그를 남긴다.
if ($this->db->affected_rows() > 0) {
if (!empty($changed)) {
$this->saveChangedHistory($list['data']['vr_sq'], $stat_cd, 'C9', $usr_id, "상태변경 저장"); //검증결과 변동사항 HISTORY
}
}
}
$this->db->transComplete();
}
public function chgStatVrfc($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('v2_vrfc_req');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
return [
'error_number' => $this->db->error()['code'],
'error_message' => $this->db->error()['message']
];
}
public function chgStatFax($vr_sq, $stat_cd)
{
$data = ['stat_cd' => $stat_cd];
$builder = $this->db->table('fax_imgs');
$builder->where('vr_sq', $vr_sq);
$builder->update($data);
return [
'error_number' => $this->db->error()['code'],
'error_message' => $this->db->error()['message']
];
}
//v2_vrfc_req try_cnt 값 변경.
public function chgRegiTryCnt($vr_sq, $try_cnt)
{
$sql = "UPDATE v2_vrfc_req" .
" SET reg_try_cnt = ?" .
" WHERE vr_sq = ?";
$data = array(
$try_cnt,
$vr_sq
);
$res = $this->db->query($sql, $data);
}
public function resetTelConf($vr_sq)
{
$sql = "update v2_check_list " .
"set code = '' " .
"where type in ('T11', 'T12', 'T13', 'T14') " .
"and vr_sq = ?";
$data = array($vr_sq);
$this->db->query($sql, $data);
}
// 메모저장
public function saveMemo($data)
{
$usr_id = session('usr_id');
$sql = "UPDATE v2_vrfc_req SET
memo = ?
WHERE vr_sq = ?";
if ($this->db->query($sql, $data) === false) {
return [
'success' => false,
'msg' => '파일정보 저장 실패',
];
}
$row = $this->getDetail($data[1]);
$memo = "메모변경 : " . $row['memo'] . " => " . $data[0];
$this->saveChangedHistory($data[1], $row['pre_stat_cd'], 'C19', $usr_id, $memo);
return [
'success' => true
];
}
// 정보변경 이력 저장
public function saveChangedHistory($vr_sq, $stat_cd, $chg_type, $usr_id, $memo)

1481
app/Models/v2/M713Model.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,207 @@
<?php
namespace App\Models\webfax;
use CodeIgnier\Model;
class FaxModel extends Model
{
/**
* FAX 내용중 하나만 가져오기
*/
public function selectFax($faxSq)
{
$sql = "SELECT mid, caller_no, recv_time, fax_sq, file_path, file_name, thumbnail, img_width, img_height, img_size" .
" FROM fax_imgs" .
" WHERE fax_sq = ?";
$data = array($faxSq);
$query = $this->db->query($sql, $data);
return $query->getRowArray();
}
public function selectFaxListNotExistsThumb()
{
helper('cron');
if (!isset($_SERVER["HOSTNAME"])) {
$_SERVER["HOSTNAME"] = get_linux_hostname();
}
if (empty($_SERVER["HOSTNAME"])) {
$_SERVER["HOSTNAME"] = "unknown";
}
$_SERVER["HOSTNAME"] = "unknown";
$data = [$_SERVER["HOSTNAME"]];
$sql = "UPDATE uds_tiff a" .
" SET a.etc1 = ?" .
" WHERE NOT EXISTS (SELECT 'x' FROM fax_imgs a1 WHERE a1.mid = a.mid)" .
" AND a.recv_time >= DATE_ADD(NOW(), INTERVAL -7 DAY)" .
" AND a.etc1 = ''" .
" limit 100";
$this->db->query($sql, $data);
$sql = "SELECT a.mid,a.eid,a.pages,a.caller_no,a.callee_no,a.file_name,REPLACE(a.save_path, a.file_name,'') save_path,a.file_size,a.recv_time,a.save_time" .
" FROM uds_tiff a" .
" WHERE NOT EXISTS (SELECT 'x' FROM fax_imgs a1 WHERE a1.mid = a.mid)" .
" AND a.recv_time >= DATE_ADD(NOW(), INTERVAL -7 DAY)" .
" AND a.etc1 = ?";
$query = $this->db->query($sql, $data);
return $query->getResultArray();
}
/**
* tiff 이미지 jpg로 변환 및 썸네일 생성
*/
public function insertFaxImgs($mid, $file_name, $file_path, $thumbnail, $img_width, $img_height, $img_size, $qrcode = '', $caller_no, $callee_no, $tiff_file_name, $tiff_save_path, $tiff_file_size, $recv_time, $save_time, $receiver)
{
$sql = "INSERT INTO fax_imgs" .
" (MID, file_name, file_path, thumbnail, img_width, img_height, img_size, qrcode, caller_no, callee_no, tiff_file_name, tiff_save_path, tiff_file_size, recv_time, save_time, receiver)" .
" VALUES" .
" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$data = [$mid, $file_name, $file_path, $thumbnail, $img_width, $img_height, $img_size, $qrcode, $caller_no, $callee_no, $tiff_file_name, $tiff_save_path, $tiff_file_size, $recv_time, $save_time, $receiver];
$this->db->query($sql, $data);
}
public function insertFaxImgs2($mid, $file_name, $file_path, $thumbnail, $img_width, $img_height, $img_size, $qrcode = '', $caller_no, $callee_no, $tiff_file_name, $tiff_save_path, $tiff_file_size, $recv_time, $save_time, $receiver)
{
$sql = "INSERT INTO fax_imgs" .
" (MID, file_name, file_path, thumbnail, img_width, img_height, img_size, qrcode, caller_no, callee_no, tiff_file_name, tiff_save_path, tiff_file_size, recv_time, save_time, receiver)" .
" VALUES" .
" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$data = [$mid, $file_name, $file_path, $thumbnail, $img_width, $img_height, $img_size, $qrcode, $caller_no, $callee_no, $tiff_file_name, $tiff_save_path, $tiff_file_size, $recv_time, $save_time, $receiver];
$this->db->query($sql, $data);
}
public function selectFaxListTran()
{
if (!isset($_SERVER["HOSTNAME"])) {
$_SERVER["HOSTNAME"] = get_linux_hostname();
}
$data = [$_SERVER["HOSTNAME"]];
$sql = "SELECT TR_MSGID, TR_TITLE, TR_SENDFAXNUM, TR_RECVFAXNUM, TR_RECVTIME, TR_FILENAMELIST" .
" FROM FC_RECV_TRAN a" .
" WHERE NOT EXISTS (SELECT 'x' FROM fax_imgs a1 WHERE a1.mid = a.TR_MSGID AND a1.receiver != 'uds_tiff')" .
" AND a.TR_RECVTIME >= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -7 DAY), '%Y%m%d%h%i%s')";
$query = $this->db->query($sql, $data);
return $query->getResultArray();
}
/**
* FAX이미지를 홍보확인서에서 선택할 경우...
*/
public function updateImgSqOnFaxImgs($faxSq, $imgSq)
{
$sql = "UPDATE fax_imgs" .
" SET img_sq = ?" .
" WHERE fax_sq = ?";
$data = [$imgSq, $faxSq];
$this->db->query($sql, $data);
}
/**
* 홍보확인서를 재지정했을 경우 기존의 홍보확인서는 선택되지 않음으로 ...
*/
public function updateImgSqNullOnFaxImgs($imgSq)
{
$sql = "UPDATE fax_imgs" .
" SET img_sq = null" .
" WHERE img_sq = ?";
$data = [$imgSq];
$this->db->query($sql, $data);
}
/**
* 비고를 지정한다.
*/
public function updateRemark($faxSq, $remark)
{
$sql = "UPDATE fax_imgs" .
" SET remark = ?" .
" WHERE fax_sq = ?";
$data = [$remark, $faxSq];
$this->db->query($sql, $data);
}
/**
* 홍보확인서의 주소가 업데이트 되었을 경우
* @param bigint $vr_sq receipt 테이블의 PK (rcpt_sq) 또는 v2_vrfc_req 테이블의 PK (vr_sq)
* @param string $address_code 법정동코드
* @param string $address2 상세주소
* @param string $address3 기타주소
* @param string $hscp_no 단지번호
* @param string $hscp_nm 단지명
*/
public function updateAddress($vr_sq, $address_code, $address2, $address3, $hscp_no, $hscp_nm)
{
$data = [];
if (!empty($address_code))
$data['address_code'] = $address_code;
if (!empty($address2))
$data['address2'] = $address2;
if (!empty($address3))
$data['address3'] = $address3;
// if (!empty($address4)) $data['address4'] = $address4;
if (!empty($hscp_no))
$data['hscp_no'] = $hscp_no;
if (!empty($hscp_nm))
$data['hscp_nm'] = $hscp_nm;
if (!empty($data)) {
$where = [
'vr_sq' => $vr_sq
];
$this->db->update('fax_imgs', $data, $where);
}
}
public function updateAddress2($vr_sq, $address_code, $address2, $address2a, $address2b, $address3, $hscp_no, $hscp_nm)
{
$data = array();
if (!empty($address_code))
$data['address_code'] = $address_code;
if (!empty($address2))
$data['address2'] = $address2;
if (!empty($address2))
$data['address2a'] = $address2a;
if (!empty($address2))
$data['address2b'] = $address2b;
if (!empty($address3))
$data['address3'] = $address3;
// if (!empty($address4)) $data['address4'] = $address4;
if (!empty($hscp_no))
$data['hscp_no'] = $hscp_no;
if (!empty($hscp_nm))
$data['hscp_nm'] = $hscp_nm;
if (!empty($data)) {
$where = [
'vr_sq' => $vr_sq
];
$this->db->update('fax_imgs', $data, $where);
}
}
/**
* 팩스건수 가져오기 -> 화면 최상단에 건수 보여줌.
*/
public function getFaxCount()
{
$sql = "SELECT
date_format(now(), '%H') as base_time
,(SELECT count(*) FROM uds_tiff where save_time >= concat(date_format(now(), '%Y-%m-%d %H'), ':00:00')) as enfax_count
,(SELECT COUNT(*) FROM FC_RECV_TRAN where TR_RECVTIME >= concat(date_format(now(), '%Y%m%d%H'), '0000')) as lgfax_count
";
$query = $this->db->query($sql);
$row = $query->getRowArray();
return $row;
}
}

View File

@@ -0,0 +1,89 @@
<?php
namespace App\Services\Handlers;
use CodeIgniter\CLI\CLI;
use App\Services\ParameterMapper\TypeSParameterMapper;
use App\Models\Entities\ReceiptModel;
use App\Models\Entities\ResultModel;
use App\Models\Entities\NaverRawStagingModel;
use Exception;
/**
* Type S 핸들러
* 현장확인 매물 (A01) 데이터 처리
*/
class TypeSHandler
{
private $receiptModel;
private $resultModel;
private $stagingModel;
private $db;
private $parameterMapper;
private $naverClient;
public function __construct()
{
$this->db = \Config\Database::connect();
$this->receiptModel = new ReceiptModel();
$this->resultModel = new ResultModel();
$this->stagingModel = new NaverRawStagingModel();
$this->parameterMapper = new TypeSParameterMapper();
$this->naverClient = new \App\Libraries\NaverApiClient();
helper('log');
}
/**
* Type S 메인 처리 로직
*/
public function handle(string $articleNumber, array $rawData, array $payload): int
{
CLI::write(CLI::color('🟢 Type S 처리 시작 :: ' . $articleNumber, 'green'));
$this->db->transBegin();
try {
// 1. Receipt 데이터 저장
$receiptData = $this->parameterMapper->mapReceipt($articleNumber, $rawData, $payload);
if (!$this->receiptModel->insert($receiptData)) {
throw new Exception("Receipt Insert 실패: " . json_encode($this->receiptModel->errors()));
}
$rcptSq = $this->receiptModel->getInsertID();
CLI::write(CLI::color("✅ Receipt 저장 성공 (ID: $rcptSq)", 'blue'));
// 2. Result 데이터 저장
$resultData = $this->parameterMapper->mapResult($rcptSq, $rawData);
if (!$this->resultModel->insert($resultData)) {
throw new Exception("Result Insert 실패");
}
CLI::write(CLI::color('✅ Result 저장 성공', 'blue'));
// 3. 트랜잭션 커밋
$this->db->transComplete();
if ($this->db->transStatus() === false) {
write_custom_log("Type S DB 트랜잭션 최종 실패", 'ERROR', 'service');
throw new Exception("Type S DB 트랜잭션 최종 실패");
}
// 4. 로그 기록
write_custom_log("Type S 처리 성공 | Atcl: $articleNumber | Rcpt_sq: $rcptSq", 'INFO', 'service');
write_custom_log("Receipt Insert SQL: " . (string)$this->receiptModel->getLastQuery(), 'INFO', 'service');
write_custom_log("Result Insert SQL: " . (string)$this->resultModel->getLastQuery(), 'INFO', 'service');
// 5. 네이버 예약 정보 동기화 (비동기)
try {
$syncResult = $this->naverClient->submitSyncResult($rawData['reserveNo'] ?? '');
write_custom_log("Naver Sync Result Response: " . json_encode($syncResult), 'INFO', 'service');
} catch (Exception $e) {
write_custom_log("Naver Sync 실패 (계속 진행): " . $e->getMessage(), 'WARN', 'service');
}
return $rcptSq;
} catch (Exception $e) {
$this->db->transRollback();
write_custom_log("Type S 처리 실패: " . $e->getMessage(), 'ERROR', 'service');
throw $e;
}
}
}

View File

@@ -0,0 +1,317 @@
<?php
namespace App\Services\Handlers;
use CodeIgniter\CLI\CLI;
use App\Services\ParameterMapper\TypeV2ParameterMapper;
use App\Models\Entities\VrfcReqModel;
use App\Models\Entities\V2articleinfoModel;
use App\Models\Entities\V2articleinfoetcModel;
use App\Models\Entities\V2modifyinfoModel;
use App\Models\Entities\V2urlimgsaveModel;
use App\Services\StatusService;
use Exception;
/**
* Type V2 핸들러
* 일반/서류/비공동 매물 (D04, F01 등) 데이터 처리
*/
class TypeV2Handler
{
private $vrfcReqModel;
private $articleInfoModel;
private $articleInfoEtcModel;
private $modifyInfoModel;
private $urlImgSaveModel;
private $statusService;
private $db;
private $parameterMapper;
public function __construct()
{
$this->db = \Config\Database::connect();
$this->vrfcReqModel = new VrfcReqModel();
$this->articleInfoModel = new V2articleinfoModel();
$this->articleInfoEtcModel = new V2articleinfoetcModel();
$this->modifyInfoModel = new V2modifyinfoModel();
$this->urlImgSaveModel = new V2urlimgsaveModel();
$this->statusService = new StatusService();
$this->parameterMapper = new TypeV2ParameterMapper();
helper('log');
}
/**
* Type V2 메인 처리 로직
*/
public function handle(string $articleNumber, array $rawData, array $payload): int
{
CLI::write(CLI::color('🟢 Type V2 처리 시작 :: ' . $articleNumber, 'green'));
try {
$requestType = $payload['requestType'] ?? 'REG';
switch ($requestType) {
case 'REG':
return $this->handleRegister($articleNumber, $rawData, $payload);
case 'MOD':
return $this->handleModify($articleNumber, $rawData, $payload);
case 'CNC':
return $this->handleCancel($articleNumber, $rawData, $payload);
default:
throw new Exception("알 수 없는 requestType: $requestType");
}
} catch (Exception $e) {
write_custom_log("Type V2 처리 실패: " . $e->getMessage(), 'ERROR', 'service');
throw $e;
}
}
/**
* 신규 등록 처리
*/
private function handleRegister(string $articleNumber, array $rawData, array $payload): int
{
CLI::write(CLI::color('🔵 V2 신규 등록 시작', 'cyan'));
// 파라미터 준비
$vrfcReqParam = $this->parameterMapper->mapVrfcReq($articleNumber, $rawData, $payload);
$articleInfoParam = $this->parameterMapper->mapArticleInfo($articleNumber, $rawData, $payload);
$articleInfoEtcParam = $this->parameterMapper->mapArticleInfoEtc($articleNumber, $rawData);
$modifyInfoParam = $this->parameterMapper->mapModifyInfo($articleNumber, $rawData, $payload);
// 검증 요청 저장 또는 업데이트
$vrSq = $this->insertOrUpdateVrfcReq($vrfcReqParam);
// 기사 정보 저장
$articleInfoParam['vr_sq'] = $vrSq;
if (!$this->articleInfoModel->replace($articleInfoParam)) {
throw new Exception("ArticleInfo Insert 실패: " . json_encode($this->db->error()));
}
CLI::write(CLI::color('✅ ArticleInfo 저장 성공', 'blue'));
// 기사 정보 추가 저장
$articleInfoEtcParam['vr_sq'] = $vrSq;
if (!$this->articleInfoEtcModel->replace($articleInfoEtcParam)) {
CLI::write(CLI::color('❌ ArticleInfoEtc 저장 실패 :: ' . json_encode($articleInfoEtcParam), 'red'));
throw new Exception("ArticleInfoEtc Insert 실패: " . json_encode($this->db->error()));
}
CLI::write(CLI::color('✅ ArticleInfoEtc 저장 성공', 'blue'));
// 수정 정보 입력 (있으면 update, 없으면 insert)
$modifyInfoParam['vr_sq'] = $vrSq;
$sql = $this->modifyInfoModel->builder()->set($modifyInfoParam)->getCompiledInsert();
CLI::write(CLI::color("\n[생성된 쿼리 예상안]:", 'yellow'));
CLI::write($sql);
if (!$this->modifyInfoModel->replace($modifyInfoParam)) {
CLI::write(CLI::color('❌ modifyInfoParam 저장 실패 :: ' . json_encode($modifyInfoParam), 'red'));
throw new Exception("ModifyInfo 저장 실패: " . json_encode($this->db->error() . " sql: " . $this->modifyInfoModel->getLastQuery()));
}
CLI::write(CLI::color('✅ ModifyInfo 저장 성공', 'blue'));
// URL 이미지 저장 (v2_url_img_save 테이블)
$files = $rawData['files'] ?? [];
if (!empty($files)) {
$fileExtracted = $this->parameterMapper->extractFilesByType($files);
$this->saveUrlImagesToDb($fileExtracted, $articleNumber, $vrSq);
}
// 상태 기록
$this->statusService->recordStatusAndHistory($vrSq, '10', 'C9', "NEW 신규접수 : 10");
write_custom_log("V2 신규 등록 성공 | Atcl: $articleNumber | VR_SQ: $vrSq", 'INFO', 'service');
return $vrSq;
}
/**
* 수정 처리
*/
private function handleModify(string $articleNumber, array $rawData, array $payload): int
{
CLI::write(CLI::color('🔵 V2 수정 시작', 'cyan'));
// 기존 검증 요청 확인
$existing = $this->vrfcReqModel->where('atcl_no', $articleNumber)->first();
if (!$existing) {
throw new Exception("수정할 기존 데이터가 없습니다. Atcl: $articleNumber");
}
$vrSq = $existing['vr_sq'];
$stat_cd = $existing['stat_cd'];
// 파라미터 준비 (MOD 타입)
$vrfcReqParam = $this->parameterMapper->mapVrfcReq($articleNumber, $rawData, $payload);
$articleInfoParam = $this->parameterMapper->mapArticleInfo($articleNumber, $rawData, $payload);
$articleInfoEtcParam = $this->parameterMapper->mapArticleInfoEtc($articleNumber, $rawData);
$modifyInfoParam = $this->parameterMapper->mapModifyInfo($articleNumber, $rawData, $payload);
$vrfcReqParam['stat_cd'] = '30';
$vrfcReqParam['insert_tm'] = date('Y-m-d H:i:s');
$vrfcReqParam['sync_yn'] = 'Y';
// 데이터 업데이트
if (!$this->vrfcReqModel->update($vrSq, $vrfcReqParam)) {
throw new Exception("VrfcReq Update 실패");
}
// 기사 정보 저장
$articleInfoParam['vr_sq'] = $vrSq;
if (!$this->articleInfoModel->replace($articleInfoParam)) {
throw new Exception("ArticleInfo Insert 실패: " . json_encode($this->db->error()));
}
CLI::write(CLI::color('✅ ArticleInfo 저장 성공', 'blue'));
// 기사 정보 추가 저장
$articleInfoEtcParam['vr_sq'] = $vrSq;
if (!$this->articleInfoEtcModel->replace($articleInfoEtcParam)) {
throw new Exception("ArticleInfoEtc Insert 실패: " . json_encode($this->db->error()));
}
CLI::write(CLI::color('✅ ArticleInfoEtc 저장 성공', 'blue'));
// 수정 정보 입력 (있으면 update, 없으면 insert)
if (!$this->modifyInfoModel->saveModifyInfo($vrSq, $modifyInfoParam)) {
throw new Exception("ModifyInfo 저장 실패: " . json_encode($this->db->error()));
}
CLI::write(CLI::color('✅ ModifyInfo 저장 성공', 'blue'));
// URL 이미지 저장 (v2_url_img_save 테이블)
$files = $rawData['files'] ?? [];
if (!empty($files)) {
$fileExtracted = $this->parameterMapper->extractFilesByType($files);
$this->saveUrlImagesToDb($fileExtracted, $articleNumber, $vrSq);
}
$this->statusService->recordStatusAndHistory($vrSq, '30', 'C9', "재접수 상태변경 : {$stat_cd} => 30");
CLI::write(CLI::color('✅ VrfcReq 수정 성공', 'blue'));
return $vrSq;
}
/**
* 취소 처리
*/
private function handleCancel(string $articleNumber, array $rawData, array $payload): int
{
CLI::write(CLI::color('🔵 V2 취소 시작', 'cyan'));
// 기존 검증 요청 확인
$existing = $this->vrfcReqModel->where('atcl_no', $articleNumber)->first();
if (!$existing) {
throw new Exception("취소할 기존 데이터가 없습니다. Atcl: $articleNumber");
}
$vrSq = $existing['vr_sq'];
$stat_cd = $existing['stat_cd'];
// 파라미터 준비 (MOD 타입)
$vrfcReqParam = $this->parameterMapper->mapVrfcReq($articleNumber, $rawData, $payload);
$vrfcReqParam['stat_cd'] = '19';
$vrfcReqParam['insert_tm'] = date('Y-m-d H:i:s');
$vrfcReqParam['req_type'] = 'D';
// 상태를 취소로 업데이트
if (!$this->vrfcReqModel->update($vrSq, $vrfcReqParam)) {
throw new Exception("VrfcReq Cancel 실패");
}
$this->statusService->recordStatusAndHistory($vrSq, '19', 'C9', "재접수 상태변경 : {$stat_cd} => 19");
CLI::write(CLI::color('✅ 취소 처리 완료', 'blue'));
write_custom_log("V2 취소 성공 | Atcl: $articleNumber | VR_SQ: $vrSq", 'INFO', 'service');
return $vrSq;
}
/**
* 검증 요청 저장 또는 업데이트
*/
private function insertOrUpdateVrfcReq(array $vrfcReqParam): int
{
$articleNumber = $vrfcReqParam['atcl_no'];
$existing = $this->vrfcReqModel->where('atcl_no', $articleNumber)->first();
if ($existing) {
// 업데이트
$vrSq = $existing['vr_sq'] ?? $existing['id'];
CLI::write(CLI::color("🟡 기존 데이터 발견 (atcl_no: $articleNumber) -> 업데이트", 'yellow'));
if (!$this->vrfcReqModel->update($vrSq, $vrfcReqParam)) {
$this->logAndThrowError($vrfcReqParam, "VrfcReq Update 실패 :: $articleNumber");
}
CLI::write(CLI::color("✅ Update 성공 (vr_sq: $vrSq)", 'blue'));
return $vrSq;
} else {
// 신규 등록
if (!$this->vrfcReqModel->insert($vrfcReqParam)) {
$this->logAndThrowError($vrfcReqParam, "VrfcReq Insert 실패 :: $articleNumber");
}
$vrSq = $this->vrfcReqModel->getInsertID();
CLI::write(CLI::color("✅ Insert 성공 (vr_sq: $vrSq, atcl_no: $articleNumber)", 'blue'));
return $vrSq;
}
}
/**
* 에러 로깅 및 예외 발생
*/
private function logAndThrowError(array $data, string $message): void
{
$dbError = $this->db->error();
CLI::write(CLI::color('❌ SQL ERROR', 'red', 'bold'));
CLI::write(CLI::color('메시지: ', 'white') . $dbError['message']);
CLI::write(CLI::color('쿼리: ', 'white') . (string)$this->vrfcReqModel->getLastQuery());
throw new Exception($message . ": " . $dbError['message']);
}
/**
* URL 이미지를 v2_url_img_save 테이블에 저장
*
* @param array $fileExtracted extractFilesByType로 추출된 파일 배열
* @param string $atclNo 기사번호
* @param int $vrSq 검증요청ID
*/
private function saveUrlImagesToDb(array $fileExtracted, string $atclNo, int $vrSq): void
{
$fileTypes = [
'certRegister' => '2', // 등기부등본
'confirmDocImgUrl' => '2', // 확인서이미지
'referenceFileUrl' => '1' // 홍보자료
];
$saveCount = 0;
foreach ($fileTypes as $key => $type) {
if (!empty($fileExtracted[$key]) && is_array($fileExtracted[$key])) {
foreach ($fileExtracted[$key] as $url) {
if (!empty($url)) {
$insertData = [
'url' => $url,
'type' => $type,
'atcl_no' => $atclNo,
'vr_sq' => $vrSq,
'status' => 'save',
'try_cnt' => 0
];
if ($this->urlImgSaveModel->insert($insertData)) {
$saveCount++;
} else {
CLI::write(CLI::color("⚠️ URL 저장 실패: $url", 'yellow'));
}
}
}
}
}
if ($saveCount > 0) {
CLI::write(CLI::color("✅ URL 이미지 저장 완료: $saveCount개", 'blue'));
write_custom_log("URL 이미지 저장 | Atcl: $atclNo | VR_SQ: $vrSq | Count: $saveCount", 'INFO', 'service');
}
}
}

View File

@@ -2,245 +2,82 @@
namespace App\Services;
use CodeIgniter\CLI\CLI;
use App\Libraries\NaverApiClient;
use App\Models\Entities\VrfcReqModel;
use App\Models\Entities\V2stdailyModel;
use App\Models\Entities\V2chgstatModel;
use App\Models\Entities\V2chghistoryModel;
use App\Models\Entities\NaverRawStagingModel;
use App\Services\Handlers\TypeSHandler;
use App\Services\Handlers\TypeV2Handler;
use Exception;
/**
* 네이버 부동산 매물 처리 서비스
*
* 네이버 API 응답을 받아서 타입별 처리 로직으로 위임하는 오케스트레이터 역할
* - Type S: 현장확인 (A01)
* - Type V2: 일반/서류/비공동 (D04, F01 등)
*/
class NaverService
{
protected $naverClient, $VrfcReqModel, $V2stdailyModel, $V2chgstatModel, $V2chghistoryModel;
private $db;
private $naverClient;
private $rawStagingModel;
private $typeSHandler;
private $typeV2Handler;
public function __construct()
{
$this->db = \Config\Database::connect();
$this->naverClient = new NaverApiClient();
$this->VrfcReqModel = model(VrfcReqModel::class);
$this->V2stdailyModel = model(V2stdailyModel::class);
$this->V2chgstatModel = model(V2chgstatModel::class);
$this->V2chghistoryModel = model(V2chghistoryModel::class);
helper('log');
$this->rawStagingModel = new NaverRawStagingModel();
$this->typeSHandler = new TypeSHandler();
$this->typeV2Handler = new TypeV2Handler();
helper('log');
}
/**
* 메인 프로세스: 요청 타입에 따른 분기 처리
* 메인 프로세스: 네이버 API 호출 및 타입별 처리
*
* @param array $payload 요청 페이로드 (articleNumber, requestType 등)
* @return int 처리된 ID (rcpt_sq 또는 vr_sq)
* @throws Exception
*/
public function processArticle(array $payload)
public function processArticle(array $payload): int
{
$articleNumber = $payload['articleNumber'];
$requestType = $payload['requestType'] ?? '';
// 1. 네이버 API 호출
$response = $this->naverClient->getArticleInfo($articleNumber);
if (!$response || $response['code'] !== 'success') {
throw new \Exception("네이버 API 응답 에러: $articleNumber");
}
$vrfcParams = $this->mapToDatabaseParams($response['data'], $payload);
write_custom_log("PROCESS_START | Type: $requestType | Atcl: $articleNumber", 'INFO', 'service');
switch ($requestType) {
case 'REG': // 신규 등록
$vr_sq = $this->insertVrfcReq($articleNumber, $vrfcParams);
if ($vr_sq) $this->V2stdailyModel->set_v2_st_daily(null, $vrfcParams['cpid'], $vrfcParams['vrfc_type'] . '0103', '1', 'add');
break;
case 'MOD': // 수정
$vr_sq = $this->updateVrfcReq($articleNumber, $vrfcParams);
if ($vr_sq) $this->V2stdailyModel->set_v2_st_daily(null, $vrfcParams['cpid'], $vrfcParams['vrfc_type'] . '0102', '1', 'add');
break;
case 'CNC': // 취소
$vr_sq = $this->deleteVrfcReq($articleNumber, $vrfcParams);
if ($vr_sq) $this->V2stdailyModel->set_v2_st_daily(null, $vrfcParams['cpid'], 'A0101', '1', 'add');
break;
case 'FIN': // 완료
$vr_sq = $this->finVrfcReq($articleNumber, $vrfcParams);
break;
default:
throw new \Exception("알 수 없는 requestType: $requestType");
}
return ['vr_sq' => $vr_sq, 'articleNumber' => $articleNumber];
}
/**
* [REG] 신규 등록
*/
private function insertVrfcReq($articleNumber, $params)
{
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)->first();
if ($existing) throw new \Exception("중복 등록 시도: $articleNumber");
$params['stat_cd'] = '10';
$params['insert_user'] = '0';
$params['req_type'] = 'C';
if (!$this->VrfcReqModel->insert($params)) {
$sql = (string)$this->VrfcReqModel->getLastQuery();
write_custom_log("INSERT_FAILED | Atcl: $articleNumber | SQL: $sql", 'ERROR', 'failed');
throw new \Exception("신규 등록 실패");
}
$vr_sq = $this->VrfcReqModel->getInsertID();
$this->recordStatusAndHistory($vr_sq, '10', 'C9', "신규접수 : 10");
return $vr_sq;
}
/**
* [MOD] 수정 처리
*/
private function updateVrfcReq($articleNumber, $params)
{
$existing = $this->findExisting($articleNumber);
if (!$existing) return $this->insertVrfcReq($articleNumber, $params);
$params['stat_cd'] = '30';
$params['req_type'] = 'U';
$params['insert_tm'] = db_now();
return $this->updateProcess($existing, $params, 'MOD', "재접수 상태변경: {$existing['stat_cd']} => 30");
}
/**
* [CNC] 취소 처리
*/
private function deleteVrfcReq($articleNumber, $params)
{
$existing = $this->findExisting($articleNumber);
$params['stat_cd'] = '19';
$params['req_type'] = 'D';
return $this->updateProcess($existing, $params, 'CNC', "취소 처리: {$existing['stat_cd']} => 19");
}
/**
* [FIN] 완료 처리
*/
private function finVrfcReq($articleNumber, $params)
{
$existing = $this->findExisting($articleNumber);
$params['stat_cd'] = '60';
$params['req_type'] = 'F';
return $this->updateProcess($existing, $params, 'FIN', "완료 처리: {$existing['stat_cd']} => 60");
}
// --- 내부 공통 유틸리티 함수 ---
private function findExisting($articleNumber) {
$existing = $this->VrfcReqModel->where('atcl_no', $articleNumber)->first();
if (!$existing) throw new \Exception("해당 매물 없음: $articleNumber");
return $existing;
}
/**
* 공통 업데이트 및 이력 기록 로직 (Lock 최소화)
*/
private function updateProcess($existing, $params, $type, $memo)
{
$vr_sq = $existing['vr_sq'];
CLI::write(CLI::color('🟢 getArticleInfo Start :: ' . $articleNumber, 'green'));
if (!$this->VrfcReqModel->update($vr_sq, $params)) {
$sql = (string)$this->VrfcReqModel->getLastQuery();
write_custom_log("UPDATE_FAILED | Type: $type | vr_sq: $vr_sq | SQL: $sql", 'ERROR', 'failed');
throw new \Exception("[$type] 업데이트 실패");
}
$this->recordStatusAndHistory($vr_sq, $params['stat_cd'], 'C9', $memo);
return $vr_sq;
}
/**
* 상태 및 이력 테이블 기록 (독립적 에러 처리)
*/
private function recordStatusAndHistory($vr_sq, $stat_cd, $chg_type, $memo)
{
// 1. 상태(stat) 저장
try {
$this->V2chgstatModel->saveChgstat([
'vr_sq' => $vr_sq, 'stat_cd' => $stat_cd, 'insert_user' => '0', 'insert_tm' => db_now()
], 'I');
} catch (\Exception $e) {
write_custom_log("STAT_SAVE_ERR | vr_sq: $vr_sq | Msg: " . $e->getMessage(), 'ERROR', 'failed');
}
// 2. 이력(history) 저장
try {
$this->V2chghistoryModel->v2_savehistory([
'vr_sq' => $vr_sq, 'stat_cd' => $stat_cd, 'chg_type' => $chg_type,
'memo' => $memo, 'insert_id' => 'SYSTEM', 'insert_tm' => db_now()
]);
} catch (\Exception $e) {
write_custom_log("HIST_SAVE_ERR | vr_sq: $vr_sq | Msg: " . $e->getMessage(), 'ERROR', 'failed');
}
}
/**
* API 데이터를 DB 컬럼에 맞게 변환
*/
private function mapToDatabaseParams(array $articleInfo, array $payload): array
{
$files = $articleInfo['files'] ?? [];
$certRegister = [];
$confirm_doc_img_url = [];
$referenceFileUrl = [];
$requestDatetime = date('YmdHis', strtotime($payload['requestDatetime'] ?? 'now'));
foreach ($files as $file) {
$fileTypeCode = $file['fileTypeCode'];
if ($fileTypeCode == 'RCDOC') {
$certRegister[] = $file['fileUrl'];
} elseif ($fileTypeCode == 'ADDOC') {
$confirm_doc_img_url[] = $file['fileUrl'];
} elseif ($fileTypeCode == 'REFER') {
$referenceFileUrl[] = $file['fileUrl'];
// 1. 네이버 API 호출
$response = $this->naverClient->getArticleInfo($articleNumber);
if (!$response || $response['code'] !== 'success') {
throw new Exception("네이버 API 응답 에러: $articleNumber");
}
$rawData = $response['data'];
$vType = $rawData['verificationTypeCode'] ?? '';
// 2. 원본 데이터 Staging 저장
$this->rawStagingModel->insert([
'atcl_no' => $articleNumber,
'verification_type' => $vType,
'request_type' => $requestType,
'raw_json' => $rawData
]);
CLI::write(CLI::color('🟢 임시테이블 저장 완료', 'green'));
// 3. 타입별 분기 처리
if ($vType === 'S') {
return $this->typeSHandler->handle($articleNumber, $rawData, $payload);
} else {
return $this->typeV2Handler->handle($articleNumber, $rawData, $payload);
}
} catch (Exception $e) {
write_custom_log("processArticle 실패: " . $e->getMessage(), 'ERROR', 'service');
throw $e;
}
$vrfc_params = [
'reqSeq' => '',
'atcl_no' => $articleInfo['articleNumber'],
'step' => '',
'cpid' => $articleInfo['cpId'],
'cp_atcl_id' => $articleInfo['cpArticleNumber'],
'trade_type' => $articleInfo['tradeTypeCode'],
'realtor_nm' => $articleInfo['realtor']['realtorName'],
'realtor_tel_no' => $articleInfo['realtor']['representativeCellphoneNumber'],
'seller_tel_no' => $articleInfo['seller']['sellerTelephoneNumber'],
'vrfc_type' => $articleInfo['verificationTypeCode'],
'rgbk_confirm' => $articleInfo['isUnregisteredVerificationRequested'] ? 'Y' : 'N',
'req_type' => '',
'rdate' => $requestDatetime ?? db_now('Y-m-d H:i:s'),
'cpTelNo' => $articleInfo['seller']['sellerTelephoneNumber'],
'stat_cd' => '',
'try_cnt' => '0',
'insert_user' => '',
'insert_tm' => db_now(),
'memo' => '',
'contact_fail_cnt' => '0',
'sync_yn' => 'Y',
'reg_try_cnt' => '0',
'tel_fail_cause' => null,
'rgbk_confirm_owner_nm' => $articleInfo['seller']['ownerName'] ?? null,
'direct_trad_yn' => $articleInfo['seller']['isDirectTrade'] === true ? 'Y' : 'N',
'confirm_doc_img_url' => empty($confirm_doc_img_url) ? null : json_encode($confirm_doc_img_url, JSON_UNESCAPED_UNICODE),
'confirm_doc_owner_check_yn' => '',
'owner_verifiable' => null,
'vrfc_cmpl_type' => null,
'rgbk_doc_img_url' => null,
'certRegister' => empty($certRegister) ? null : json_encode($certRegister, JSON_UNESCAPED_UNICODE),
'referenceFileUrl' => empty($referenceFileUrl) ? null : json_encode($referenceFileUrl, JSON_UNESCAPED_UNICODE),
];
return $vrfc_params;
}
}

View File

@@ -0,0 +1,139 @@
<?php
namespace App\Services\ParameterMapper;
/**
* 파라미터 매퍼 기본 추상 클래스
* 네이버 API 응답을 데이터베이스 파라미터로 변환하는 로직을 정의
*/
abstract class BaseParameterMapper
{
protected $db;
public function __construct()
{
$this->db = \Config\Database::connect();
helper('log');
}
/**
* 추상 메서드: 매핑 로직 구현
*/
abstract public function map(string $articleNumber, array $rawData, array $payload): array;
/**
* 소유자 타입 코드 변환
*/
protected function mapOwnerTypeCode(?string $ownerTypeCodeRaw): ?int
{
return match($ownerTypeCodeRaw) {
"INDIV" => 0,
"CORP" => 1,
"FRGNR" => 2,
"DELEG" => 3,
default => null,
};
}
/**
* 거래 유형 변환
*/
protected function mapTradeType(?string $tradeType): ?string
{
return match(trim($tradeType ?? '')) {
'매매' => 'A1',
'전세' => 'B1',
'월세' => 'B2',
'단기임대' => 'B3',
default => null,
};
}
/**
* 파일 배열 추출 (save_yn 플래그 포함)
*/
public function extractFilesByType(array $files): array
{
$certRegister = [];
$confirmDocImgUrl = [];
$referenceFileUrl = [];
foreach ($files as $file) {
$fileTypeCode = $file['fileTypeCode'] ?? '';
$fileUrl = $file['originalFileUrl'] ?? '';
switch ($fileTypeCode) {
case 'RCDOC':
$certRegister[] = $fileUrl;
break;
case 'ADDOC':
$confirmDocImgUrl[] = $fileUrl;
break;
case 'REFER':
$referenceFileUrl[] = $fileUrl;
break;
}
}
return [
'certRegister' => $certRegister,
'confirmDocImgUrl' => $confirmDocImgUrl,
'referenceFileUrl' => $referenceFileUrl,
'cert_register_save_yn' => !empty($certRegister) ? 'Y' : 'N',
'confirm_doc_img_url_save_yn' => !empty($confirmDocImgUrl) ? 'Y' : 'N',
'reference_file_url_save_yn' => !empty($referenceFileUrl) ? 'Y' : 'N',
];
}
/**
* 파일 URL을 v2_url_img_save 테이블에 저장
* @param array $files 파일 배열
* @param string $atclNo 매물번호
* @param int $vrSq 검증요청순번
*/
protected function saveUrlImagesToDb(array $files, string $atclNo, int $vrSq): bool
{
if (empty($files)) {
return true;
}
$urlImgModel = new \App\Models\Entities\V2urlimgsaveModel();
foreach ($files as $file) {
$fileTypeCode = $file['fileTypeCode'] ?? '';
$fileUrl = $file['originalFileUrl'] ?? '';
if (empty($fileUrl)) {
continue;
}
// type 매핑: RCDOC, ADDOC = 2(등기), REFER = 1(홍보)
$type = in_array($fileTypeCode, ['RCDOC', 'ADDOC']) ? '2' : '1';
$data = [
'url' => $fileUrl,
'type' => $type,
'atcl_no' => $atclNo,
'vr_sq' => $vrSq,
'status' => 'save',
'try_cnt' => 0,
'server_nm' => gethostname(),
];
if (!$urlImgModel->insert($data)) {
write_custom_log("URL 이미지 저장 실패: " . json_encode($data), 'ERROR', 'service');
return false;
}
}
return true;
}
/**
* 필수 필드 안전하게 로드
*/
protected function getSafeData(array $data, string $key, $default = null)
{
return $data[$key] ?? $default;
}
}

View File

@@ -0,0 +1,131 @@
<?php
namespace App\Services\ParameterMapper;
/**
* Type S 파라미터 매퍼
* 현장확인 매물 (A01 등) 데이터를 Receipt 테이블용 파라미터로 변환
*/
class TypeSParameterMapper extends BaseParameterMapper
{
/**
* Receipt 테이블용 파라미터 생성
*/
public function mapReceipt(string $articleNumber, array $rawData, array $payload): array
{
$now = db_now();
$address = $rawData['address'] ?? [];
$space = $rawData['space'] ?? [];
$price = $rawData['price'] ?? [];
$floor = $rawData['floor'] ?? [];
$seller = $rawData['seller'] ?? [];
$realtor = $rawData['realtor'] ?? [];
// 평면도 여부 결정
$groundPlan = in_array($rawData['realEstateTypeCode'] ?? '', ['C01', 'C02']) ? 'N' : 'Y';
// 거래 유형 매핑
$tradeType = $this->mapTradeType($rawData['tradeType'] ?? null);
return [
'comp_sq' => '2',
'rcpt_rating' => '3',
'rcpt_key' => $articleNumber,
'rcpt_atclno' => $articleNumber,
'rcpt_product' => $rawData['realEstateTypeCode'] ?? null,
'rcpt_product_nm' => $rawData['realEstateType'] ?? null,
'rcpt_product_info1' => $rawData['tradeType'] ?? null,
'rcpt_product_info2' => $price['dealAmount'] ?? '0',
'rcpt_product_info4' => $price['preSaleAmount'] ?? '0',
'rcpt_product_info5' => $price['premiumAmount'] ?? '0',
'rcpt_living_yn' => ($rawData['site']['isRegistration'] ?? false) ? 'Y' : 'N',
'rcpt_agent' => $realtor['realtorName'] ?? null,
'rcpt_sido' => mb_substr($address['legalDivision']['cityNumber'] ?? '', 0, 5),
'rcpt_gugun' => mb_substr($address['legalDivision']['divisionNumber'] ?? '', 0, 10),
'rcpt_dong' => $address['legalDivision']['sectorNumber'] ?? null,
'rcpt_hscp_nm' => $address['complexName'] ?? null,
'rcpt_hscp_no' => $address['complexNumber'] ?? null,
'rcpt_ptp_nm' => null,
'rcpt_ptp_no' => $address['pyeongTypeNumber'] ?? null,
'rcpt_dtl_addr' => trim(
($address['legalDivision']['legalDivisionAddress'] ?? '') .
($address['buildingName'] ?? '') .
'동 ' . ($address['hoName'] ?? '') . '호'
),
'rcpt_etc_addr' => $address['hoName'] ?? null,
'rcpt_floor' => $floor['correspondenceFloorCount'] ?? null,
'rcpt_floor2' => $floor['totalFloorCount'] ?? null,
'rcpt_exps_type' => '',
'rcpt_exp_photo_yn' => 'Y',
'rcpt_deal_type' => $rawData['tradeTypeCode'] ?? null,
'trade_type' => $tradeType,
'ground_plan' => $groundPlan,
'excls_spce' => $space['exclusiveSpace'] ?? null,
'sply_spc' => $space['supplySpace'] ?? null,
'tot_spc' => $space['totalSpace'] ?? null,
'grnd_spc' => $space['groundSpace'] ?? null,
'bldg_spc' => $space['buildingSpace'] ?? null,
'share_spc' => ($space['supplySpace'] ?? 0) - ($space['exclusiveSpace'] ?? 0),
'room_cnt' => $rawData['facilities']['roomCount'] ?? null,
'cupnNo' => $rawData['couponNumber'] ?? null,
'roomSiteAtclRgstCnt' => $rawData['site']['monthlyRegisterCount'] ?? null,
'roomSiteAtclExpsCnt' => $rawData['site']['monthlyExposureCount'] ?? null,
'direct_trad_yn' => ($seller['isDirectTrade'] ?? false) ? 'Y' : 'N',
'sellr_nm' => $seller['sellerName'] ?? null,
'sellr_tel_no' => $seller['sellerTelephoneNumber'] ?? null,
'rcpt_ref_addr' => $address['etcAddress'] ?? null,
'rcpt_tm' => $now,
'rcpt_stat' => '100000',
'rcpt_x' => $address['longitude'] ?? null,
'rcpt_y' => $address['latitude'] ?? null,
'agent_id' => '',
'agent_nm' => $realtor['realtorName'] ?? null,
'agent_head_tel' => $realtor['representativeCellphoneNumber'] ?? null,
'rsrv_date' => $rawData['site']['visitReserveDate'] ?? null,
'rsrv_tm_ap' => '00',
'insert_tm' => $now,
'rcpt_cpid' => $rawData['cpId'] ?? 'naver',
'isSiteVRVerification' => ($rawData['site']['isVrVerification'] ?? false) ? 'Y' : 'N',
'isPromotionApply' => ($rawData['site']['isVrRepresentativeApply'] ?? false) ? 'Y' : 'N',
];
}
/**
* Result 테이블용 파라미터 생성
*/
public function mapResult(int $rcptSq, array $rawData): array
{
$now = db_now();
// VR 검증 여부에 따른 담당자 설정
$deptSq = ($rawData['site']['isVrVerification'] ?? false) ? '29' : null;
$usrSq = ($rawData['site']['isVrVerification'] ?? false) ? '1993' : null;
return [
'rcpt_sq' => $rcptSq,
'use_yn' => 'Y',
'cust_nm' => '',
'rsrv_date' => $rawData['site']['visitReserveDate'] ?? null,
'rsrv_tm_ap' => '00',
'result_cd1' => '10',
'result_cd2' => '1000',
'result_cd3' => '100000',
'insert_tm' => $now,
'insert_usr' => 0,
'update_tm' => $now,
'update_usr' => 0,
'dept_sq' => $deptSq,
'usr_sq' => $usrSq,
'resYn' => ($rawData['site']['isRegistration'] ?? false) ? 'Y' : 'N',
];
}
/**
* 인터페이스 구현: 기본 map 메서드
* (실제로는 mapReceipt와 mapResult를 분리하여 사용)
*/
public function map(string $articleNumber, array $rawData, array $payload): array
{
return $this->mapReceipt($articleNumber, $rawData, $payload);
}
}

View File

@@ -0,0 +1,276 @@
<?php
namespace App\Services\ParameterMapper;
/**
* Type V2 파라미터 매퍼
* 일반/서류/비공동 매물 데이터를 V2 테이블용 파라미터로 변환
*/
class TypeV2ParameterMapper extends BaseParameterMapper
{
/**
* V2 검증 요청 파라미터 생성
*/
public function mapVrfcReq(string $articleNumber, array $rawData, array $payload): array
{
$now = db_now();
$step = $rawData['step'] ?? '00';
$rdate = date("YmdHis", strtotime($payload['requestDate'] ?? db_now('YmdHis')));
$files = $rawData['files'] ?? [];
$fileExtracted = $this->extractFilesByType($files);
$reqType = $this->mapRequestType($payload['requestType'] ?? '');
return [
'reqSeq' => '',
'atcl_no' => $articleNumber,
'step' => $step,
'cpid' => $rawData['cpId'] ?? 'naver',
'cp_atcl_id' => $rawData['cpArticleNumber'] ?? '',
'trade_type' => $rawData['tradeTypeCode'] ?? '',
'realtor_nm' => $rawData['realtor']['realtorName'] ?? null,
'realtor_tel_no' => $rawData['realtor']['representativeCellphoneNumber'] ?? null,
'seller_tel_no' => $rawData['seller']['cellphoneNumber'] ?? null,
'vrfc_type' => $rawData['verificationTypeCode'] ?? 'D',
'rgbk_confirm' => ($rawData['isNeedRegisterBookConfirm'] ?? false) ? 'Y' : 'N',
'req_type' => $reqType,
'rdate' => $rdate,
'cpTelNo' => null,
'stat_cd' => '10',
'insert_user' => 0,
'insert_tm' => $now,
'sync_yn' => 'N',
'rgbk_confirm_owner_nm' => null,
'direct_trad_yn' => ($rawData['seller']['isDirectTrade'] ?? false) ? 'Y' : 'N',
'confirm_doc_img_url' => json_encode($fileExtracted['confirmDocImgUrl']),
'confirm_doc_owner_check_yn' => ($rawData['seller']['isOwnerCertificationAgree'] ?? false) ? 'Y' : 'N',
'certRegister' => json_encode($fileExtracted['certRegister']),
'referenceFileUrl' => json_encode($fileExtracted['referenceFileUrl']),
];
}
/**
* 기사 정보 파라미터 생성
*/
public function mapArticleInfo(string $articleNumber, array $rawData, array $payload): array
{
$address = $rawData['address'] ?? [];
$space = $rawData['space'] ?? [];
$price = $rawData['price'] ?? [];
$floor = $rawData['floor'] ?? [];
$seller = $rawData['seller'] ?? [];
$realtor = $rawData['realtor'] ?? [];
$files = $rawData['files'] ?? [];
$fileExtracted = $this->extractFilesByType($files);
$ownerTypeCode = $this->mapOwnerTypeCode($rawData['ownerTypeCode'] ?? null);
$ownerCheckYn = ($seller['isOwnerCertificationAgree'] ?? false) ? 'Y' : 'N';
$vrfcTypeSub = $this->mapVrfcTypeSub($rawData['verificationTypeCode'] ?? '', $ownerCheckYn);
return [
'atcl_no' => $articleNumber,
'cpid' => $rawData['cpId'] ?? null,
'cp_atcl_id' => $rawData['cpArticleNumber'] ?? null,
'rlet_type_cd' => $rawData['realEstateTypeCode'] ?? null,
'trade_type' => $rawData['tradeTypeCode'] ?? null,
'address_code' => $address['legalDivision']['sectorNumber'] ?? null,
'address1' => $address['complexName'] ?? null,
'address2' => trim(($address['buildingName'] ?? '') . ' ' . ($address['hoName'] ?? '')),
'address3' => $address['legalDivision']['legalDivisionAddress'] ?? null,
'sply_spc' => $space['supplySpace'] ?? null,
'excls_spc' => $space['exclusiveSpace'] ?? null,
'tot_spc' => $space['totalSpace'] ?? null,
'grnd_spc' => $space['groundSpace'] ?? null,
'bldg_spc' => $space['buildingSpace'] ?? null,
'deal_amt' => $price['dealAmount'] ?? 0,
'wrrnt_amt' => $price['warrantyAmount'] ?? 0,
'lease_amt' => $price['leaseAmount'] ?? 0,
'isale_amt' => $price['preSaleAmount'] ?? 0,
'prem_amt' => $price['premiumAmount'] ?? 0,
'sise' => null,
'floor' => $floor['correspondenceFloorCount'] ?? null,
'floor2' => $floor['totalFloorCount'] ?? null,
'rdate' => date("Y-m-d H:i:s", strtotime($payload['requestDatetime'] ?? 'now')),
'seller_tel_no' => $seller['sellerTelephoneNumber'] ?? null,
'seller_nm' => $seller['sellerName'] ?? null,
'realtor_nm' => $realtor['realtorName'] ?? null,
'realtor_tel_no' => $realtor['representativeTelephoneNumber'] ?? null,
'hscp_no' => $address['complexNumber'] ?? null,
'hscp_nm' => $address['complexName'] ?? null,
'ptp_no' => $address['pyeongTypeNumber'] ?? null,
'ptp_nm' => $address['pyeongTypeNumber'] ?? null,
'charger' => null,
'req_price_yn' => 'N',
'reg_charger' => null,
'dept1_sq' => null,
'dept2_sq' => null,
'reg_dept2_sq' => null,
'reg_dept1_sq' => null,
'dong_ho_chk' => ($address['isDongHoCheck'] ?? false) ? 'Y' : 'N',
'hscplqry_lv' => $address['inquiryLevel'] ?? null,
'ownerNm' => $seller['ownerName'] ?? null,
'ownerTelNo' => $seller['ownerTelephoneNumber'] ?? null,
'chg_trade_type' => null,
'chg_address2' => null,
'chg_address3' => null,
'chg_seller_tel' => null,
'chg_amt' => null,
'reg_status' => null,
'cupnNo' => null,
'roomSiteAtclRgstCnt' => null,
'roomSiteAtclExpsCnt' => null,
'redvlp_area_nm' => $address['redevelopAreaName'] ?? null,
'biz_stp_desc' => $address['bizStepDescription'] ?? null,
'cert_register' => json_encode($fileExtracted['certRegister'], JSON_UNESCAPED_UNICODE),
'direct_trad_yn' => ($seller['isDirectTrade'] ?? false) ? 'Y' : 'N',
'confirm_doc_img_url' => json_encode($fileExtracted['confirmDocImgUrl'], JSON_UNESCAPED_UNICODE),
'confirm_doc_owner_check_yn' => $ownerCheckYn,
'owner_birth' => null,
'vrfc_type_sub' => $vrfcTypeSub,
'cert_register_save_yn' => $fileExtracted['cert_register_save_yn'] ?? 'N',
'confirm_doc_img_url_save_yn' => $fileExtracted['confirm_doc_img_url_save_yn'] ?? 'N',
'address4' => $address['etcAddress'] ?? null,
'reference_file_url' => !empty($fileExtracted['referenceFileUrl']) ? implode('|', $fileExtracted['referenceFileUrl']) : '',
'reference_file_url_save_yn' => $fileExtracted['reference_file_url_save_yn'] ?? 'N',
'registerBookUniqueNo' => $rawData['verificationReference'] ?? null,
'relationSellerAndOwner' => null,
'ownerTypeCode' => $ownerTypeCode,
'registerBookUniqueNumber' => null
];
}
/**
* 기사 정보 추가 파라미터 생성
*/
public function mapArticleInfoEtc(string $articleNumber, array $rawData): array
{
$address = $rawData['address'] ?? [];
$realtor = $rawData['realtor'] ?? [];
// 공동주택: 동 정보, 비공동: 지번주소
$address2b = ($rawData['realEstateTypeCode'] === 'A01')
? $address['buildingName']
: ($address['jibunAddress'] ?? null);
$ownerTypeCode = $this->mapOwnerTypeCode($rawData['ownerTypeCode'] ?? null);
return [
'atcl_no' => $articleNumber,
'vir_addr_yn' => $this->mapYesNo($address['isVirtualAddress'] ?? null),
'bild_no' => null,
'vrfcMthdTpcd' => null,
'cert_uncnfrm_status' => null,
'expsStartYmdt' => $rawData['exposureStartDateTime'] ?? null,
'vrfcAutoPassYn' => ($rawData['isAutoVerificationRequested'] ?? false) ? 'Y' : 'N',
'address2a' => $address['liAddress'] ?? null,
'address2b' => $address2b,
'registerBookUniqueNo' => null,
'ownerTypeCode' => $ownerTypeCode,
'orgRepCphNo' => null,
'orgRepTelNo' => null,
'orgRltrNm' => null,
'orgRepNm' => null,
'smsSendTime' => null,
'document_cert_method' => null,
'noRgbkVrfcReqYn' => $this->mapYesNo($address['isUnregisteredVerificationRequested'] ?? null),
'areaByBdbkVrfcReqYn' => $this->mapYesNo($address['isBuildingRegisterAreaCheckRequested'] ?? null),
'orgAtclNo' => null,
'atclStatCd' => null,
'repNm' => $realtor['realtorName'] ?? null,
'cpName' => $rawData['cpId'],
'document_not_received' => null,
'final_failure' => null,
];
}
/**
* modify_info 파라미터 생성
*/
public function mapModifyInfo(string $articleNumber, array $rawData, array $payload): array
{
$address = $rawData['address'] ?? [];
$space = $rawData['space'] ?? [];
$price = $rawData['price'] ?? [];
$floor = $rawData['floor'] ?? [];
// 공동주택: 동 정보, 비공동: 지번주소
$address2b = ($rawData['realEstateTypeCode'] === 'A01')
? $address['buildingName']
: ($address['jibunAddress'] ?? null);
return [
// 'atcl_no' => $articleNumber,
'bild_nm' => $address['buildingName'] ?? null,
'rm_no' => $address['hoName'] ?? null,
'floor' => $floor['correspondenceFloorCount'] ?? null,
'floor2' => $floor['totalFloorCount'] ?? null,
'address_code' => $address['legalDivision']['sectorNumber'] ?? null,
'address2' => trim(($address['buildingName'] ?? '') . ' ' . ($address['hoName'] ?? '')),
'address2a' => $address['liAddress'] ?? null,
'address2b' => $address2b,
'address3' => $address['legalDivision']['legalDivisionAddress'] ?? null,
'address4' => $address['etcAddress'] ?? null,
'trade_type' => $rawData['tradeTypeCode'] ?? null,
'deal_amt' => $price['dealAmount'] ?? 0,
'wrrnt_amt' => $price['warrantyAmount'] ?? 0,
'lease_amt' => $price['leaseAmount'] ?? 0,
'isale_amt' => $price['preSaleAmount'] ?? 0,
'prem_amt' => $price['premiumAmount'] ?? 0,
'sply_spc' => $space['supplySpace'] ?? null,
'excls_spc' => $space['exclusiveSpace'] ?? null,
'tot_spc' => $space['totalSpace'] ?? null,
'grnd_spc' => $space['groundSpace'] ?? null,
'bldg_spc' => $space['buildingSpace'] ?? null,
'hscp_no' => $address['complexNumber'] ?? null,
'hscp_nm' => $address['complexName'] ?? null,
'ptp_no' => $address['pyeongTypeNumber'] ?? null,
'ptp_nm' => $address['pyeongTypeNumber'] ?? null,
'modify_yn' => 'N'
];
}
/**
* 인터페이스 구현
*/
public function map(string $articleNumber, array $rawData, array $payload): array
{
return $this->mapVrfcReq($articleNumber, $rawData, $payload);
}
/**
* 요청 타입 매핑
*/
private function mapRequestType(string $requestType): string
{
return match($requestType) {
'REG' => 'C',
'MOD' => 'U',
'CNC' => 'D',
default => '0',
};
}
/**
* 검증 타입 세부 매핑
*/
private function mapVrfcTypeSub(string $vrfcType, string $ownerCheckYn): string
{
return match($vrfcType) {
'D' => $ownerCheckYn === 'Y' ? 'D2' : 'D1',
'N' => 'N2',
default => $vrfcType . '1',
};
}
/**
* boolean을 Y/N으로 변환
*/
private function mapYesNo($value): ?string
{
if ($value === true) return 'Y';
if ($value === false) return 'N';
return null;
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Services;
use App\Models\Entities\V2chgstatModel;
use App\Models\Entities\V2chghistoryModel;
class StatusService
{
protected $V2chgstatModel, $V2chghistoryModel;
public function __construct()
{
// $this->V2chgstatModel = model(V2chgstatModel::class);
// $this->V2chghistoryModel = model(V2chghistoryModel::class);
}
/**
* 상태 변경 및 이력 기록 공통 메서드
*/
public function recordStatusAndHistory($vr_sq, $stat_cd, $chg_type, $memo)
{
$statModel = model(V2chgstatModel::class);
$histModel = model(V2chghistoryModel::class);
// 1. 상태(stat) 저장 (Insert or Update)
try {
$statModel->saveChgstat([
'vr_sq' => $vr_sq,
'stat_cd' => $stat_cd,
'insert_user' => '0',
'insert_tm' => db_now()
], 'I');
} catch (\Exception $e) {
$lastSql = (string)$statModel->getLastQuery();
write_custom_log("STAT_SAVE_ERR | vr_sq: $vr_sq | SQL: $lastSql | Msg: " . $e->getMessage(), 'ERROR', 'failed');
}
// 2. 이력(history) 저장
try {
$histModel->v2_savehistory([
'vr_sq' => $vr_sq,
'stat_cd' => $stat_cd,
'chg_type' => $chg_type,
'memo' => $memo,
'insert_id' => 'SYSTEM',
'insert_tm' => db_now()
]);
} catch (\Exception $e) {
$lastSql = (string)$histModel->getLastQuery();
write_custom_log("HIST_SAVE_ERR | vr_sq: $vr_sq | SQL: $lastSql | Msg: " . $e->getMessage(), 'ERROR', 'failed');
}
}
}

View File

@@ -39,13 +39,13 @@
$serverIp = $_SERVER['SERVER_ADDR'] ?? '';
// 개발 서버
$devServers = ['192.168.200.8', '192.168.10.231'];
$devServers = ['192.168.200.8', '192.168.10.231', '172.18.0.5'];
// 도커 테스트 서버
$dockerServers = ['172.18.0.2'];
// 테스트 서버
$testServers = ['192.168.200.9', '192.168.10.237', '175.126.191.182'];
$testServers = ['192.168.200.9', '192.168.10.237', '175.126.191.182', '192.168.10.243'];
// 운영 서버 IP 매핑
$prodServers = [
@@ -58,7 +58,7 @@
if (in_array($serverIp, $devServers, true)) {
// 개발
echo "<img src='/img/gnb_dev_00.png' alt='' />";
echo "개발";
} elseif (in_array($serverIp, $dockerServers, true)) {
// 도커
@@ -80,8 +80,6 @@
echo "{$serverName}";
}
?>
</li>
@@ -101,17 +99,65 @@
// 3. 끝 슬래시 정리
$path = rtrim($path, '/');
switch ($path) {
case "/article/receipt/detail":
$path = "/article/receipt/lists";
break;
case "/article/dept/detail":
$path = "/article/dept/lists";
break;
case "/article/record/detail":
$path = "/article/record/lists";
break;
case "/board/notice/write":
case "/board/notice/modify":
case "/board/notice/detail":
$path = "/board/notice/lists";
break;
case "/m701/m701a/detail":
$path = "/m701/m701a/lists";
break;
case "/m702/m702a/detail":
$path = "/m702/m702a/lists";
break;
case "/m703/m703a/detail":
$path = "/m703/m703a/lists";
break;
case "/m704/m704a/detail":
$path = "/m704/m704a/lists";
break;
case "/m705/m705a/detail":
$path = "/m705/m705a/lists";
break;
case "/m706/m706a/detail":
$path = "/m706/m706a/lists";
break;
case "/m708/m708a/detail":
$path = "/m708/m708a/lists";
break;
case "/m709/m709a/detail":
$path = "/m709/m709a/lists";
break;
case "/m710/m710a/detail":
$path = "/m710/m710a/lists";
break;
case "/m711/m711a/detail":
$path = "/m711/m711a/lists";
break;
case "/m712/m712a/detail":
$path = "/m712/m712a/lists";
break;
case "/m713/m713a/detail":
$path = "/m713/m713a/lists";
break;
case "/article/apt/detail":
$path = "/article/apt/lists";
break;
case "/article/apt/ground/detail":
$path = "/article/apt/lists2";
break;
}
foreach ($sMenu as $subMenu) {
if ($menu["mnu_id"] == $subMenu["mnu_pid"] && $path === $subMenu["mnu_url"]) {

View File

@@ -21,19 +21,19 @@
<div class="modal-body">
<!-- 규칙 박스 -->
<div class="border rounded-3 p-3 mb-3 bg-light">
<div class="border rounded-3 p-3 mb-3">
<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="fw-semibold">최소길이</div>
<div class="text-muted small">
최소 8자리 이상 : 영어 대문자, 소문자, 숫자, 특수문자 최소 2종류 조합
</div>
</li>
<li class="mb-2">
<div class="fw-semibold">- 추측하기 어려운 비밀번호</div>
<div class="fw-semibold">추측하기 어려운 비밀번호</div>
<div class="text-muted small">
일련번호, 전화번호 쉬운 문자열이 포함되지 않도록 <br>
알려진 단어, 키보드 상에서 나란히 있는 문자열이 포함되지 않도록
@@ -41,12 +41,12 @@
</li>
<li class="mb-2">
<div class="fw-semibold">- 주기적 변경</div>
<div class="fw-semibold">주기적 변경</div>
<div class="text-muted small">비밀번호에 유효기간 설정하고 최소 6개월마다 변경</div>
</li>
<li>
<div class="fw-semibold">- 동일 비밀번호 사용 제한</div>
<div class="fw-semibold">동일 비밀번호 사용 제한</div>
<div class="text-muted small">2개의 비밀번호를 교대로 사용하지 않음</div>
</li>
</ul>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,237 @@
<?php
$cnt = count($listDept);
$lati = 0;
$long = 0;
foreach ($listDept as $dept) {
$lati += $dept['rcpt_y'];
$long += $dept['rcpt_x'];
}
$lati = $lati / $cnt;
$long = $long / $cnt;
?>
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Language" content="ko">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>지도보기</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no" />
<meta name="description" content="ArchitectUI HTML Bootstrap 5 Dashboard Template">
<script defer src="/architectui/assets/scripts/vendors.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/main.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/demo.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/ladda.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/blockui.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/circle_progress.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/count_up.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/toastr.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/sweet_alerts.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/scrollbar.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/sticky_elements.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/carousel_slider.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/fullcalendar.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/treeview.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/maps.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/rating.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/image_crop.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/guided_tours.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/tables.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/form_validation.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/form_wizard.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/clipboard.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/datepicker.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/input_mask.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/input_select.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/range_slider.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/textarea_autosize.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/toggle_switch.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/sparklines.98288b227c064e6a107f.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<link href="/architectui/assets/styles/vendors.98288b227c064e6a107f.css" rel="stylesheet">
<link href="/architectui/assets/styles/main.98288b227c064e6a107f.css" rel="stylesheet">
<style>
.marker-label {
position: absolute;
transform: translate(-50%, -100%);
background: #fff;
border: 1px solid #333;
border-radius: 6px;
padding: 3px 6px;
font-size: 12px;
white-space: nowrap;
box-shadow: 0 1px 4px rgba(0, 0, 0, .25);
pointer-events: none;
/* 지도 드래그 방해 안 하게 */
}
</style>
</head>
<body>
<div class="my-loader-template d-none">
<div class="loader bg-transparent no-shadow p-0">
<div class="ball-grid-pulse">
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
<div class="bg-white"></div>
</div>
</div>
</div>
<div class="app-container app-theme-white body-tabs-shadow">
<div class="app-container">
<div class="app-main__outer">
<div class="app-main__inner px-4 py-3">
<div class="app-page-title">
<div class="page-title-wrapper d-flex align-items-center">
<div class="page-title-heading">
<div class="page-title-icon">
<i class="pe-7s-map icon-gradient bg-premium-dark"></i>
</div>
<div>
관할 배정 지도
</div>
</div>
<div class="ms-auto">
<button type="button" class="btn btn-primary" onclick="fn_print();">
인쇄하기
</button>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="main-card mb-3 card" id="mapArea">
<div class="card-body" style="height: 400px;">
<div id="map_view" style="width:100%;height:700px;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- <script type="text/javascript" src="https://oapi.map.naver.com/openapi/v3/maps.js?ncpClientId=kvyjyj00fp"></script> -->
<!-- <script type="text/javascript" src="https://oapi.map.naver.com/openapi/v3/maps.js?ncpKeyId=dtounkwjc5"></script> -->
<!-- <script type="text/javascript" src="https://oapi.map.naver.com/openapi/v3/maps.js?ncpClientId=dtounkwjc5"></script> -->
<script type="text/javascript" src="https://oapi.map.naver.com/openapi/v3/maps.js?ncpKeyId=dtounkwjc5"></script>
<script type="text/javascript">
const tpl = document.querySelector('.my-loader-template');
var map;
$(function () {
map = new naver.maps.Map('map_view', {
center: new naver.maps.LatLng(<?= $lati ?>, <?= $long ?>), //지도의 초기 중심 좌표
useStyleMap: true,
zoom: 15, //지도의 초기 줌 레벨
minZoom: 1, //지도의 최소 줌 레벨
mapTypeControl: true, //지도 유형 컨트롤의 표시 여부
mapTypeControlOptions: { //지도 유형 컨트롤의 옵션
style: naver.maps.MapTypeControlStyle.BUTTON,
position: naver.maps.Position.TOP_LEFT
},
zoomControl: true, //줌 컨트롤의 표시 여부
zoomControlOptions: { //줌 컨트롤의 옵션
position: naver.maps.Position.TOP_RIGHT
}
});
<?php reset($listDept);
foreach ($listDept as $dept): ?>
const pos_<?= $dept['dept_sq'] ?> = new naver.maps.LatLng(<?= $dept['rcpt_y'] ?>, <?= $dept['rcpt_x'] ?>);
// 기본 마커
new naver.maps.Marker({
position: pos_<?= $dept['dept_sq'] ?>,
map: map,
// icon: {
// url: HOME_PATH + '/plugin/img/pin.png',
// size: new naver.maps.Size(50, 52),
// origin: new naver.maps.Point(0, 0),
// anchor: new naver.maps.Point(25, 26)
// }
});
// 라벨 오버레이(텍스트만)
new LabelOverlay({
position: pos_<?= $dept['dept_sq'] ?>,
text: '<?= $dept['rcpt_atclno'] ?> <?= $dept['rsrv_date'] ?> <?= $dept['rsrv_tm_ap'] ?> <?= $dept['rsrv_tm_hour'] ?>시',
map: map
});
<?php endforeach; ?>
});
function LabelOverlay(options) {
this._position = options.position;
this._text = options.text;
this._map = options.map;
this.setMap(this._map);
}
LabelOverlay.prototype = new naver.maps.OverlayView();
LabelOverlay.prototype.onAdd = function () {
const el = document.createElement('div');
el.className = 'marker-label';
el.textContent = this._text;
this._el = el;
const overlayLayer = this.getPanes().overlayLayer;
overlayLayer.appendChild(el);
};
LabelOverlay.prototype.draw = function () {
const projection = this.getProjection();
const point = projection.fromCoordToOffset(this._position);
// 라벨을 마커 위로 올리기
this._el.style.left = point.x + 'px';
this._el.style.top = (point.y - 30) + 'px';
};
LabelOverlay.prototype.onRemove = function () {
if (this._el && this._el.parentNode) this._el.parentNode.removeChild(this._el);
this._el = null;
};
// 인쇄하기
function fn_print() {
var initBody;
window.onbeforeprint = function () {
initBody = document.body.innerHTML;
document.body.innerHTML = document.getElementById('mapArea').innerHTML;
};
window.onafterprint = function () {
document.body.innerHTML = initBody;
};
window.print();
return false;
}
</script>
</body>
</html>

View File

@@ -2,9 +2,16 @@
<?= $this->section('content') ?>
<style>
table th {
vertical-align: middle;
line-height: 1.2;
}
.tbl_basic2 th {
padding: 0 10px;
height: 27px;
line-height: 27px;
vertical-align: middle;
border: solid 1px #d8d9de;
background-color: #eff0f4;
letter-spacing: -1px;

View File

@@ -0,0 +1,835 @@
<?php
$usr_level = session('usr_level');
$usr_sq = session('usr_sq');
$usr_nm = session('usr_nm');
?>
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
th {
font-size: 11px;
text-align: center;
}
td {
text-align: center;
}
#resultList tbody tr {
cursor: pointer;
}
.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;
}
#resultList.dataTable {
width: max-content !important;
}
table.dataTable td,
table.dataTable th {
white-space: nowrap;
}
/* 테이블이 내용만큼 커지고, wrapper가 스크롤 담당 */
.table-responsive {
overflow-x: auto !important;
}
/* 테이블 폭: 내용 기준으로 커지되, 최소는 100% */
.table-responsive #resultList {
width: max-content !important;
min-width: 100% !important;
table-layout: auto !important;
}
/* 줄바꿈 금지 */
#resultList th,
#resultList td {
white-space: nowrap;
}
/* PC에서 가로 스크롤이 잘리는 대표 구간들 강제 해제 */
.main-card,
.card,
.card-body {
overflow-x: visible !important;
}
/* 만약 레이아웃 wrapper가 숨기고 있으면 이것도 */
.app-main__outer,
.app-main__inner,
.app-main {
overflow-x: visible !important;
}
/* flex 환경에서 필수 */
.app-main,
.app-main__outer,
.app-main__inner,
.card,
.card-body {
min-width: 0;
}
</style>
<h1>평면도 관리</h1>
<div class="col-md-12 col-xl-12">
<div class="main-card mb-3 card">
<div class="card-body">
<form id="frm_srch_info" method="get" onsubmit="return false;">
<div class="alert alert-warning py-2 mb-3">
<small class="mb-0">
매물ID를 입력하면 <b>다른 조건은 무시</b>됩니다.
</small>
</div>
<!-- 검색 폼 -->
<div class="row g-3">
<div class="col-md-1">
<label class="form-label mb-1">매물ID</label>
<input type="text" class="form-control" name="rcpt_atclno" id="rcpt_atclno"
onkeypress="atcl_no_enter(event)">
</div>
<div class="col-md-4">
<label class="form-label mb-1">일자별조회</label>
<div class="input-group input-group-sm">
<select class="form-select" name="schDateGb">
<option value="1" selected>예약일자</option>
<option value="2">등록일자</option>
</select>
<input type="date" class="form-control" name="sdate" id="sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="edate" id="edate" placeholder="종료일">
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">관할조직</label>
<div class="d-flex gap-1">
<select name="bonbu" id="bonbu" class="form-select form-select-sm">
<option value="">-본부-</option>
<?php foreach ($bonbu as $d): ?>
<option value="<?= $d['dept_sq'] ?>">
<?= $d['dept_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="team" id="team" class="form-select form-select-sm">
<option value="">-팀-</option>
</select>
<select name="damdang" id="damdang" class="form-select form-select-sm">
<option value="">-담당자-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">지역별조회</label>
<div class="d-flex gap-1">
<select name="srcSido" id="srcSido" class="form-select form-select-sm">
<option value="">-시/도-</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>">
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="srcGugun" id="srcGugun" class="form-select form-select-sm">
<option value="">-시/군/구-</option>
</select>
<select name="srcDong" id="srcDong" class="form-select form-select-sm">
<option value="">-읍/면/동-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">현재상태</label>
<div class="d-flex gap-1">
<select name="rcpt_stat1" class="form-select form-select-sm">
<option value="">예약확인지연</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "STEP_VERIFICATION"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<select name="rcpt_stat2" id="srcGugun" class="form-select form-select-sm">
<option value="">-상태2-</option>
</select>
<select name="rcpt_stat3" id="srcDong" class="form-select form-select-sm">
<option value="">-상태3-</option>
</select>
</div>
</div>
<div class="col-md-1">
<label class="form-label mb-1">거래구분</label>
<select class="form-select" name="rcpt_product_info1">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "NHN_DEAL_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">동영상촬영여부</label>
<select class="form-select" name="exp_movie_yn">
<option value="">전체</option>
<option value="Y">촬영</option>
<option value="N">미촬영</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">홍보확인서여부</label>
<select class="form-select" name="conf_img_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">분양권</label>
<select class="form-select" name="parcel_out_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">CP ID</label>
<select class="form-select" name="rcpt_cpid">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "CP_ID"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">매물종류</label>
<select class="form-select" name="rcpt_product">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "ARTICLE_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">면적확인</label>
<select class="form-select" name="exp_spc_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">체크리스트</label>
<select class="form-select" name="check_list_img_yn">
<option value="">전체</option>
<option value="Y"> Y
</option>
<option value="N"> N
</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도유무</label>
<select class="form-select" name="ground_plan_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도요청</label>
<select class="form-select" name="ground_plan">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<!-- 검색유형 -->
<div class="col-md-1">
<label class="form-label mb-1">검색유형</label>
<select class="form-select" name="srchType">
<option value="">선택</option>
<option value="1">중개사명</option>
<option value="2">주소</option>
<option value="3">사업자번호</option>
</select>
</div>
<!-- 검색어 -->
<div class="col-md-2">
<label class="form-label mb-1">검색어</label>
<input type="text" class="form-control" name="srchTxt" placeholder="검색어 입력">
</div>
<div class="col-md-1 d-grid">
<label class="form-label mb-1 invisible">검색</label>
<button type="button" class="btn btn-primary" id="btnSearch">
<i class="pe-7s-search me-1"></i>검색
</button>
</div>
</div>
</form>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-header d-flex align-items-center">
<div class="d-flex align-items-center flex-wrap" style="gap: 8px; flex: 1">
</div>
<div class="ml-auto">
<button class="btn btn-sm btn-outline-success" id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>
엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table id="resultList" class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th>현재상태</th>
<th>매물ID</th>
<th>예약일자</th>
<th>주소</th>
<th>층</th>
<th>면적</th>
<th>매물종류</th>
<th>관할조직(팀)</th>
<th>방문담당</th>
<th>평면도유무</th>
<th>평면도요청</th>
<th>파일명</th>
<th>미리보기</th>
<th>다운로드</th>
</tr>
</thead>
<tbody>
<!-- 여기는 비워둠: AJAX로 채움 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 지도팝업 -->
<?= $this->section('modals') ?>
<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() ?>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const bonbuArr = <?= json_encode($bonbu, JSON_UNESCAPED_UNICODE); ?>;
const teamArr = <?= json_encode($team, JSON_UNESCAPED_UNICODE); ?>;
const userArr = <?= json_encode($user, JSON_UNESCAPED_UNICODE); ?>;
const date = new Date();
var table;
$(function () {
initReceiptDate();
$("#srcSido, #srcGugun, #srcSido2, #srcGugun2").on("change", function (e) {
const targetId = this.id;
const isSecond = this.id.endsWith("2");
const params = {
srcSido: isSecond
? $("#srcSido2").val()
: $("#frm_srch_info [name=srcSido]").val(),
srcGugun: isSecond
? $("#srcGugun2").val()
: $("#frm_srch_info [name=srcGugun]").val(),
};
$.ajax({
url: "/manage/areas/getAreaList",
method: "POST",
dataType: "json",
data: params,
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
switch (targetId) {
case "srcSido":
$("#srcGugun").empty()
var str = "";
str += "<option value=''>시/군/구</option>";
if ($("#srcSido").val() !== "") {
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
}
$("#srcGugun").append(str);
break;
case "srcGugun":
$("#srcDong").empty()
var str = "";
str += "<option value=''>읍/면/동</option>";
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
$("#srcDong").append(str);
break;
}
}
});
});
$("#bonbu, #team, #bonbu2, #team2").on("change", function (e) {
const targetId = this.id;
var str = "";
if (targetId === "bonbu" || targetId === "bonbu2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (var i = 0; i < teamArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(teamArr[i].pdept_sq) === String(dept_sq)) {
str += `
<option value="${teamArr[i].dept_sq}">${teamArr[i].dept_nm}</option>
`;
}
}
}
if (targetId === "bonbu") {
$("#team").html(str);
} else if (targetId === "bonbu2") {
$("#team2").html(str);
}
} else if (targetId === "team" || targetId === "team2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (var i = 0; i < userArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(userArr[i].dept_sq) === String(dept_sq)) {
str += `
<option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>
`;
}
}
}
if (targetId === "team") {
$("#damdang").html(str);
} else if (targetId === "team2") {
$("#damdang2").html(str);
}
}
});
// 검증방식 onchange
$("#vrfcreq_way").on("change", function (e) {
const val = e.target.value;
var str = "";
str += `<option value="">-선택-</option>`;
if (e.val !== "") {
$.getJSON("/common/common/getVrfcCode?type=" + val, function (result) {
var total = result.length;
for (var i = 0; i < total; i++) {
var cateNm = result[i].cd_nm;
if (total == 1) {
str += "<option value=\"" + result[i].cd + "\" selected>" + cateNm + "</option>";
} else {
str += "<option value=\"" + result[i].cd + "\">" + cateNm + "</option>";
}
}
$("#vrfc_type_sub").html(str);
});
} else {
$("#vrfc_type_sub").html(str);
}
});
$("#btnSearch").on("click", function () {
table.ajax.reload();
});
table = $('#resultList').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/ground_ctn/getResultList',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.rcpt_atclno = $("#frm_srch_info [name=rcpt_atclno]").val(); // 매물ID
d.schDateGb = $("#frm_srch_info [name=schDateGb]").val(); // 일자유형
d.sdate = $("#frm_srch_info [name=sdate]").val(); // 시작일
d.edate = $("#frm_srch_info [name=edate]").val(); // 종료일
d.bonbu = $("#frm_srch_info [name=bonbu]").val(); // 본부
d.team = $("#frm_srch_info [name=team]").val(); // 팀
d.user = $("#frm_srch_info [name=user]").val(); // 담당자
d.sido = $("#frm_srch_info [name=srcSido]").val(); // 시도
d.gugun = $("#frm_srch_info [name=srcGugun]").val(); // 시군구
d.dong = $("#frm_srch_info [name=srcDong]").val(); // 읍면동
d.rcpt_stat1 = $("#frm_srch_info [name=rcpt_stat1]").val(); // 상태1
d.rcpt_stat2 = $("#frm_srch_info [name=rcpt_stat2]").val(); // 상태2
d.rcpt_stat3 = $("#frm_srch_info [name=rcpt_stat3]").val(); // 상태3
d.rcpt_product_info1 = $("#frm_srch_info [name=rcpt_product_info1]").val(); // 거래구분
d.exp_movie_yn = $("#frm_srch_info [name=exp_movie_yn]").val(); // 동영상촬영여부
d.conf_img_yn = $("#frm_srch_info [name=conf_img_yn]").val(); // 홍보확인서여부
d.parcel_out_yn = $("#frm_srch_info [name=parcel_out_yn]").val(); // 분양권
d.rcpt_cpid = $("#frm_srch_info [name=rcpt_cpid]").val(); // CPID
d.rcpt_product = $("#frm_srch_info [name=rcpt_product]").val(); // 매물종류
d.exp_spc_yn = $("#frm_srch_info [name=exp_spc_yn]").val(); // 면적확인
d.check_list_img_yn = $("#frm_srch_info [name=check_list_img_yn]").val(); // 체크리스트
d.ground_plan_yn = $("#frm_srch_info [name=ground_plan_yn]").val(); // 평면도유무
d.ground_plan = $("#frm_srch_info [name=ground_plan]").val(); // 평면도요청
d.srchType = $("#frm_srch_info [name=srchType]").val(); // 검색유형
d.srchTxt = $("#frm_srch_info [name=srchTxt]").val(); // 검색어
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'rcpt_stat_nm' },
{ data: 'rcpt_atclno' },
{ data: null, render: fn_date_render },
{ data: null, render: fn_addr_render },
{ data: null, render: fn_floor_render },
{ data: 'photo_save_dt' },
{ data: 'excls_spc' },
{ data: null, render: fn_product_render },
{ data: 'dept_nm' },
{ data: 'usr_nm' },
{ data: 'ground_plan_yn' },
{ data: 'ground_plan' },
{ data: null, render: fn_btn_preview },
{ data: null, render: fn_btn_download },
],
// 옵션들 예시
destroy: true,
deferRender: true,
scrollX: false,
autoWidth: false,
paging: true,
searching: false,
ordering: false,
});
// 테이블 row click
$('#resultList tbody').on('click', 'tr', function (e) {
if ($(e.target).closest('td.dt-no-rowclick').length) return;
const rowData = table.row(this).data();
if (!rowData) return;
});
// 엑셀 다운로드 click
$("#excel-download").on("click", function () {
$.ajax({
url: "/article/ground_ctn/excel",
method: "GET",
dataType: "json",
data: $("#frm_srch_info").serialize(),
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
downloadExcel(result.data);
}
});
});
// 미리보기
$(document).on('click', '.btn-preview', function (e) {
e.stopPropagation(); // 행 클릭 방지(2중 안전)
fn_preview($(this).data('src'));
});
});
// 접수기간 초기화
function initReceiptDate() {
const before3 = new Date();
before3.setDate(date.getDate() - 2);
const fmt = d => d.toISOString().slice(0, 10);
$('#sdate').val(fmt(before3));
$('#edate').val(fmt(date));
}
function atcl_no_enter(event) {
if (event.keyCode == 13) {
table.ajax.reload()
}
}
/** datatable render */
function fn_date_render(data, type, row) {
var str = "";
str = row.rsrv_date + " " + row.rsrv_tm_ap;
return str;
}
function fn_addr_render(data, type, row) {
var str = "";
if (row.rcpt_jibun_addr != null || row.rcpt_jibun_addr != "") {
str = row.addr + " " + row.rcpt_jibun_addr + " " + row.rcpt_etc_addr;
} else {
str = row.addr + " " + row.rcpt_dtl_addr + " " + row.rcpt_ho;
}
return str;
}
function fn_floor_render(data, type, row) {
var str = "";
str = row.rcpt_floor + "/" + row.rcpt_floor2;
return str;
}
function fn_product_render(data, type, row) {
var str = "";
if (row.rcpt_product_nm == null || row.rcpt_product_nm == "") {
str = row.rcpt_product;
} else {
str = row.rcpt_product_nm;
}
return str;
}
// 미리보기 btn
function fn_btn_preview(data, type, row) {
if (row.img_sq == null) return '';
let src = (row.cloud_upload_yn == "Y")
? '<?= NCLOUD_OBJECT_STORAGE_URL ?>' + row.img_path + row.img_filenm
: row.img_path + row.img_filenm;
return `
<button type="button" class="btn btn-sm btn-link p-0 btn-preview" data-src="${src}">
미리보기
</button>
`;
}
// 다운로드 btn
function fn_btn_download(data, type, row) {
var str = "";
if (row.img_sq != null) {
var src = "";
if (row.cloud_upload_yn == "Y") {
src = '<?= NCLOUD_OBJECT_STORAGE_URL ?>' + '' + row.img_path + '' + row.img_filenm;
} else {
src = row.img_path + '' + row.img_filenm;
}
str = `<a href="${src}" download="${row.filenm}">다운로드</a>`;
}
return str;
}
/** datatable render */
// 엑셀 다운로드
function downloadExcel(data) {
const ws = XLSX.utils.json_to_sheet(data);
// ws['!cols'] = [
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 150 },
// { wpx: 120 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// ];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
const blob = new Blob([wbout], { type: 'application/octet-stream' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "아파트_평면도_내역" + getDateTimeString() + ".xlsx";
link.click();
URL.revokeObjectURL(link.href);
}
// 이미지 프리뷰
function fn_preview(src) {
const $img = $('#imgPreview');
// 이미지 표시
$img.attr('src', src).show();
$('#previewTitle').text('이미지 미리보기');
const modal = new bootstrap.Modal(document.getElementById('previewModal'));
modal.show();
}
</script>
<?= $this->endSection() ?>

View File

@@ -749,7 +749,7 @@
if (!rowData) return;
const id = rowData.rcpt_no;
location.href = "<?= site_url('article/apt/detail') ?>/" + id;
window.open("<?= site_url('article/apt/detail') ?>/" + id, '_blank');
});
$('#btnSearch').on('click', function () {

View File

@@ -67,9 +67,6 @@
<div class="tab-content">
<div class="tab-pane active" id="tab-eg10-0" role="tabpanel">
<form id="frm_srch_info" method="get" onsubmit="return false;">
<input type="hidden" name="m" id="m" value="M801">
<input type="hidden" name="todo" id="todo" value="inq">
<input type="hidden" name="usr_id" value="">
<!-- 카드 -->
<div class="mb-3">

View File

@@ -16,7 +16,7 @@ $long = $long / $cnt;
<meta charset="utf-8">
<meta http-equiv="Content-Language" content="ko">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>컨펌스 로그인</title>
<title>지도보기</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no" />
<meta name="description" content="ArchitectUI HTML Bootstrap 5 Dashboard Template">

View File

@@ -0,0 +1,807 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
table th {
text-align: center;
}
.tab-header {
display: inline;
}
</style>
<h4 class="mb-3">처리가능 수량관리</h4>
<div class="col-12">
<div class="main-card mb-3 card">
<!-- 탭은 card-header 안에 -->
<div class="card-header tab-header pb-0">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<a class="nav-link active" data-bs-toggle="tab" href="#tab-eg10-0">일자별 처리가능 수량</a>
</li>
<li class="nav-item">
<a class="nav-link" data-bs-toggle="tab" href="#tab-eg10-1">지역별 수량</a>
</li>
<li class="nav-item">
<a class="nav-link" data-bs-toggle="tab" href="#tab-eg10-2">기본 수량</a>
</li>
</ul>
</div>
<div class="card-body">
<!-- 공통 검색/필터 영역 -->
<div class="d-flex flex-wrap align-items-end justify-content-between gap-2 mb-3">
<div class="d-flex flex-wrap align-items-end gap-2">
<label class="form-label mb-1 small me-2">조회조건</label>
<!-- 첫번째탭 -->
<div id="form1" class="d-flex flex-wrap align-items-end gap-2">
<div class="input-group input-group-sm" style="min-width: 320px;">
<input type="date" class="form-control" name="sdate" id="sdate">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="edate" id="edate">
</div>
</div>
<!-- 두번째탭 -->
<div id="form2" class="d-none">
<div class="d-flex align-items-end gap-1">
<select class="form-select form-select-sm" name="region2" id="region2" style="min-width: 180px;">
<option value="">지역 선택</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>" <?php if ($s['region_cd'] == "1100000000") {
echo "selected";
} ?>>
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group input-group-sm" style="min-width: 180px;">
<input type="date" class="form-control" name="sdate2" id="sdate2">
</div>
</div>
</div>
<!-- 세번째탭 -->
<div id="form3" class="d-none">
<div class="d-flex align-items-end gap-1">
<select class="form-select form-select-sm" name="region3" id="region3" style="min-width: 180px;">
<option value="">지역 선택</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>" <?php if ($s['region_cd'] == "1100000000") {
echo "selected";
} ?>>
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
</div>
<div class="d-flex gap-1 ms-auto">
<button class="btn btn-sm btn-outline-success" id="excel-download" type="button">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i> 엑셀다운로드
</button>
<button class="btn btn-sm btn-outline-light" type="button" id="btnSearch">
조회
</button>
</div>
</div>
<!-- 탭 컨텐츠는 tab-content 바로 아래에 -->
<div class="tab-content">
<!-- 1) 일자별 -->
<div class="tab-pane fade show active" id="tab-eg10-0" role="tabpanel">
<div class="border rounded p-3 bg-white">
<table class="table table-sm table-hover table-striped mb-0 align-middle text-center w-100" id="tbl1">
<thead>
<tr>
<th rowspan="2" class="align-middle">날짜</th>
<th rowspan="2" class="align-middle">기본적용 여부</th>
<th rowspan="2" class="align-middle">처리가능건수</th>
<th colspan="2" style="text-align: center;">시간대별</th>
</tr>
<tr>
<th>오전</th>
<th>오후</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<!-- 2) 지역별 -->
<div class="tab-pane fade" id="tab-eg10-1" role="tabpanel">
<div class="border rounded p-3 bg-white">
<table class="table table-sm table-hover table-striped mb-0 align-middle text-center w-100" id="tbl2">
<thead>
<tr>
<th rowspan="2" class="align-middle">지역</th>
<th rowspan="2" class="align-middle">건수</th>
<th rowspan="2" class="align-middle">개별초기화</th>
<th colspan="2" style="text-align: center;">시간대별</th>
</tr>
<tr>
<th>오전</th>
<th>오후</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<!-- 3) 기본 수량 -->
<div class="tab-pane fade" id="tab-eg10-2" role="tabpanel">
<div class="border rounded p-3 bg-white">
<table class="table table-sm table-hover table-striped mb-0 align-middle text-center w-100" id="tbl3">
<thead>
<tr>
<th rowspan="2" class="align-middle">지역</th>
<th rowspan="2" class="align-middle">건수</th>
<th colspan="2" style="text-align: center;">시간대별</th>
</tr>
<tr>
<th>오전</th>
<th>오후</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div class="card-footer justify-content-end gap-1">
<button class="btn btn-sm btn-outline-secondary proc-area" type="button" onclick="fn_data_reset('clear');"
style="display: none;">
초기화
</button>
<button class="btn btn-sm btn-outline-secondary proc-area" type="button" onclick="fn_data_reset('basic');"
style="display: none;">
기본적용
</button>
<button class="btn btn-sm btn-outline-primary btn-save" type="button" onclick="fn_data_save();"
style="display: none;">
저장
</button>
</div>
</div>
</div>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const date = new Date();
var table1, table2, table3;
$(function () {
initForm();
$("#sdate, #edate").on("change", function () {
table1.ajax.reload();
});
$("#btnSearch").on("click", function () {
const activeTab = $('.nav-link.active');
const href = activeTab.attr('href'); // #tab-eg10-0 등
if (href === '#tab-eg10-0') {
table1.ajax.reload();
} else if (href === '#tab-eg10-1') {
table2.ajax.reload();
} else if (href === '#tab-eg10-2') {
table3.ajax.reload();
}
});
table1 = $('#tbl1').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/processible/getList1',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.sdate = $("#sdate").val(); // 시작일
d.edate = $("#edate").val(); // 종료일
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{
data: 'sc_date',
render: function (data, type, row) {
const day = parseInt(row.day_week, 10);
if (day === 0) return `<span style="color:red">${data}</span>`;
if (day === 6) return `<span style="color:blue">${data}</span>`;
return data;
}
},
{
data: 'svc_check',
render: function (data, type, row) {
const day = parseInt(row.day_week, 10);
var title = "";
data == "N" ? title = "기본지정" : title = "별도지정";
if (day === 0) return `<span style="color:red">${title}</span>`;
if (day === 6) return `<span style="color:blue">${title}</span>`;
return title;
}
},
{ data: null, render: fn_total_render },
{
data: 'am_cnt',
render: function (data, type, row) {
const day = parseInt(row.day_week, 10);
if (day === 0) return `<span style="color:red">${priceFormatter(data)}</span>`;
if (day === 6) return `<span style="color:blue">${priceFormatter(data)}</span>`;
return priceFormatter(data);
}
},
{
data: 'pm_cnt',
render: function (data, type, row) {
const day = parseInt(row.day_week, 10);
if (day === 0) return `<span style="color:red">${priceFormatter(data)}</span>`;
if (day === 6) return `<span style="color:blue">${priceFormatter(data)}</span>`;
return priceFormatter(data);
}
},
],
// 옵션들 예시
destroy: true,
deferRender: true,
scrollX: false,
autoWidth: false,
paging: true,
searching: false,
ordering: false,
});
$('a[data-bs-toggle="tab"]').on('shown.bs.tab', function (e) {
const target = $(e.target).attr('href'); // 활성화된 탭 ID
// 모두 숨김
$('#form1, #form2, #form3').addClass('d-none');
// 탭에 따라 표시
if (target === '#tab-eg10-0') {
$('#form1').removeClass('d-none');
$("#excel-download").show();
$(".proc-area").hide();
$(".btn-save").hide();
} else if (target === '#tab-eg10-1') {
$('#form2').removeClass('d-none');
$("#excel-download").hide();
$(".proc-area").show();
$(".btn-save").show();
fn_call_area();
} else if (target === '#tab-eg10-2') {
$('#form3').removeClass('d-none');
$("#excel-download").hide();
$(".proc-area").hide();
$(".btn-save").show();
fn_call_basic();
}
});
// 엑셀다운 click
$("#excel-download").on("click", function () {
$.ajax({
url: "/article/processible/excel",
method: "GET",
contentType: 'application/x-www-form-urlencoded;charset=UTF-8',
data: {
'sdate': $("#sdate").val(),
'edate': $("#edate").val(),
},
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
downloadExcelWithHeader(result.data);
}
});
});
});
function initForm() {
const fmt = d => d.toISOString().slice(0, 10);
$('#sdate').val(fmt(date));
const lastDate = getLastDateOfMonth(date.getFullYear(), date.getMonth() + 1);
$('#edate').val(fmt(lastDate));
$('#sdate2').val(fmt(date));
}
function fn_total_render(data, type, row) {
const day = parseInt(row.day_week, 10);
const total = (parseInt(row.am_cnt) + parseInt(row.pm_cnt));
if (day === 0) return `<span style="color:red">${priceFormatter(total)}</span>`;
if (day === 6) return `<span style="color:blue">${priceFormatter(total)}</span>`;
return priceFormatter(total);
}
// 지역별 수량 테이블 생성
function fn_call_area() {
$("#tbl2").DataTable().clear().destroy();
table2 = $('#tbl2').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/processible/getList2',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.sdate = $("#sdate2").val(); // 시작일
d.region = $("#region2").val();
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'region_nm' },
{
data: null, render: function (data, type, row) {
if (row.am_cnt == null && row.pm_cnt == null) {
return priceFormatter(parseInt(row.default_am_cnt) + parseInt(row.default_pm_cnt));
} else {
return priceFormatter(parseInt(row.am_cnt) + parseInt(row.pm_cnt));
}
}
},
{
data: null, render: function (data, type, row, meta) {
var str = `
<button class="btn btn-sm btn-outline-dark" type="button" onclick="fn_row_clear('${meta.row}')">
초기화
</button>
`;
return str;
}
},
{
data: null, render: function (data, type, row, meta) {
var str = `
<div class="d-flex justify-content-center gap-1">
<input type="text" id="am_cnt_${meta.row}" value="${row.default_am_cnt}"/ style="width: 80px;">
(${row.default_am_cnt})
</div>
`;
return str;
}
},
{
data: null, render: function (data, type, row, meta) {
var str = `
<div class="d-flex justify-content-center gap-1">
<input type="text" id="pm_cnt_${meta.row}" value="${row.default_pm_cnt}"/ style="width: 80px;">
(${row.default_pm_cnt})
</div>
`;
return str;
}
},
],
// 옵션들 예시
destroy: true,
deferRender: false,
scrollX: false,
autoWidth: false,
paging: false,
searching: false,
ordering: false,
});
}
function fn_call_basic() {
$("#tbl3").DataTable().clear().destroy();
table3 = $('#tbl3').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/processible/getList3',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.region = $("#region3").val();
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'region_nm' },
{
data: null, render: function (data, type, row) {
if (row.am_cnt == null && row.pm_cnt == null) {
return priceFormatter(parseInt(row.default_am_cnt) + parseInt(row.default_pm_cnt));
} else {
return priceFormatter(parseInt(row.am_cnt) + parseInt(row.pm_cnt));
}
}
},
{
data: null, render: function (data, type, row, meta) {
var str = `
<div class="d-flex justify-content-center gap-1">
<input type="text" id="am_cnt2__${meta.row}" value="${row.am_cnt}"/ style="width: 80px;">
</div>
`;
return str;
}
},
{
data: null, render: function (data, type, row, meta) {
var str = `
<div class="d-flex justify-content-center gap-1">
<input type="text" id="pm_cnt2_${meta.row}" value="${row.pm_cnt}"/ style="width: 80px;">
</div>
`;
return str;
}
},
],
// 옵션들 예시
destroy: true,
deferRender: false,
scrollX: false,
autoWidth: false,
paging: false,
searching: false,
ordering: false,
});
}
// 엑셀 다운로드
function downloadExcelWithHeader(dataRows) {
// ✅ 고정컬럼은 3개만 두고, 시간대별은 그룹헤더로만 사용
const fixedCols = ["날짜", "기본적용여부", "처리가능건수"];
const timeCols = ["오전", "오후"];
const COLS = fixedCols.length + timeCols.length; // 3 + 2 = 5
const fitCols = (arr) => {
const a = (arr || []).slice(0, COLS);
while (a.length < COLS) a.push("");
return a;
};
const safe = (v) => (v === undefined || v === null) ? "" : v;
const num = (v) => (v === undefined || v === null || v === "") ? 0 : Number(v);
// 1행: 고정 3개 + "시간대별"(colspan2)
const header1 = fitCols([
...fixedCols,
"시간대별",
"" // colspan 2 빈칸
]);
// 2행: 고정은 빈칸 + 오전/오후
const header2 = fitCols([
...Array(fixedCols.length).fill(""),
...timeCols
]);
const body = (dataRows || []).map((r) => {
return fitCols([
safe(r.sc_date),
safe(r.sc_type),
num(r.day_cnt),
num(r.am_cnt),
num(r.pm_cnt),
]);
});
const aoa = [header1, header2, ...body];
const ws = XLSX.utils.aoa_to_sheet(aoa);
// ✅ merge: 고정 3개는 rowspan2, 시간대별은 colspan2
const timeStart = fixedCols.length; // 3
const timeEnd = timeStart + timeCols.length - 1; // 4
ws["!merges"] = [
{ s: { r: 0, c: 0 }, e: { r: 1, c: 0 } }, // 날짜
{ s: { r: 0, c: 1 }, e: { r: 1, c: 1 } }, // 기본적용여부
{ s: { r: 0, c: 2 }, e: { r: 1, c: 2 } }, // 처리가능건수
{ s: { r: 0, c: timeStart }, e: { r: 0, c: timeEnd } }, // 시간대별 (오전~오후)
];
// 컬럼 너비 (5칸에 맞춤)
ws["!cols"] = [
{ wpx: 120 }, // 날짜
{ wpx: 100 }, // 기본적용여부
{ wpx: 100 }, // 처리가능건수
{ wpx: 80 }, // 오전
{ wpx: 80 }, // 오후
];
// (스타일/테두리) 기존 로직 그대로 사용 가능
const lastRow = aoa.length - 1;
const lastCol = COLS - 1;
const headerStyle = {
font: { bold: true },
alignment: { horizontal: "center", vertical: "center" },
fill: { patternType: "solid", fgColor: { rgb: "F2F2F2" } },
border: {
top: { style: "thin", color: { rgb: "D9D9D9" } },
bottom: { style: "thin", color: { rgb: "D9D9D9" } },
left: { style: "thin", color: { rgb: "D9D9D9" } },
right: { style: "thin", color: { rgb: "D9D9D9" } },
}
};
const cellBorder = {
border: {
top: { style: "thin", color: { rgb: "E0E0E0" } },
bottom: { style: "thin", color: { rgb: "E0E0E0" } },
left: { style: "thin", color: { rgb: "E0E0E0" } },
right: { style: "thin", color: { rgb: "E0E0E0" } },
}
};
for (let r = 0; r <= lastRow; r++) {
for (let c = 0; c <= lastCol; c++) {
const addr = XLSX.utils.encode_cell({ r, c });
if (!ws[addr]) ws[addr] = { t: "s", v: "" };
ws[addr].s = Object.assign({}, ws[addr].s || {}, cellBorder);
if (r <= 1) ws[addr].s = Object.assign({}, ws[addr].s, headerStyle);
}
}
ws["!rows"] = [{ hpx: 24 }, { hpx: 24 }];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "sheet1");
XLSX.writeFile(wb, "일자별_처리가능_수량_" + getDateTimeString() + ".xlsx");
}
// value 초기화
function fn_row_clear(row) {
$('#am_cnt_' + row).val('0');
$('#pm_cnt_' + row).val('0');
}
function fn_data_reset(type) {
table2.rows().every(function (rowIdx) {
const rowData = this.data();
if (type === "clear") {
$('#am_cnt_' + rowIdx).val('0');
$('#pm_cnt_' + rowIdx).val('0');
} else if (type === "basic") {
$('#am_cnt_' + rowIdx).val(rowData.default_am_cnt ?? 0);
$('#pm_cnt_' + rowIdx).val(rowData.default_pm_cnt ?? 0);
}
});
}
function fn_data_save() {
var datas = new Array();
var path = "";
const activeTab = $('.nav-link.active');
const href = activeTab.attr('href'); // #tab-eg10-0 등
if (href === '#tab-eg10-1') {
path = "saveArea";
table2.rows().every(function (rowIdx) {
const rowData = this.data();
var data = {
'sc_date': $("#sdate2").val(),
'region_cd': rowData.region_cd,
'am_cnt': $('#am_cnt_' + rowIdx).val(),
'pm_cnt': $('#pm_cnt_' + rowIdx).val(),
};
datas.push(data);
});
} else if (href === '#tab-eg10-2') {
path = "saveCount";
table3.rows().every(function (rowIdx) {
const rowData = this.data();
var data = {
'region_cd': rowData.region_cd,
'am_cnt': $('#am_cnt2_' + rowIdx).val(),
'pm_cnt': $('#pm_cnt2_' + rowIdx).val(),
};
datas.push(data);
});
}
// console.log(datas)
// return
if (datas.length == 0) {
Swal.fire({
title: "저장 가능한 데이터가 없습니다.",
icon: "warning"
});
return;
}
swal.fire({
text: "저장 하시겠습니까?",
type: "warning",
showCancelButton: true,
confirmButtonText: "예",
cancelButtonText: "아니오",
closeOnConfirm: false,
closeOnCancel: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
}).then((result) => {
if (result.isConfirmed) {
const param = {
'rows': JSON.stringify(datas),
};
$.ajax({
url: '/article/processible/' + path,
contentType: 'application/x-www-form-urlencoded;charset=UTF-8',
method: 'POST',
data: param,
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"
})
}
}
});
}
});
}
function getLastDateOfMonth(year, month) {
return new Date(year, month, 0); // 말일 Date 객체
}
function priceFormatter(data) {
return data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function getDateTimeString() {
const d = new Date();
const yyyy = d.getFullYear();
const mm = String(d.getMonth() + 1).padStart(2, '0');
const dd = String(d.getDate()).padStart(2, '0');
const hh = String(d.getHours()).padStart(2, '0');
const mi = String(d.getMinutes()).padStart(2, '0');
const ss = String(d.getSeconds()).padStart(2, '0');
return `${yyyy}${mm}${dd}${hh}${mi}${ss}`;
}
</script>
<?= $this->endSection() ?>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,890 @@
<?php
$usr_level = session('usr_level');
$usr_sq = session('usr_sq');
$usr_nm = session('usr_nm');
?>
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
th {
font-size: 11px;
text-align: center;
}
td {
text-align: center;
}
#resultList tbody tr {
cursor: pointer;
}
.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;
}
#resultList.dataTable {
width: max-content !important;
}
table.dataTable td,
table.dataTable th {
white-space: nowrap;
}
/* 테이블이 내용만큼 커지고, wrapper가 스크롤 담당 */
.table-responsive {
overflow-x: auto !important;
}
/* 테이블 폭: 내용 기준으로 커지되, 최소는 100% */
.table-responsive #resultList {
width: max-content !important;
min-width: 100% !important;
table-layout: auto !important;
}
/* 줄바꿈 금지 */
#resultList th,
#resultList td {
white-space: nowrap;
}
/* PC에서 가로 스크롤이 잘리는 대표 구간들 강제 해제 */
.main-card,
.card,
.card-body {
overflow-x: visible !important;
}
/* 만약 레이아웃 wrapper가 숨기고 있으면 이것도 */
.app-main__outer,
.app-main__inner,
.app-main {
overflow-x: visible !important;
}
/* flex 환경에서 필수 */
.app-main,
.app-main__outer,
.app-main__inner,
.card,
.card-body {
min-width: 0;
}
</style>
<h1>확인매물 현황</h1>
<div class="col-md-12 col-xl-12">
<div class="main-card mb-3 card">
<div class="card-body">
<form id="frm_srch_info" method="get" onsubmit="return false;">
<!-- 검색 폼 -->
<div class="row g-3">
<div class="col-md-1">
<label class="form-label mb-1">매물ID</label>
<input type="text" class="form-control" name="rcpt_atclno" id="rcpt_atclno"
onkeypress="atcl_no_enter(event)">
</div>
<div class="col-md-4">
<label class="form-label mb-1">일자별조회</label>
<div class="input-group input-group-sm">
<select class="form-select" name="schDateGb">
<option value="1" selected>예약일자</option>
<option value="2">등록일자</option>
</select>
<input type="date" class="form-control" name="sdate" id="sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="edate" id="edate" placeholder="종료일">
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">관할조직</label>
<div class="d-flex gap-1">
<select name="bonbu" id="bonbu" class="form-select form-select-sm">
<option value="">-본부-</option>
<?php foreach ($bonbu as $d): ?>
<option value="<?= $d['dept_sq'] ?>">
<?= $d['dept_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="team" id="team" class="form-select form-select-sm">
<option value="">-팀-</option>
</select>
<select name="damdang" id="damdang" class="form-select form-select-sm">
<option value="">-담당자-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">지역별조회</label>
<div class="d-flex gap-1">
<select name="srcSido" id="srcSido" class="form-select form-select-sm">
<option value="">-시/도-</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>">
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="srcGugun" id="srcGugun" class="form-select form-select-sm">
<option value="">-시/군/구-</option>
</select>
<select name="srcDong" id="srcDong" class="form-select form-select-sm">
<option value="">-읍/면/동-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">현재상태</label>
<div class="d-flex gap-1">
<select name="rcpt_stat1" class="form-select form-select-sm">
<option value="">선택</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "STEP_VERIFICATION"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<!-- <select name="rcpt_stat2" id="srcGugun" class="form-select form-select-sm">
<option value="">-상태2-</option>
</select>
<select name="rcpt_stat3" id="srcDong" class="form-select form-select-sm">
<option value="">-상태3-</option>
</select> -->
</div>
</div>
<div class="col-md-1">
<label class="form-label mb-1">거래구분</label>
<select class="form-select" name="rcpt_product_info1">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "NHN_DEAL_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">동영상촬영여부</label>
<select class="form-select" name="exp_movie_yn">
<option value="">전체</option>
<option value="Y">촬영</option>
<option value="N">미촬영</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">홍보확인서여부</label>
<select class="form-select" name="conf_img_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">분양권</label>
<select class="form-select" name="parcel_out_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">CP ID</label>
<select class="form-select" name="rcpt_cpid">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "CP_ID"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">매물종류</label>
<select class="form-select" name="rcpt_product">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "ARTICLE_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">면적확인</label>
<select class="form-select" name="exp_spc_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">체크리스트</label>
<select class="form-select" name="check_list_img_yn">
<option value="">전체</option>
<option value="Y"> Y
</option>
<option value="N"> N
</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도유무</label>
<select class="form-select" name="ground_plan_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도요청</label>
<select class="form-select" name="ground_plan">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">직거래</label>
<select class="form-select" name="direct_trad_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">360촬영여부</label>
<select class="form-select" name="image_360_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<!-- 검색유형 -->
<div class="col-md-1">
<label class="form-label mb-1">검색유형</label>
<select class="form-select" name="srchType">
<option value="">선택</option>
<option value="1">중개사명</option>
<option value="2">주소</option>
<option value="3">사업자번호</option>
</select>
</div>
<!-- 검색어 -->
<div class="col-md-2">
<label class="form-label mb-1">검색어</label>
<input type="text" class="form-control" name="srchTxt" placeholder="검색어 입력">
</div>
<div class="col-md-1 d-grid">
<label class="form-label mb-1 invisible">검색</label>
<button type="button" class="btn btn-primary" id="btnSearch">
<i class="pe-7s-search me-1"></i>검색
</button>
</div>
</div>
</form>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-header d-flex align-items-center">
<div class="d-flex align-items-center flex-wrap" style="gap: 8px; flex: 1">
</div>
<div class="ml-auto">
<button class="btn btn-sm btn-outline-success" id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>
엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table id="resultList" class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th>현재상태</th>
<th>매물ID</th>
<th>접수(등록)일자</th>
<th>예약일자</th>
<th>방문희망시간</th>
<th>촬영완료일자</th>
<th>CP ID</th>
<th>중개사명</th>
<th>주소</th>
<th>매물종류</th>
<th>거래구분</th>
<?php
if ($usr_level != '45') {
?>
<th>관할조직(팀)</th>
<th>방문담당</th>
<?php
}
?>
<th>분양권</th>
<th>홍보확인서</th>
<th>동영상촬영</th>
<th>평면도유무</th>
<th>평면도요청</th>
<th>면적확인</th>
</tr>
</thead>
<tbody>
<!-- 여기는 비워둠: AJAX로 채움 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const bonbuArr = <?= json_encode($bonbu, JSON_UNESCAPED_UNICODE); ?>;
const teamArr = <?= json_encode($team, JSON_UNESCAPED_UNICODE); ?>;
const userArr = <?= json_encode($user, JSON_UNESCAPED_UNICODE); ?>;
<?php if (isset($srchUser) && !empty($srchUser)): ?>
const srchUser = <?= json_encode($srchUser, JSON_UNESCAPED_UNICODE); ?>;
<?php else: ?>
const srchUser = null;
<?php endif; ?>
const sBonbu = "<?= $sBonbu ?? '' ?>";
const sTeam = "<?= $sTeanm ?? '' ?>";
const date = new Date();
var table;
$(function () {
initReceiptDate();
// srchUser 데이터가 있으면 초기값 설정 (usr_id 파라미터)
if (srchUser) {
initSrchUser();
}
// bonbu, dept_sq 파라미터가 있으면 초기값 설정
else if (sBonbu || sTeam) {
initSrchParam();
}
$("#srcSido, #srcGugun, #srcSido2, #srcGugun2").on("change", function (e) {
const targetId = this.id;
const isSecond = this.id.endsWith("2");
const params = {
srcSido: isSecond
? $("#srcSido2").val()
: $("#frm_srch_info [name=srcSido]").val(),
srcGugun: isSecond
? $("#srcGugun2").val()
: $("#frm_srch_info [name=srcGugun]").val(),
};
$.ajax({
url: "/manage/areas/getAreaList",
method: "POST",
dataType: "json",
data: params,
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
switch (targetId) {
case "srcSido":
$("#srcGugun").empty()
var str = "";
str += "<option value=''>시/군/구</option>";
if ($("#srcSido").val() !== "") {
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
}
$("#srcGugun").append(str);
break;
case "srcGugun":
$("#srcDong").empty()
var str = "";
str += "<option value=''>읍/면/동</option>";
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
$("#srcDong").append(str);
break;
}
}
});
});
$("#bonbu, #team, #bonbu2, #team2").on("change", function (e) {
const targetId = this.id;
var str = "";
if (targetId === "bonbu" || targetId === "bonbu2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (var i = 0; i < teamArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(teamArr[i].pdept_sq) === String(dept_sq)) {
str += `
<option value="${teamArr[i].dept_sq}">${teamArr[i].dept_nm}</option>
`;
}
}
}
if (targetId === "bonbu") {
$("#team").html(str);
} else if (targetId === "bonbu2") {
$("#team2").html(str);
}
} else if (targetId === "team" || targetId === "team2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (var i = 0; i < userArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(userArr[i].dept_sq) === String(dept_sq)) {
str += `
<option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>
`;
}
}
}
if (targetId === "team") {
$("#damdang").html(str);
} else if (targetId === "team2") {
$("#damdang2").html(str);
}
}
});
// 검증방식 onchange
$("#vrfcreq_way").on("change", function (e) {
const val = e.target.value;
var str = "";
str += `<option value="">-선택-</option>`;
if (e.val !== "") {
$.getJSON("/common/common/getVrfcCode?type=" + val, function (result) {
var total = result.length;
for (var i = 0; i < total; i++) {
var cateNm = result[i].cd_nm;
if (total == 1) {
str += "<option value=\"" + result[i].cd + "\" selected>" + cateNm + "</option>";
} else {
str += "<option value=\"" + result[i].cd + "\">" + cateNm + "</option>";
}
}
$("#vrfc_type_sub").html(str);
});
} else {
$("#vrfc_type_sub").html(str);
}
});
$("#btnSearch").on("click", function () {
table.ajax.reload();
});
table = $('#resultList').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/receipt/getResultList',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.rcpt_atclno = $("#frm_srch_info [name=rcpt_atclno]").val(); // 매물ID
d.schDateGb = $("#frm_srch_info [name=schDateGb]").val(); // 일자유형
d.sdate = $("#frm_srch_info [name=sdate]").val(); // 시작일
d.edate = $("#frm_srch_info [name=edate]").val(); // 종료일
d.bonbu = $("#frm_srch_info [name=bonbu]").val(); // 본부
d.team = $("#frm_srch_info [name=team]").val(); // 팀
d.user = $("#frm_srch_info [name=user]").val(); // 담당자
d.sido = $("#frm_srch_info [name=srcSido]").val(); // 시도
d.gugun = $("#frm_srch_info [name=srcGugun]").val(); // 시군구
d.dong = $("#frm_srch_info [name=srcDong]").val(); // 읍면동
d.rcpt_stat1 = $("#frm_srch_info [name=rcpt_stat1]").val(); // 상태1
d.rcpt_stat2 = $("#frm_srch_info [name=rcpt_stat2]").val(); // 상태2
d.rcpt_stat3 = $("#frm_srch_info [name=rcpt_stat3]").val(); // 상태3
d.rcpt_product_info1 = $("#frm_srch_info [name=rcpt_product_info1]").val(); // 거래구분
d.exp_movie_yn = $("#frm_srch_info [name=exp_movie_yn]").val(); // 동영상촬영여부
d.conf_img_yn = $("#frm_srch_info [name=conf_img_yn]").val(); // 홍보확인서여부
d.parcel_out_yn = $("#frm_srch_info [name=parcel_out_yn]").val(); // 분양권
d.rcpt_cpid = $("#frm_srch_info [name=rcpt_cpid]").val(); // CPID
d.rcpt_product = $("#frm_srch_info [name=rcpt_product]").val(); // 매물종류
d.exp_spc_yn = $("#frm_srch_info [name=exp_spc_yn]").val(); // 면적확인
d.check_list_img_yn = $("#frm_srch_info [name=check_list_img_yn]").val(); // 체크리스트
d.ground_plan_yn = $("#frm_srch_info [name=ground_plan_yn]").val(); // 평면도유무
d.ground_plan = $("#frm_srch_info [name=ground_plan]").val(); // 평면도요청
d.direct_trad_yn = $("#frm_srch_info [name=direct_trad_yn]").val(); // 직거래
d.image_360_yn = $("#frm_srch_info [name=image_360_yn]").val(); // 360촬영여부
d.srchType = $("#frm_srch_info [name=srchType]").val(); // 검색유형
d.srchTxt = $("#frm_srch_info [name=srchTxt]").val(); // 검색어
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'rcpt_stat_nm' },
{ data: 'rcpt_atclno' },
{ data: 'insert_tm' },
{ data: null, render: fn_rsrv_render },
{ data: 'rsrv_tm_hour' },
{ data: 'photo_save_dt' },
{ data: 'rcpt_cpid' },
{ data: null, render: fn_agent_render },
{ data: null, render: fn_addr_render },
{ data: null, render: fn_prd_render },
{ data: 'rcpt_product_info1' },
<?php if ($usr_level != "45"): ?>
{ data: 'dept_nm' },
{ data: 'usr_nm' },
<?php endif; ?>
{ data: 'parcel_out_yn' },
{ data: 'conf_img_yn' },
{ data: 'exp_movie_yn' },
{ data: 'ground_plan_yn' },
{ data: 'ground_plan' },
{ data: 'exp_spc_yn' },
],
// 옵션들 예시
destroy: true,
deferRender: true,
scrollX: false,
autoWidth: false,
paging: true,
searching: false,
ordering: false,
});
// 테이블 row click
$('#resultList tbody').on('click', 'tr', function (e) {
if ($(e.target).closest('td.dt-no-rowclick').length) return;
const rowData = table.row(this).data();
if (!rowData) return;
const rcpt_atclno = rowData.rcpt_atclno;
window.open("<?= site_url('article/receipt/detail') ?>/" + rcpt_atclno, '_blank');
});
// 엑셀 다운로드 click
$("#excel-download").on("click", function () {
$.ajax({
url: "/article/receipt/excel",
method: "GET",
dataType: "json",
data: $("#frm_srch_info").serialize(),
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
downloadExcel(result.data);
}
});
});
});
// 접수기간 초기화
function initReceiptDate() {
const before3 = new Date();
before3.setDate(date.getDate() - 2);
const fmt = d => d.toISOString().slice(0, 10);
$('#sdate').val(fmt(before3));
$('#edate').val(fmt(date));
}
// 검색 사용자 초기화 (usr_id 파라미터용)
function initSrchUser() {
if (!srchUser) return;
const pdept_sq = srchUser.pdept_sq;
const dept_sq = srchUser.dept_sq;
const usr_id = srchUser.usr_id;
// 1단계: 본부 선택
if (pdept_sq) {
$("#bonbu").val(pdept_sq);
// 2단계: 팀 목록 로드 및 선택
let teamStr = `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (let i = 0; i < teamArr.length; i++) {
if (String(teamArr[i].pdept_sq) === String(pdept_sq)) {
const selected = String(teamArr[i].dept_sq) === String(dept_sq) ? 'selected' : '';
teamStr += `<option value="${teamArr[i].dept_sq}" ${selected}>${teamArr[i].dept_nm}</option>`;
}
}
}
$("#team").html(teamStr);
// 3단계: 담당자 목록 로드 및 선택
if (dept_sq) {
let damdangStr = `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (let i = 0; i < userArr.length; i++) {
if (String(userArr[i].dept_sq) === String(dept_sq)) {
const selected = String(userArr[i].usr_id) === String(usr_id) ? 'selected' : '';
damdangStr += `<option value="${userArr[i].usr_id}" ${selected}>${userArr[i].usr_nm}</option>`;
}
}
}
$("#damdang").html(damdangStr);
}
}
}
// 검색 파라미터 초기화 (bonbu, dept_sq 파라미터용)
function initSrchParam() {
// 1단계: 본부 선택
if (sBonbu) {
$("#bonbu").val(sBonbu);
// 2단계: 팀 목록 로드 및 선택
let teamStr = `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (let i = 0; i < teamArr.length; i++) {
if (String(teamArr[i].pdept_sq) === String(sBonbu)) {
const selected = String(teamArr[i].dept_sq) === String(sTeam) ? 'selected' : '';
teamStr += `<option value="${teamArr[i].dept_sq}" ${selected}>${teamArr[i].dept_nm}</option>`;
}
}
}
$("#team").html(teamStr);
// 3단계: 팀이 선택되어 있으면 담당자 목록 로드
if (sTeam) {
let damdangStr = `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (let i = 0; i < userArr.length; i++) {
if (String(userArr[i].dept_sq) === String(sTeam)) {
damdangStr += `<option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>`;
}
}
}
$("#damdang").html(damdangStr);
}
}
}
function atcl_no_enter(event) {
if (event.keyCode == 13) {
table.ajax.reload()
}
}
/** datatable render */
function fn_rsrv_render(data, type, row) {
var str = "";
str = row.rsrv_date + " " + row.rsrv_tm_ap;
return str;
}
function fn_agent_render(data, type, row) {
var str = "";
if (row.direct_trad_yn == 'Y') {
str = row.sellr_nm;
} else {
str = row.agent_nm;
if (row.agent_id != null) {
str += "(" + row.agent_id + ")";
}
}
return str;
}
function fn_addr_render(data, type, row) {
var str = "";
if (row.rcpt_jibun_addr == null || row.rcpt_jibun_addr == "") {
str = row.addr + "<br/>" + row.rcpt_hscp_nm + " " + row.rcpt_dtl_addr + " " + row.rcpt_ho;
} else {
str = row.addr + "<br/>" + row.rcpt_hscp_nm + " " + row.rcpt_li_addr + " " + row.rcpt_jibun_addr + " " + row.rcpt_etc_addr;
}
return str;
}
function fn_prd_render(data, type, row) {
var str = "";
if (row.rcpt_product_nm != null && row.rcpt_product_nm != "") {
str = row.rcpt_product_nm;
} else {
str = row.rcpt_product;
}
return str;
}
/** datatable render */
// 엑셀 다운로드
function downloadExcel(data) {
const ws = XLSX.utils.json_to_sheet(data);
// ws['!cols'] = [
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 150 },
// { wpx: 120 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// ];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
const blob = new Blob([wbout], { type: 'application/octet-stream' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "현장확인매물_접수_현황" + getDateTimeString() + ".xlsx";
link.click();
URL.revokeObjectURL(link.href);
}
</script>
<?= $this->endSection() ?>

View File

@@ -0,0 +1,840 @@
<?php
$usr_level = session('usr_level');
$usr_sq = session('usr_sq');
$usr_nm = session('usr_nm');
?>
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
th {
font-size: 11px;
text-align: center;
}
td {
text-align: center;
}
#resultList tbody tr {
cursor: pointer;
}
.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;
}
#resultList.dataTable {
width: max-content !important;
}
table.dataTable td,
table.dataTable th {
white-space: nowrap;
}
/* 테이블이 내용만큼 커지고, wrapper가 스크롤 담당 */
.table-responsive {
overflow-x: auto !important;
}
/* 테이블 폭: 내용 기준으로 커지되, 최소는 100% */
.table-responsive #resultList {
width: max-content !important;
min-width: 100% !important;
table-layout: auto !important;
}
/* 줄바꿈 금지 */
#resultList th,
#resultList td {
white-space: nowrap;
}
/* PC에서 가로 스크롤이 잘리는 대표 구간들 강제 해제 */
.main-card,
.card,
.card-body {
overflow-x: visible !important;
}
/* 만약 레이아웃 wrapper가 숨기고 있으면 이것도 */
.app-main__outer,
.app-main__inner,
.app-main {
overflow-x: visible !important;
}
/* flex 환경에서 필수 */
.app-main,
.app-main__outer,
.app-main__inner,
.card,
.card-body {
min-width: 0;
}
</style>
<h1>현장확인V2 매물 접수 현황</h1>
<div class="col-md-12 col-xl-12">
<div class="main-card mb-3 card">
<div class="card-body">
<form id="frm_srch_info" method="get" onsubmit="return false;">
<!-- 검색 폼 -->
<div class="row g-3">
<div class="col-md-1">
<label class="form-label mb-1">매물ID</label>
<input type="text" class="form-control" name="rcpt_atclno" id="rcpt_atclno"
onkeypress="atcl_no_enter(event)">
</div>
<div class="col-md-4">
<label class="form-label mb-1">일자별조회</label>
<div class="input-group input-group-sm">
<select class="form-select" name="schDateGb">
<option value="1" selected>예약일자</option>
<option value="2">등록일자</option>
</select>
<input type="date" class="form-control" name="sdate" id="sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="edate" id="edate" placeholder="종료일">
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">관할조직</label>
<div class="d-flex gap-1">
<select name="bonbu" id="bonbu" class="form-select form-select-sm">
<option value="">-본부-</option>
<?php foreach ($bonbu as $d): ?>
<option value="<?= $d['dept_sq'] ?>">
<?= $d['dept_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="team" id="team" class="form-select form-select-sm">
<option value="">-팀-</option>
</select>
<select name="damdang" id="damdang" class="form-select form-select-sm">
<option value="">-담당자-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">지역별조회</label>
<div class="d-flex gap-1">
<select name="srcSido" id="srcSido" class="form-select form-select-sm">
<option value="">-시/도-</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>">
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="srcGugun" id="srcGugun" class="form-select form-select-sm">
<option value="">-시/군/구-</option>
</select>
<select name="srcDong" id="srcDong" class="form-select form-select-sm">
<option value="">-읍/면/동-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">현재상태</label>
<div class="d-flex gap-1">
<select name="rcpt_stat1" class="form-select form-select-sm">
<option value="">예약확인지연</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "STEP_VERIFICATION"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
<select name="rcpt_stat2" id="srcGugun" class="form-select form-select-sm">
<option value="">-상태2-</option>
</select>
<select name="rcpt_stat3" id="srcDong" class="form-select form-select-sm">
<option value="">-상태3-</option>
</select>
</div>
</div>
<div class="col-md-1">
<label class="form-label mb-1">거래구분</label>
<select class="form-select" name="rcpt_product_info1">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "NHN_DEAL_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">동영상촬영여부</label>
<select class="form-select" name="exp_movie_yn">
<option value="">전체</option>
<option value="Y">촬영</option>
<option value="N">미촬영</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">홍보확인서여부</label>
<select class="form-select" name="conf_img_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">분양권</label>
<select class="form-select" name="parcel_out_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">CP ID</label>
<select class="form-select" name="rcpt_cpid">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "CP_ID"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">매물종류</label>
<select class="form-select" name="rcpt_product">
<option value="">전체</option>
<?php foreach ($codes as $c): ?>
<?php if ($c['category'] === "ARTICLE_TYPE"): ?>
<option value="<?= $c['cd'] ?>"><?= $c['cd_nm'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">면적확인</label>
<select class="form-select" name="exp_spc_yn">
<option value="">전체</option>
<option value="Y"> Y</option>
<option value="N"> N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">체크리스트</label>
<select class="form-select" name="check_list_img_yn">
<option value="">전체</option>
<option value="Y"> Y
</option>
<option value="N"> N
</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도유무</label>
<select class="form-select" name="ground_plan_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">평면도요청</label>
<select class="form-select" name="ground_plan">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">직거래</label>
<select class="form-select" name="direct_trad_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">360촬영여부</label>
<select class="form-select" name="image_360_yn">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">검증방식</label>
<select class="form-select" name="isSiteVRVerification">
<option value="">전체</option>
<option value="N">현장확인</option>
<option value="Y">현장확인V2</option>
</select>
</div>
<div class="col-md-1">
<label class="form-label mb-1">프로모션</label>
<select class="form-select" name="isPromotionApply">
<option value="">전체</option>
<option value="Y">Y</option>
<option value="N">N</option>
</select>
</div>
<!-- 검색유형 -->
<div class="col-md-1">
<label class="form-label mb-1">검색유형</label>
<select class="form-select" name="srchType">
<option value="">선택</option>
<option value="1">중개사명</option>
<option value="2">주소</option>
<option value="3">사업자번호</option>
</select>
</div>
<!-- 검색어 -->
<div class="col-md-2">
<label class="form-label mb-1">검색어</label>
<input type="text" class="form-control" name="srchTxt" placeholder="검색어 입력">
</div>
<div class="col-md-1 d-grid">
<label class="form-label mb-1 invisible">검색</label>
<button type="button" class="btn btn-primary" id="btnSearch">
<i class="pe-7s-search me-1"></i>검색
</button>
</div>
</div>
</form>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-header d-flex align-items-center">
<div class="d-flex align-items-center flex-wrap" style="gap: 8px; flex: 1">
</div>
<div class="ml-auto">
<button class="btn btn-sm btn-outline-success" id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>
엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table id="resultList" class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th>검증방식</th>
<th>프로모션</th>
<th>현재상태</th>
<th>매물ID</th>
<th>접수(등록)일자</th>
<th>예약일자</th>
<th>방문희망시간</th>
<th>촬영완료일자</th>
<th>CP ID</th>
<th>중개사명</th>
<th>주소</th>
<th>매물종류</th>
<th>거래구분</th>
<?php
if ($usr_level != '45') {
?>
<th>관할조직(팀)</th>
<th>방문담당</th>
<?php
}
?>
<th>분양권</th>
<th>홍보확인서</th>
</tr>
</thead>
<tbody>
<!-- 여기는 비워둠: AJAX로 채움 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const bonbuArr = <?= json_encode($bonbu, JSON_UNESCAPED_UNICODE); ?>;
const teamArr = <?= json_encode($team, JSON_UNESCAPED_UNICODE); ?>;
const userArr = <?= json_encode($user, JSON_UNESCAPED_UNICODE); ?>;
const date = new Date();
var table;
$(function () {
initReceiptDate();
$("#srcSido, #srcGugun, #srcSido2, #srcGugun2").on("change", function (e) {
const targetId = this.id;
const isSecond = this.id.endsWith("2");
const params = {
srcSido: isSecond
? $("#srcSido2").val()
: $("#frm_srch_info [name=srcSido]").val(),
srcGugun: isSecond
? $("#srcGugun2").val()
: $("#frm_srch_info [name=srcGugun]").val(),
};
$.ajax({
url: "/manage/areas/getAreaList",
method: "POST",
dataType: "json",
data: params,
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
switch (targetId) {
case "srcSido":
$("#srcGugun").empty()
var str = "";
str += "<option value=''>시/군/구</option>";
if ($("#srcSido").val() !== "") {
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
}
$("#srcGugun").append(str);
break;
case "srcGugun":
$("#srcDong").empty()
var str = "";
str += "<option value=''>읍/면/동</option>";
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
$("#srcDong").append(str);
break;
}
}
});
});
$("#bonbu, #team, #bonbu2, #team2").on("change", function (e) {
const targetId = this.id;
var str = "";
if (targetId === "bonbu" || targetId === "bonbu2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (var i = 0; i < teamArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(teamArr[i].pdept_sq) === String(dept_sq)) {
str += `
<option value="${teamArr[i].dept_sq}">${teamArr[i].dept_nm}</option>
`;
}
}
}
if (targetId === "bonbu") {
$("#team").html(str);
} else if (targetId === "bonbu2") {
$("#team2").html(str);
}
} else if (targetId === "team" || targetId === "team2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (var i = 0; i < userArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(userArr[i].dept_sq) === String(dept_sq)) {
str += `
<option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>
`;
}
}
}
if (targetId === "team") {
$("#damdang").html(str);
} else if (targetId === "team2") {
$("#damdang2").html(str);
}
}
});
// 검증방식 onchange
$("#vrfcreq_way").on("change", function (e) {
const val = e.target.value;
var str = "";
str += `<option value="">-선택-</option>`;
if (e.val !== "") {
$.getJSON("/common/common/getVrfcCode?type=" + val, function (result) {
var total = result.length;
for (var i = 0; i < total; i++) {
var cateNm = result[i].cd_nm;
if (total == 1) {
str += "<option value=\"" + result[i].cd + "\" selected>" + cateNm + "</option>";
} else {
str += "<option value=\"" + result[i].cd + "\">" + cateNm + "</option>";
}
}
$("#vrfc_type_sub").html(str);
});
} else {
$("#vrfc_type_sub").html(str);
}
});
$("#btnSearch").on("click", function () {
table.ajax.reload();
});
table = $('#resultList').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/receipt2/getResultList',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.rcpt_atclno = $("#frm_srch_info [name=rcpt_atclno]").val(); // 매물ID
d.schDateGb = $("#frm_srch_info [name=schDateGb]").val(); // 일자유형
d.sdate = $("#frm_srch_info [name=sdate]").val(); // 시작일
d.edate = $("#frm_srch_info [name=edate]").val(); // 종료일
d.bonbu = $("#frm_srch_info [name=bonbu]").val(); // 본부
d.team = $("#frm_srch_info [name=team]").val(); // 팀
d.user = $("#frm_srch_info [name=user]").val(); // 담당자
d.sido = $("#frm_srch_info [name=srcSido]").val(); // 시도
d.gugun = $("#frm_srch_info [name=srcGugun]").val(); // 시군구
d.dong = $("#frm_srch_info [name=srcDong]").val(); // 읍면동
d.rcpt_stat1 = $("#frm_srch_info [name=rcpt_stat1]").val(); // 상태1
d.rcpt_stat2 = $("#frm_srch_info [name=rcpt_stat2]").val(); // 상태2
d.rcpt_stat3 = $("#frm_srch_info [name=rcpt_stat3]").val(); // 상태3
d.rcpt_product_info1 = $("#frm_srch_info [name=rcpt_product_info1]").val(); // 거래구분
d.exp_movie_yn = $("#frm_srch_info [name=exp_movie_yn]").val(); // 동영상촬영여부
d.conf_img_yn = $("#frm_srch_info [name=conf_img_yn]").val(); // 홍보확인서여부
d.parcel_out_yn = $("#frm_srch_info [name=parcel_out_yn]").val(); // 분양권
d.rcpt_cpid = $("#frm_srch_info [name=rcpt_cpid]").val(); // CPID
d.rcpt_product = $("#frm_srch_info [name=rcpt_product]").val(); // 매물종류
d.exp_spc_yn = $("#frm_srch_info [name=exp_spc_yn]").val(); // 면적확인
d.check_list_img_yn = $("#frm_srch_info [name=check_list_img_yn]").val(); // 체크리스트
d.ground_plan_yn = $("#frm_srch_info [name=ground_plan_yn]").val(); // 평면도유무
d.ground_plan = $("#frm_srch_info [name=ground_plan]").val(); // 평면도요청
d.direct_trad_yn = $("#frm_srch_info [name=direct_trad_yn]").val(); // 직거래
d.image_360_yn = $("#frm_srch_info [name=image_360_yn]").val(); // 360촬영여부
d.isSiteVRVerification = $("#frm_srch_info [name=isSiteVRVerification]").val(); //검증방식
d.isPromotionApply = $("#frm_srch_info [name=isPromotionApply]").val(); // 프로모션
d.srchType = $("#frm_srch_info [name=srchType]").val(); // 검색유형
d.srchTxt = $("#frm_srch_info [name=srchTxt]").val(); // 검색어
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'exp_movie_yn', render: fn_verify_render },
{ data: 'ground_plan_yn', render: fn_promo_render },
{ data: 'rcpt_stat_nm' },
{ data: 'rcpt_atclno' },
{ data: 'insert_tm' },
{ data: null, render: fn_rsrv_render },
{ data: 'rsrv_tm_hour' },
{ data: 'photo_save_dt' },
{ data: 'rcpt_cpid' },
{ data: null, render: fn_agent_render },
{ data: null, render: fn_addr_render },
{ data: null, render: fn_prd_render },
{ data: 'rcpt_product_info1' },
<?php if ($usr_level != "45"): ?>
{ data: 'dept_nm' },
{ data: 'usr_nm' },
<?php endif; ?>
{ data: 'parcel_out_yn' },
{ data: 'conf_img_yn' },
],
// 옵션들 예시
destroy: true,
deferRender: true,
scrollX: false,
autoWidth: false,
paging: true,
searching: false,
ordering: false,
});
// 테이블 row click
$('#resultList tbody').on('click', 'tr', function (e) {
if ($(e.target).closest('td.dt-no-rowclick').length) return;
const rowData = table.row(this).data();
if (!rowData) return;
const rcpt_atclno = rowData.rcpt_atclno;
location.href = "<?= site_url('article/dept/detail') ?>/" + rcpt_atclno;
});
// 엑셀 다운로드 click
$("#excel-download").on("click", function () {
$.ajax({
url: "/article/receipt2/excel",
method: "GET",
dataType: "json",
data: $("#frm_srch_info").serialize(),
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
downloadExcel(result.data);
}
});
});
});
// 접수기간 초기화
function initReceiptDate() {
const before3 = new Date();
before3.setDate(date.getDate() - 2);
const fmt = d => d.toISOString().slice(0, 10);
$('#sdate').val(fmt(before3));
$('#edate').val(fmt(date));
}
function atcl_no_enter(event) {
if (event.keyCode == 13) {
table.ajax.reload()
}
}
/** datatable render */
function fn_verify_render(data, type, row) {
var str = "";
if (row.isSiteVRVerification == "Y") {
str = "현장V2";
} else {
str = "현장";
}
return str;
}
function fn_promo_render(data, type, row) {
var str = "";
if (row.isSiteVRVerification == "Y") {
str = row.isPromotionApply;
}
return str;
}
function fn_rsrv_render(data, type, row) {
var str = "";
str = row.rsrv_date + " " + row.rsrv_tm_ap;
return str;
}
function fn_agent_render(data, type, row) {
var str = "";
if (row.direct_trad_yn == 'Y') {
str = row.sellr_nm;
} else {
str = row.agent_nm;
if (row.agent_id != null) {
str += "(" + row.agent_id + ")";
}
}
return str;
}
function fn_addr_render(data, type, row) {
var str = "";
if (row.rcpt_jibun_addr == null || row.rcpt_jibun_addr == "") {
str = row.addr + "<br/>" + row.rcpt_hscp_nm + " " + row.rcpt_dtl_addr + " " + row.rcpt_ho;
} else {
str = row.addr + "<br/>" + row.rcpt_hscp_nm + " " + row.rcpt_li_addr + " " + row.rcpt_jibun_addr + " " + row.rcpt_etc_addr;
}
return str;
}
function fn_prd_render(data, type, row) {
var str = "";
if (row.rcpt_product_nm != null && row.rcpt_product_nm != "") {
str = row.rcpt_product_nm;
} else {
str = row.rcpt_product;
}
return str;
}
/** datatable render */
// 엑셀 다운로드
function downloadExcel(data) {
const ws = XLSX.utils.json_to_sheet(data);
// ws['!cols'] = [
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 150 },
// { wpx: 120 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// ];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
const blob = new Blob([wbout], { type: 'application/octet-stream' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "현장확인V2_매물_접수_현황_" + getDateTimeString() + ".xlsx";
link.click();
URL.revokeObjectURL(link.href);
}
</script>
<?= $this->endSection() ?>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,613 @@
<?php
$usr_level = session('usr_level');
$usr_sq = session('usr_sq');
$usr_nm = session('usr_nm');
?>
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<style>
th {
font-size: 11px;
text-align: center;
}
td {
text-align: center;
}
#resultList tbody tr {
cursor: pointer;
}
.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;
}
#resultList.dataTable {
width: max-content !important;
}
table.dataTable td,
table.dataTable th {
white-space: nowrap;
}
/* 테이블이 내용만큼 커지고, wrapper가 스크롤 담당 */
.table-responsive {
overflow-x: auto !important;
}
/* 테이블 폭: 내용 기준으로 커지되, 최소는 100% */
.table-responsive #resultList {
width: max-content !important;
min-width: 100% !important;
table-layout: auto !important;
}
/* 줄바꿈 금지 */
#resultList th,
#resultList td {
white-space: nowrap;
}
/* PC에서 가로 스크롤이 잘리는 대표 구간들 강제 해제 */
.main-card,
.card,
.card-body {
overflow-x: visible !important;
}
/* 만약 레이아웃 wrapper가 숨기고 있으면 이것도 */
.app-main__outer,
.app-main__inner,
.app-main {
overflow-x: visible !important;
}
/* flex 환경에서 필수 */
.app-main,
.app-main__outer,
.app-main__inner,
.card,
.card-body {
min-width: 0;
}
</style>
<h1>녹취매물 내역</h1>
<div class="col-md-12 col-xl-12">
<div class="main-card mb-3 card">
<div class="card-body">
<form id="frm_srch_info" method="get" onsubmit="return false;">
<!-- 검색 폼 -->
<div class="row g-3">
<div class="col-md-1">
<label class="form-label mb-1">매물ID</label>
<input type="text" class="form-control" name="rcpt_atclno" id="rcpt_atclno"
onkeypress="atcl_no_enter(event)">
</div>
<div class="col-md-3">
<label class="form-label mb-1">관할조직</label>
<div class="d-flex gap-1">
<select name="bonbu" id="bonbu" class="form-select form-select-sm">
<option value="">-본부-</option>
<?php foreach ($bonbu as $d): ?>
<option value="<?= $d['dept_sq'] ?>">
<?= $d['dept_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="team" id="team" class="form-select form-select-sm">
<option value="">-팀-</option>
</select>
<select name="damdang" id="damdang" class="form-select form-select-sm">
<option value="">-담당자-</option>
</select>
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">지역별조회</label>
<div class="d-flex gap-1">
<select name="srcSido" id="srcSido" class="form-select form-select-sm">
<option value="">-시/도-</option>
<?php foreach ($sido as $s): ?>
<option value="<?= $s['region_cd'] ?>">
<?= $s['region_nm'] ?>
</option>
<?php endforeach; ?>
</select>
<select name="srcGugun" id="srcGugun" class="form-select form-select-sm">
<option value="">-시/군/구-</option>
</select>
<select name="srcDong" id="srcDong" class="form-select form-select-sm">
<option value="">-읍/면/동-</option>
</select>
</div>
</div>
</div>
<div class="row g-3">
<div class="col-md-3">
<label class="form-label mb-1">접수기간</label>
<div class="input-group input-group-sm">
<input type="date" class="form-control" name="sdate" id="sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="edate" id="edate" placeholder="종료일">
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">촬영완료일자</label>
<div class="input-group input-group-sm">
<input type="date" class="form-control" name="photo_sdate" id="photo_sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="photo_edate" id="photo_edate" placeholder="종료일">
</div>
</div>
<div class="col-md-3">
<label class="form-label mb-1">녹취완료일자</label>
<div class="input-group input-group-sm">
<input type="date" class="form-control" name="record_sdate" id="record_sdate" placeholder="시작일">
<span class="input-group-text">~</span>
<input type="date" class="form-control" name="record_edate" id="record_edate" placeholder="종료일">
</div>
</div>
<div class="col-md-1">
<label class="form-label mb-1">녹취완료여부</label>
<select class="form-select" name="rec_yn">
<option value="">선택</option>
<option value="Y">완료</option>
<option value="N">미완료</option>
</select>
</div>
</div>
<div class="row g-3">
<div class="col-md-1">
<label class="form-label mb-1">검색유형</label>
<select class="form-select" name="srchType">
<option value="">선택</option>
<option value="1">중개사명</option>
<option value="2">거주인명</option>
<option value="3">거주인연락처</option>
</select>
</div>
<!-- 검색어 -->
<div class="col-md-2">
<label class="form-label mb-1">검색어</label>
<input type="text" class="form-control" name="srchTxt" placeholder="검색어 입력">
</div>
<div class="col-md-1 d-grid">
<label class="form-label mb-1 invisible">검색</label>
<button type="button" class="btn btn-primary" id="btnSearch">
<i class="pe-7s-search me-1"></i>검색
</button>
</div>
</div>
</form>
</div>
</div>
<div class="main-card mb-3 card">
<div class="card-header d-flex align-items-center">
<div class="d-flex align-items-center flex-wrap" style="gap: 8px; flex: 1">
</div>
<div class="ml-auto">
<button class="btn btn-sm btn-outline-success" id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>
엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table id="resultList" class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th>진행상태</th>
<th>매물ID</th>
<th>접수(등록)일자</th>
<th>촬영일자</th>
<th>녹취완료일자</th>
<th>중개사</th>
<th>주소</th>
<th>거주인명</th>
<th>거주인연락처</th>
<th>관할조직</th>
<th>방문담당</th>
</tr>
</thead>
<tbody>
<!-- 여기는 비워둠: AJAX로 채움 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const bonbuArr = <?= json_encode($bonbu, JSON_UNESCAPED_UNICODE); ?>;
const teamArr = <?= json_encode($team, JSON_UNESCAPED_UNICODE); ?>;
const userArr = <?= json_encode($user, JSON_UNESCAPED_UNICODE); ?>;
const date = new Date();
var table;
$(function () {
// initReceiptDate();
$("#srcSido, #srcGugun, #srcSido2, #srcGugun2").on("change", function (e) {
const targetId = this.id;
const isSecond = this.id.endsWith("2");
const params = {
srcSido: isSecond
? $("#srcSido2").val()
: $("#frm_srch_info [name=srcSido]").val(),
srcGugun: isSecond
? $("#srcGugun2").val()
: $("#frm_srch_info [name=srcGugun]").val(),
};
$.ajax({
url: "/manage/areas/getAreaList",
method: "POST",
dataType: "json",
data: params,
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
switch (targetId) {
case "srcSido":
$("#srcGugun").empty()
var str = "";
str += "<option value=''>시/군/구</option>";
if ($("#srcSido").val() !== "") {
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
}
$("#srcGugun").append(str);
break;
case "srcGugun":
$("#srcDong").empty()
var str = "";
str += "<option value=''>읍/면/동</option>";
if (result.length > 0) {
for (var i = 0; i < result.length; i++) {
str += "<option value='" + result[i]['region_cd'] + "'>" + result[i].region_nm + "</option>";
}
}
$("#srcDong").append(str);
break;
}
}
});
});
$("#bonbu, #team, #bonbu2, #team2").on("change", function (e) {
const targetId = this.id;
var str = "";
if (targetId === "bonbu" || targetId === "bonbu2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-팀-</option>`;
if (teamArr.length > 0) {
for (var i = 0; i < teamArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(teamArr[i].pdept_sq) === String(dept_sq)) {
str += `
<option value="${teamArr[i].dept_sq}">${teamArr[i].dept_nm}</option>
`;
}
}
}
if (targetId === "bonbu") {
$("#team").html(str);
} else if (targetId === "bonbu2") {
$("#team2").html(str);
}
} else if (targetId === "team" || targetId === "team2") {
const dept_sq = $("#" + targetId).val();
str += `<option value="">-담당자-</option>`;
if (userArr.length > 0) {
for (var i = 0; i < userArr.length; i++) {
// 이 팀이 현재 본부에 속한 팀인지 체크
if (String(userArr[i].dept_sq) === String(dept_sq)) {
str += `
<option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>
`;
}
}
}
if (targetId === "team") {
$("#damdang").html(str);
} else if (targetId === "team2") {
$("#damdang2").html(str);
}
}
});
// 검증방식 onchange
$("#vrfcreq_way").on("change", function (e) {
const val = e.target.value;
var str = "";
str += `<option value="">-선택-</option>`;
if (e.val !== "") {
$.getJSON("/common/common/getVrfcCode?type=" + val, function (result) {
var total = result.length;
for (var i = 0; i < total; i++) {
var cateNm = result[i].cd_nm;
if (total == 1) {
str += "<option value=\"" + result[i].cd + "\" selected>" + cateNm + "</option>";
} else {
str += "<option value=\"" + result[i].cd + "\">" + cateNm + "</option>";
}
}
$("#vrfc_type_sub").html(str);
});
} else {
$("#vrfc_type_sub").html(str);
}
});
$("#btnSearch").on("click", function () {
table.ajax.reload();
});
table = $('#resultList').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/article/record/getResultList',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.rcpt_atclno = $("#frm_srch_info [name=rcpt_atclno]").val(); // 매물ID
d.sdate = $("#frm_srch_info [name=sdate]").val(); // 접수기간 시작
d.edate = $("#frm_srch_info [name=edate]").val(); // 접수기간 종료
d.photo_sdate = $("#frm_srch_info [name=photo_sdate]").val(); // 촬영완료일자 시작
d.photo_edate = $("#frm_srch_info [name=photo_edate]").val(); // 촬영완료일자 종료
d.record_sdate = $("#frm_srch_info [name=record_sdate]").val(); // 녹취완료일자 시작
d.record_edate = $("#frm_srch_info [name=record_edate]").val(); // 녹취완료일자 종료
d.rec_yn = $("#frm_srch_info [name=rec_yn]").val(); // 녹취완료여부
d.bonbu = $("#frm_srch_info [name=bonbu]").val(); // 본부
d.team = $("#frm_srch_info [name=team]").val(); // 팀
d.user = $("#frm_srch_info [name=user]").val(); // 담당자
d.sido = $("#frm_srch_info [name=srcSido]").val(); // 시도
d.gugun = $("#frm_srch_info [name=srcGugun]").val(); // 시군구
d.dong = $("#frm_srch_info [name=srcDong]").val(); // 읍면동
d.srchType = $("#frm_srch_info [name=srchType]").val(); // 검색유형
d.srchTxt = $("#frm_srch_info [name=srchTxt]").val(); // 검색어
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'rcpt_stat_nm' },
{ data: 'rcpt_atclno' },
{ data: 'insert_tm' },
{ data: 'photo_save_dt' },
{ data: 'record_cplt_dt' },
{ data: 'agent_nm' },
{ data: null, render: fn_addr_render },
{ data: 'rec_nm' },
{ data: 'rec_tel' },
{ data: 'dept_nm' },
{ data: 'usr_nm' },
],
// 옵션들 예시
destroy: true,
deferRender: true,
scrollX: false,
autoWidth: false,
paging: true,
searching: false,
ordering: false,
});
// 테이블 row click
$('#resultList tbody').on('click', 'tr', function (e) {
if ($(e.target).closest('td.dt-no-rowclick').length) return;
const rowData = table.row(this).data();
if (!rowData) return;
const rcpt_key = rowData.rcpt_key;
window.open("<?= site_url('article/record/detail') ?>/" + rcpt_key, '_blank');
});
// 엑셀 다운로드 click
$("#excel-download").on("click", function () {
$.ajax({
url: "/article/record/excel",
method: "GET",
dataType: "json",
data: $("#frm_srch_info").serialize(),
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
success: function (result) {
downloadExcel(result.data);
}
});
});
});
// 접수기간 초기화
function initReceiptDate() {
const before3 = new Date();
before3.setDate(date.getDate() - 2);
const fmt = d => d.toISOString().slice(0, 10);
$('#sdate').val(fmt(before3));
$('#edate').val(fmt(date));
}
function atcl_no_enter(event) {
if (event.keyCode == 13) {
table.ajax.reload()
}
}
/** datatable render */
function fn_addr_render(data, type, row) {
var str = "";
str = row.addr + " " + row.rcpt_hscp_nm;
return str;
}
/** datatable render */
// 엑셀 다운로드
function downloadExcel(data) {
const ws = XLSX.utils.json_to_sheet(data);
// ws['!cols'] = [
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 150 },
// { wpx: 120 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// { wpx: 100 },
// ];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
const blob = new Blob([wbout], { type: 'application/octet-stream' });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "녹취매물_내역" + getDateTimeString() + ".xlsx";
link.click();
URL.revokeObjectURL(link.href);
}
</script>
<?= $this->endSection() ?>

View File

@@ -0,0 +1,998 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<?php
/**
* 문자열/JSON/배열 모두 받아서 "항목 리스트"로 정규화
* - JSON 배열 문자열: '["a","b"]'
* - 개행 문자열: "a\nb"
* - 배열: ["a","b"]
*/
function normalize_lines($v): array
{
if ($v === null)
return [];
// 이미 배열이면 그대로
if (is_array($v)) {
return array_values(array_filter(array_map('trim', $v), fn($x) => $x !== ''));
}
$s = trim((string) $v);
if ($s === '')
return [];
// JSON 배열 문자열이면 decode
if ($s[0] === '[') {
$decoded = json_decode($s, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
return array_values(array_filter(array_map('trim', $decoded), fn($x) => $x !== ''));
}
}
// 개행 기반 분리
$lines = preg_split("/\r\n|\r|\n/", $s);
return array_values(array_filter(array_map('trim', $lines), fn($x) => $x !== ''));
}
/**
* 상세 섹션 렌더
*/
function render_detail_section(string $title, $value): string
{
$lines = normalize_lines($value);
if (empty($lines))
return '';
$html = '<div class="detail-row">';
$html .= '<div class="detail-title">' . esc($title) . '</div>';
$html .= '<ul class="detail-list">';
foreach ($lines as $line) {
$html .= '<li>' . esc($line) . '</li>';
}
$html .= '</ul></div>';
return $html;
}
/**
* 원리금균등상환
* @param float $principal
* @param float $annualRate
* @param int $years
* @return float|int
*/
function calcEqualPaymentMonthly(float $principal, float $annualRate, int $years): float
{
$n = $years * 12;
$r = ($annualRate / 100.0) / 12.0;
if ($n <= 0)
return 0.0;
if (abs($r) < 1e-12)
return $principal / $n;
$pow = pow(1.0 + $r, $n);
return ($principal * $r * $pow) / ($pow - 1.0);
}
/**
* 원금균등상환
* @param float $principal
* @param float $annualRate
* @param int $years
* @return float|int
*/
function calcEqualPrincipalAvgMonthly(float $principal, float $annualRate, int $years): float
{
$n = $years * 12;
$r = ($annualRate / 100.0) / 12.0;
if ($n <= 0)
return 0.0;
// 이자합(원금균등): P*r*(n+1)/2 (매달 원금이 선형 감소)
$totalInterest = $principal * $r * ($n + 1) / 2.0;
$totalPayment = $principal + $totalInterest;
return $totalPayment / $n;
}
function won(float $v): string
{
return number_format((int) round($v));
}
?>
<style>
.product_list {
list-style: none;
padding: 0;
margin: 0;
display: grid;
gap: 12px;
}
.product-card {
border: 1px solid #e9ecef;
border-radius: 12px;
padding: 14px;
background: #fff;
}
.title-row {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
.bank_name {
font-weight: 700;
text-decoration: none;
color: #00f;
}
.product_name {
font-weight: 600;
}
.badges {
/*margin-left: auto;*/
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.label_icon {
display: inline-block;
color: #555;
margin: 4px 0 0 5px;
border-radius: 15px;
-webkit-border-radius: 15px;
font-size: 11px;
line-height: 13px;
border: 1px solid #555;
padding: 2px 6px;
vertical-align: top;
font-weight: bold;
}
.rate_detail {
display: flex;
gap: 14px;
margin: 10px 0 0;
}
.rate_detail .rate {
display: flex;
gap: 6px;
align-items: baseline;
}
.rate_detail dt {
color: #6c757d;
font-size: 12px;
}
.rate_detail dd {
margin: 0;
}
.rate_text {
font-size: 16px;
color: #F58027;
}
.text_red {
font-size: 14px;
color: #F58027;
}
.product-actions {
display: flex;
gap: 8px;
margin-top: 12px;
}
.collapse-box {
margin-top: 12px;
border-top: 1px dashed #e9ecef;
padding-top: 12px;
}
.detail-grid {
display: grid;
gap: 12px;
}
.detail-row {
border: 1px solid #f1f3f5;
border-radius: 10px;
padding: 12px;
background: #fcfcfd;
}
.detail-title {
font-weight: 800;
font-size: 13px;
color: #343a40;
margin-bottom: 6px;
}
.detail-list {
margin: 0;
padding-left: 18px;
color: #495057;
}
.detail-list li {
margin: 3px 0;
}
.detail-foot {
margin-top: 10px;
font-size: 12px;
color: #868e96;
}
table {
text-align: center;
}
.rate-cell {
vertical-align: middle !important;
/* fallback */
padding: 12px 10px;
}
.rate-cell {
display: grid;
flex-direction: column;
justify-content: center;
/* 세로 가운데 */
align-items: flex-start;
/* 왼쪽 정렬 */
height: 100%;
}
.rate-cell span {
line-height: 1.2;
}
.rate-cell p {
margin: 2px 0 0;
line-height: 1.2;
}
/* ===== Owl wrapper ===== */
.owl-wrap {
position: relative;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Owl 내부 overflow/폭 안정화 */
.owl-wrap .owl-stage-outer {
overflow: hidden;
width: 100%;
max-width: 100%;
}
/* Owl 기본 nav/dots는 우리가 커스텀 컨트롤을 쓰므로 숨김 */
.product-carousel .owl-nav,
.product-carousel .owl-dots {
display: none !important;
}
/* ===== 컨트롤 바 ===== */
.owl-controls-bar {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-top: 14px;
user-select: none;
}
/* 화살표 버튼 */
.owl-controls-bar .owl-btn {
width: 44px;
height: 44px;
border-radius: 999px;
border: 1px solid #dee2e6;
background: #fff;
color: #212529;
font-size: 28px;
/* 아이콘 크기 */
line-height: 1;
display: inline-flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
cursor: pointer;
}
.owl-controls-bar .owl-btn:hover {
background: #f8f9fa;
}
.owl-controls-bar .owl-btn:active {
transform: translateY(1px);
}
/* 비활성(맨 처음/맨 끝) */
.owl-controls-bar .owl-btn.is-disabled {
opacity: 0.45;
cursor: default;
box-shadow: none;
}
/* 1/N 카운터 */
.owl-controls-bar .owl-counter {
min-width: 74px;
text-align: center;
font-weight: 700;
color: #495057;
}
/* 모바일 터치 영역 살짝 키우기 */
@media (max-width: 576px) {
.owl-controls-bar .owl-btn {
width: 50px;
height: 50px;
font-size: 30px;
}
.owl-controls-bar .owl-counter {
min-width: 84px;
}
}
</style>
<div class="d-grid">
<div class="mb-3 card">
<div class="tabs-lg-alternate card-header">
<ul class="nav nav-justified">
<li class="nav-item">
<a data-bs-toggle="tab" href="#tab-eg9-0" class="active nav-link" data-cd="all">
<div class="widget-number">전체</div>
</a>
</li>
<?php foreach ($place as $p): ?>
<li class="nav-item">
<a data-bs-toggle="tab" href="#tab-eg9-0" class="nav-link" data-cd="<?= $p['cd'] ?>">
<div class="widget-number"><?= $p['cd_nm'] ?></div>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="tab-content">
<div class="tab-pane active" id="tab-eg9-0" role="tabpanel">
<div class="card-body">
<?php
// $data: 상품 리스트 배열이라고 가정
$chunks = array_chunk($data, 5); // 5개씩 슬라이드 1장
?>
<div class="owl-wrap">
<div class="owl-carousel product-carousel">
<?php foreach ($chunks as $pageIdx => $items): ?>
<div class="item">
<ul class="product_list">
<?php foreach ($items as $d): ?>
<li class="product-card">
<div class="product-head">
<div class="title-row">
<a href="<?= esc($d['bank_url'] ?? '#') ?>" class="bank_name" target="_blank" rel="noopener">
<?= esc($d['bank'] ?? '') ?>
</a>
<span class="product_name"><?= esc($d['product'] ?? '') ?></span>
<div class="badges">
<?php if ($d['chg_yn'] == "Y"): ?>
<span class="label_icon">변동금리</span>
<?php endif; ?>
<?php if ($d['split_yn'] == "Y"): ?>
<span class="label_icon">분할상환</span>
<?php endif; ?>
</div>
</div>
<dl class="rate_detail">
<div class="rate">
<dt>최저</dt>
<dd><strong class="rate_text"><?= esc($d['min_rate'] ?? '-') ?>%</strong></dd>
</div>
<div class="rate">
<dt>최고</dt>
<dd><strong class="rate_text"><?= esc($d['max_rate'] ?? '-') ?>%</strong></dd>
</div>
<div class="rate">
<dt>평균</dt>
<dd><strong class="rate_text"><?= esc($d['avg_rate'] ?? '-') ?>%</strong></dd>
</div>
</dl>
</div>
<!-- 액션 버튼 -->
<div class="product-actions">
<button type="button" class="btn btn-sm btn-outline-secondary js-toggle"
data-target="#detail-<?= $d['seq'] ?>">
상세보기
</button>
<button type="button" class="btn btn-sm btn-outline-secondary js-toggle"
data-target="#pay-<?= $d['seq'] ?>">
월평균상환액
</button>
</div>
<!-- 상세 (접기/펼치기) -->
<div class="collapse-box" id="detail-<?= $d['seq'] ?>" hidden>
<div class="detail-grid">
<?= render_detail_section('대출부대비용', $d['extra_fee'] ?? null) ?>
<?= render_detail_section('연체이자율', $d['late_rate'] ?? null) ?>
<?= render_detail_section('가입방식', $d['join_method'] ?? null) ?>
<?= render_detail_section('중도상환수수료', $d['prepay_fee'] ?? null) ?>
<?= render_detail_section('대출한도', $d['loan_limit'] ?? null) ?>
<div class="detail-row">
<div class="detail-title">상품문의</div>
<ul class="detail-list">
<li>
<?= $d['bank'] ?> <?= $d['tel'] ?? '' ?>
</li>
<li><a href="https://m.map.naver.com/search2/search.nhn?query=<?= $d['bank'] ?>"
target="_blank">지점찾기</a>
</li>
</ul>
</div>
</div>
<?php if (!empty($d['prov_date'])): ?>
<div class="detail-foot">금융회사 최종 제공일
<?= esc($d['prov_date']) ?>.
</div>
<?php endif; ?>
</div>
<!-- 월평균상환액 -->
<div class="collapse-box" id="pay-<?= $d['seq'] ?>" hidden>
<?php
$basis = $d['pay_basis'] ?? '1억원 대출, 10년 분할 상환시';
?>
<div class="pay-box">
<div class="detail-row" style="margin-bottom: 15px;">
<ul class="detail-list">
<li>
<?= esc($basis) ?>
</li>
</ul>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th rowspan="2" style="width: 30%;">금리</th>
<th colspan="2">월평균 상환액</th>
</tr>
<tr>
<th style="width: 35%;">원리금 균등상환</th>
<th style="width: 35%;">원금 균등상환</th>
</tr>
</thead>
<tbody>
<tr>
<td class="rate-cell">
<span class="text_black">당월최저</span>
<p><strong class="text_red"><?= $d['min_rate'] ?>%</strong></p>
</td>
<td>
<strong><?= won(calcEqualPaymentMonthly(100000000, $d['min_rate'], 10)) ?></strong>원
</td>
<td><strong>
<?= won(calcEqualPrincipalAvgMonthly(100000000, $d['min_rate'], 10)) ?>
</strong>원
</td>
</tr>
<tr>
<td class="rate-cell">
<span class="text_black">당월최고</span>
<p><strong class="text_red"><?= $d['max_rate'] ?>%</strong></p>
</td>
<td>
<strong><?= won(calcEqualPaymentMonthly(100000000, $d['max_rate'], 10)) ?></strong>원
</td>
<td><strong>
<?= won(calcEqualPrincipalAvgMonthly(100000000, $d['max_rate'], 10)) ?>
</strong>원
</td>
</tr>
<?php if (!empty($d['avg_rate'])): ?>
<tr>
<td class="rate-cell">
<span class="text_black">전월평균</span>
<p><strong class="text_red"><?= $d['avg_rate'] ?>%</strong></p>
</td>
<td>
<strong><?= won(calcEqualPaymentMonthly(100000000, $d['avg_rate'], 10)) ?></strong>원
</td>
<td><strong>
<?= won(calcEqualPrincipalAvgMonthly(100000000, $d['avg_rate'], 10)) ?>
</strong>원
</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<div class="detail-foot">
<?php if (!empty($d['prov_date'])): ?>
<span>금융회사 최종 제공일
<?= esc($d['prov_date']) ?>
</span>
<?php endif; ?>
</div>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endforeach; ?>
</div>
<div class="owl-controls-bar">
<button type="button" class="owl-btn owl-prev" aria-label="이전"></button>
<div class="owl-counter" aria-live="polite">1 / 1</div>
<button type="button" class="owl-btn owl-next" aria-label="다음"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.theme.default.min.css">
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js"></script>
<script type="text/javascript">
const datas = <?= json_encode($data, JSON_UNESCAPED_UNICODE); ?>;
let owlInited = false;
const esc = (s) => String(s ?? '').replace(/[&<>"']/g, m => ({
'&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;'
}[m]));
$(function () {
$('.nav-link').on('click', function () {
const cd = $(this).data('cd');
var arr = new Array();
rebuildByCd(cd);
// switch (cd) {
// // 전체
// case "all":
// arr = datas;
// break;
// // 은행
// case "B":
// $.each(datas, function (idx, v) {
// if (v.bank_type == "B") {
// arr.push(v);
// }
// });
// break;
// // 저축은행
// case "SB":
// $.each(datas, function (idx, v) {
// if (v.bank_type == "SB") {
// arr.push(v);
// }
// });
// break;
// // 보험
// case "I":
// $.each(datas, function (idx, v) {
// if (v.bank_type == "I") {
// arr.push(v);
// }
// });
// break;
// }
// 다시 렌더링
});
const $owl = $('.product-carousel');
initOwlOnce();
// ✅ Owl 드래그가 버튼 클릭을 먹어버리는 문제 방지
$(document).on('mousedown touchstart pointerdown', '.product-carousel .js-toggle, .product-carousel a', function (e) {
e.stopPropagation();
});
// ✅ 클릭도 가끔 막히는 케이스 방지
$(document).on('click', '.product-carousel .js-toggle', function (e) {
e.preventDefault();
e.stopPropagation();
const sel = $(this).data('target');
const $target = $(sel);
if ($target.length) {
$target.prop('hidden', !$target.prop('hidden'));
// 내용 펼치면 높이 변하니까 autoHeight 갱신
setTimeout(() => $('.product-carousel').trigger('refresh.owl.carousel'), 0);
}
});
// Bootstrap 탭 전환 완료 후 폭 재계산
$(document).on('shown.bs.tab', 'a[data-bs-toggle="tab"]', function () {
const $owl = $('.product-carousel');
if ($owl.length) {
// 숨김->보임 전환 직후엔 약간 텀 주는 게 안정적
setTimeout(() => $owl.trigger('refresh.owl.carousel'), 0);
}
});
// ===== 외부 버튼 컨트롤 =====
$('.owl-controls-bar .owl-prev').on('click', function () {
$owl.trigger('prev.owl.carousel');
});
$('.owl-controls-bar .owl-next').on('click', function () {
$owl.trigger('next.owl.carousel');
});
});
function initOwlOnce() {
if (owlInited) return;
owlInited = true;
$('.product-carousel').owlCarousel({
items: 1,
loop: false,
margin: 16,
autoHeight: true,
smartSpeed: 250,
mouseDrag: false,
touchDrag: false,
pullDrag: false,
onInitialized: updateOwlUI,
onTranslated: updateOwlUI,
onResized: updateOwlUI
});
}
// ===== 카운터 + 버튼 활성/비활성 =====
function updateOwlUI(event) {
// event가 없는 경우(수동 호출) 대비
const e = event || $owl.data('owl.carousel');
const carousel = event ? event.relatedTarget : e;
if (!carousel) return;
const total = carousel.items().length; // 총 슬라이드 수(= 5개 묶음 페이지 수)
const current = carousel.relative(carousel.current()) + 1;
$('.owl-counter').text(`${current} / ${total}`);
// 버튼 disable 처리
const $prev = $('.owl-controls-bar .owl-prev');
const $next = $('.owl-controls-bar .owl-next');
$prev.toggleClass('is-disabled', current <= 1);
$next.toggleClass('is-disabled', current >= total);
}
function chunk(arr, size) {
const out = [];
for (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));
return out;
}
// ✅ 카드 HTML 생성 함수 (여기서 너의 카드 마크업을 그대로 문자열로 만들어야 함)
function renderCard(d) {
// 중요: XSS 방지 필요하면 escape 처리(최소한 텍스트는 escape)
const badges = `
${d.chg_yn === 'Y' ? `<span class="label_icon">변동금리</span>` : ``}
${d.split_yn === 'Y' ? `<span class="label_icon">분할상환</span>` : ``}
`;
// detail/pay 영역은 지금 너가 PHP 함수(render_detail_section, won...)를 쓰고 있어서
// 프론트에서 완전 동일하게 만들려면 "서버에서 HTML을 내려받는" 방식이 더 좋음.
// 일단은 카드 상단(요약)만 재렌더하고 상세는 필요 시 Ajax로 가져오는 패턴 추천.
return `
<li class="product-card">
<div class="product-head">
<div class="title-row">
<a href="${esc(d.bank_url || '#')}" class="bank_name" target="_blank" rel="noopener">${esc(d.bank)}</a>
<span class="product_name">${esc(d.product)}</span>
<div class="badges">${badges}</div>
</div>
<dl class="rate_detail">
<div class="rate"><dt>최저</dt><dd><strong class="rate_text">${esc(d.min_rate)}%</strong></dd></div>
<div class="rate"><dt>최고</dt><dd><strong class="rate_text">${esc(d.max_rate)}%</strong></dd></div>
<div class="rate"><dt>평균</dt><dd><strong class="rate_text">${esc(d.avg_rate)}%</strong></dd></div>
</dl>
</div>
<div class="product-actions">
<button type="button" class="btn btn-sm btn-outline-secondary js-toggle" data-target="#detail-${esc(d.seq)}">상세보기</button>
<button type="button" class="btn btn-sm btn-outline-secondary js-toggle" data-target="#pay-${esc(d.seq)}">월평균상환액</button>
</div>
<div class="collapse-box" id="detail-${esc(d.seq)}" hidden>
<div class="detail-grid">
${render_detail_section('대출부대비용', esc(d.extra_fee))}
${render_detail_section('연체이자율', esc(d.late_rate))}
${render_detail_section('가입방식', esc(d.join_method))}
${render_detail_section('중도상환수수료', esc(d.prepay_fee))}
${render_detail_section('대출한도', esc(d.loan_limit))}
<div class="detail-row">
<div class="detail-title">상품문의</div>
<ul class="detail-list">
<li>${esc(d.bank)}</li>
<li>
<a href="https://m.map.naver.com/search2/search.nhn?query=<?= $d['bank'] ?>" target="_blank">${esc(d.tel)}</a>
</li>
</ul>
</div>
</div>
<div class="detail-foot">
금융회사 최종 제공일 ${esc(d.prov_date)}
</div>
</div>
<div class="collapse-box" id="pay-${esc(d.seq)}" hidden>
${render_rates_section(d)}
</div>
</li>
`;
}
function renderSlides(list) {
const pages = chunk(list, 5);
if (!pages.length) {
return `<div class="item"><div class="text-center text-muted py-5">데이터가 없습니다.</div></div>`;
}
return pages.map(page => `
<div class="item">
<ul class="product_list">
${page.map(renderCard).join('')}
</ul>
</div>
`).join('');
}
function destroyOwl($owl) {
if ($owl.hasClass('owl-loaded')) {
$owl.trigger('destroy.owl.carousel');
// owl이 감싼 wrapper 제거
$owl.find('.owl-stage-outer').children().unwrap();
$owl.removeClass('owl-center owl-loaded owl-text-select-on');
$owl.find('.owl-stage').children().unwrap();
}
}
function rebuildByCd(cd) {
const filtered = (cd === 'all')
? datas
: datas.filter(x => String(x.bank_type) === String(cd));
const $owl = $('.product-carousel');
destroyOwl($owl);
$owl.html(renderSlides(filtered));
initOwl($owl);
}
function initOwl($owl) {
$owl.owlCarousel({
items: 1,
loop: false,
margin: 16,
autoHeight: true,
smartSpeed: 250,
mouseDrag: false,
touchDrag: false,
pullDrag: false,
onInitialized: updateOwlUI,
onTranslated: updateOwlUI,
onResized: updateOwlUI
});
}
function render_detail_section(title, value) {
const lines = normalize_lines(value);
if (!lines.length) return '';
str = `
<div class="detail-row">
<div class="detail-title">${title}</div>
<ul class="detail-list">`;
for (const line of lines) {
const text = Array.isArray(line) ? line.join(' ') : String(line ?? '').trim();
if (!text) continue;
str += `<li>${esc(text)}</li>`;
}
str += `
</ul>
</div>
`;
return str;
}
function render_rates_section(d) {
var basis = '1억원 대출, 10년 분할 상환시';
var str = `
<div class="pay-box">
<div class="detail-row" style="margin-bottom: 15px;">
<ul class="detail-list">
<li>
<?= esc($basis) ?>
</li>
</ul>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th rowspan="2" style="width: 30%;">금리</th>
<th colspan="2">월평균 상환액</th>
</tr>
<tr>
<th style="width: 35%;">원리금 균등상환</th>
<th style="width: 35%;">원금 균등상환</th>
</tr>
</thead>
<tbody>
<tr>
<td class="rate-cell">
<span class="text_black">당월최저</span>
<p><strong class="text_red">${esc(d.min_rate)}%</strong></p>
</td>
<td>
<strong>${won(calcEqualPaymentMonthly(100000000, d.min_rate, 10))}</strong>원
</td>
<td>
<strong>${won(calcEqualPaymentMonthly(100000000, d.min_rate, 10))}</strong>원
</td>
</tr>
<tr>
<td class="rate-cell">
<span class="text_black">당월최고</span>
<p><strong class="text_red">${esc(d.max_rate)}%</strong></p>
</td>
<td>
<strong>${won(calcEqualPaymentMonthly(100000000, d.max_rate, 10))}/strong>원
</td>
<td>
<strong>${won(calcEqualPrincipalAvgMonthly(100000000, d.max_rate, 10))}</strong>원
</td>
</tr>`;
if (d.avg_rate != null) {
str += `
<tr>
<td class="rate-cell">
<span class="text_black">전월평균</span>
<p><strong class="text_red">${esc(d.avg_rate)}%</strong></p>
</td>
<td>
<strong>${won(calcEqualPaymentMonthly(100000000, d.avg_rate, 10))} ?></strong>원
</td>
<td>
<strong>${won(calcEqualPrincipalAvgMonthly(100000000, d.avg_rate, 10))}</strong>원
</td>
</tr>
`;
}
str += `
</tbody>
</table>
<div class="detail-foot">
<span>금융회사 최종 제공일 ${esc(d.prov_date)}</span>
</div>
</div>
`;
return str;
}
function normalize_lines(v) {
if (v === null || v === undefined) return [];
// 이미 배열이면
if (Array.isArray(v)) {
return v.map(x => String(x).trim()).filter(x => x !== '');
}
let s = String(v).trim();
if (!s) return [];
// JSON 배열 문자열이면
if (s.startsWith('[')) {
try {
const decoded = JSON.parse(s);
if (Array.isArray(decoded)) {
return decoded.map(x => String(x).trim()).filter(x => x !== '');
}
} catch (e) { }
}
// 개행 기준 분리
return s
.split(/\r\n|\r|\n/)
.map(x => x.trim())
.filter(x => x !== '');
}
// 원리금균등상환
function calcEqualPaymentMonthly(principal, annualRate, years) {
const n = years * 12;
const r = (annualRate / 100.0) / 12.0;
if (n <= 0) return 0.0;
if (Math.abs(r) < 1e-12) return principal / n;
const pow = Math.pow(1.0 + r, n);
return (principal * r * pow) / (pow - 1.0);
}
// 원금균등상환
function calcEqualPrincipalAvgMonthly(principal, annualRate, years) {
const n = years * 12;
const r = (annualRate / 100.0) / 12.0;
if (n <= 0) return 0.0;
// 이자합(원금균등): P * r * (n + 1) / 2
const totalInterest = principal * r * (n + 1) / 2.0;
const totalPayment = principal + totalInterest;
return totalPayment / n;
}
function won(v) {
return Math.round(v).toLocaleString('ko-KR');
}
</script>
<?= $this->endSection() ?>

View File

@@ -41,6 +41,7 @@
<script defer src="/architectui/assets/scripts/chart_js.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/apex_charts.98288b227c064e6a107f.js"></script>
<script defer src="/architectui/assets/scripts/sparklines.98288b227c064e6a107f.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<link href="/architectui/assets/styles/vendors.98288b227c064e6a107f.css" rel="stylesheet">
@@ -80,6 +81,7 @@
<form class="" id="frm_login_info">
<div class="form-floating mb-4">
<input name="user_id" id="user_id" placeholder="아이디 입력" type="text"
value="<?= $user_id ?? '' ?>"
class="form-control form-control-lg border-0 shadow-sm"
style="border-radius: 16px; background: rgba(248, 250, 252, 0.8); height: 58px;">
<label for="user_id" class="text-muted">
@@ -100,13 +102,14 @@
<div class="d-flex justify-content-between align-items-center mb-4">
<div class="form-check">
<input name="check" id="exampleCheck" type="checkbox"
class="form-check-input" style="transform: scale(1.2);">
<label for="exampleCheck"
<input id="saveId" name="saveId" type="checkbox" class="form-check-input"
style="transform: scale(1.2);" value="Y" <?php if (!empty($user_id)) {
echo "checked";
} ?>>
<label for="saveId"
class="form-check-label text-muted fw-medium">아이디저장</label>
</div>
<a href="javascript:void(0);"
class="text-primary text-decoration-none fw-semibold">
<a onclick="faxOpen();" class="text-primary text-decoration-none fw-semibold">
팩스 수신 확인
</a>
</div>
@@ -132,12 +135,80 @@
</div>
</div>
</div>
<!-- 모달영역-->
<div class="modal fade" id="faxModal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<!-- Header -->
<div class="modal-header">
<h5 class="modal-title">팩스 수신 확인</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<!-- Body -->
<div class="modal-body">
<form id="frm_srch_info" onsubmit="return false;">
<!-- 검색 영역 -->
<div class="row g-2 align-items-end mb-3">
<div class="col-md-2">
<label class="form-label mb-1">발신 팩스 번호</label>
<input type="text" class="form-control form-control-sm" name="caller_no"
placeholder="번호 입력" />
</div>
<div class="col-md-4 text-start">
<button type="button" class="btn btn-sm btn-primary" id="btnSearch">
검색
</button>
</div>
</div>
<hr class="my-2">
<!-- 테이블 영역 -->
<div class="table-responsive">
<table id="tblFax" class="table table-sm table-bordered table-hover align-middle mb-0">
<caption class="caption-top small text-muted">FAX 수신 현황</caption>
<thead class="table-light">
<tr>
<th class="text-center">수신기간</th>
</tr>
</thead>
<tbody>
<!-- 데이터 -->
</tbody>
</table>
</div>
</form>
</div>
<!-- Footer -->
<div class="modal-footer py-2">
<button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">
닫기
</button>
</div>
</div>
</div>
</div>
<!-- 모달영역-->
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css" />
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script defer src="/architectui/assets/js/datatable.kor.js"></script>
<script type="text/javascript">
const tpl = document.querySelector('.my-loader-template');
var table;
$(function () {
$("#btnSearch").on("click", function () {
table.ajax.reload();
});
$("#frm_login_info").on("submit", function (e) {
e.preventDefault(); // 기본 submit 막기
@@ -191,10 +262,51 @@
}
})
})
});
});
function faxOpen() {
table = $('#tblFax').DataTable({
language: lang_kor,
serverSide: true,
processing: true,
ajax: {
url: '/listfax/listfax/getLists',
type: 'GET',
beforeSend: function () {
blockUI.blockPage({
message: tpl
})
},
complete: function () {
blockUI.unblockPage()
},
data: function (d) {
d.caller_no = $("#frm_srch_info [name=caller_no]").val();
d.start = d.start || 0
d.length = d.length || 10
},
},
"columnDefs": [
{ className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" },
],
columns: [
{ data: 'atcl_no' },
],
// 옵션들 예시
paging: true,
searching: false,
ordering: false,
});
$("#faxModal").modal("show");
}
</script>
</body>

View File

@@ -136,7 +136,9 @@
<h3 class="card-title mb-0">사용자 목록</h3>
<div class="ms-auto d-flex align-items-center gap-3">
<button class="mb-2 me-2 border-0 btn-transition btn btn-shadow btn-outline-success"
id="excel-download">엑셀다운로드</button>
id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
@@ -335,30 +337,9 @@
const row = table.row(this).data()
if (!row) return
const modalEl = document.getElementById('userModal');
const myModal = new bootstrap.Modal(modalEl);
$("#frm_user_info")[0].reset()
$("#frm_user_info [name=usr_sq]").val(row.usr_sq)
$("#frm_user_info [name=type]").val("update")
$("#frm_user_info [name=addUserNm]").val(row.usr_nm)
$("#frm_user_info [name=addUserDept]").val(row.dept_sq)
$("#frm_user_info [name=addUserId]").val(row.usr_id)
$("#frm_user_info [name=addUserId]").prop("readonly", true)
$("#frm_user_info [name=addUserLevel]").val(row.usr_level)
$("#frm_user_info [name=addUserPosition]").val(row.usr_position)
$("#frm_user_info [name=addUserTel1]").val(row.usr_tel1)
$("#frm_user_info [name=addUserTel2]").val(row.usr_tel2)
$("#frm_user_info [name=addSmsYn]").val(row.sms_auth_yn)
$("#frm_user_info [name=addUserAddr1]").val(row.usr_addr1)
$("#frm_user_info [name=addUserAddr2]").val(row.usr_addr2)
$("#frm_user_info [name=addUseYn]").val(row.use_yn)
myModal.show();
location.href = '/article/receipt/lists?usr_id=' + row.usr_id;
});
// [검색] 버튼 눌렀을 때 다시 조회

View File

@@ -112,7 +112,9 @@
<h3 class="card-title mb-0">요약 실적</h3>
<div class="ms-auto d-flex align-items-center gap-3">
<button class="mb-2 me-2 border-0 btn-transition btn btn-shadow btn-outline-success"
id="excel-download">엑셀다운로드</button>
id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>엑셀다운로드
</button>
</div>
</div>
<div class="card-body">
@@ -142,13 +144,14 @@
$nRow = 1;
foreach ($st_list as $row) {
// if ($row['depth'] == '1') {
// $rowPars = array_merge($pars, array('bonbu' => $row['dept_sq']));
// } else {
// $rowPars = array_merge($pars, array('bonbu' => $row['pdept_sq'], 'dept_sq' => $row['dept_sq']));
// }
echo '<tr onmouseover="this.className=\'highlight\'" onmouseout="this.className=\'normal\'" style="cursor:pointer">';
$pars = [];
if ($row['depth'] == '1') {
$rowPars = array_merge($pars, array('bonbu' => $row['dept_sq']));
} else {
$rowPars = array_merge($pars, array('bonbu' => $row['pdept_sq'], 'dept_sq' => $row['dept_sq']));
}
echo '<tr onmouseover="this.className=\'highlight\'" onmouseout="this.className=\'normal\'" style="cursor:pointer" onclick="tr_onclick(\'' . make_query_string($rowPars) . '\');">';
echo '<td>' . $nRow . '</td>';
echo '<td style="text-align:left">' . str_replace(' ', '&nbsp;', $row['dept_nm']) . '</td>';
echo '<td>' . $row['region_cnt'] . '</td>';
@@ -230,7 +233,7 @@
});
function tr_onclick(pars) {
location.href = '/article/receipt/lists' + pars + '&m=M201';
location.href = '/article/receipt/lists' + pars;
}
// 엑셀 다운로드

View File

@@ -83,7 +83,9 @@
<h3 class="card-title mb-0">사용자 목록</h3>
<div class="ms-auto d-flex align-items-center gap-3">
<button class="mb-2 me-2 border-0 btn-transition btn btn-shadow btn-outline-success"
id="excel-download">엑셀다운로드</button>
id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>엑셀다운로드
</button>
</div>
</div>
<div class="card-body">

View File

@@ -83,7 +83,9 @@
<h3 class="card-title mb-0">상담원 목록</h3>
<div class="ms-auto d-flex align-items-center gap-3">
<button class="mb-2 me-2 border-0 btn-transition btn btn-shadow btn-outline-success"
id="excel-download">엑셀다운로드</button>
id="excel-download">
<i class="fa fa-fw" aria-hidden="true" title="file-excel-o"></i>엑셀다운로드
</button>
</div>
</div>
<div class="card-body">

Some files were not shown because too many files have changed in this diff Show More