Compare commits
243 Commits
de9b295e1c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f8c26acea8 | |||
| b0ec75ae56 | |||
| a87fed538b | |||
| cbf7e85cf8 | |||
| 6a72ccebd5 | |||
| cba387de9d | |||
| 930e690126 | |||
| 0ef2ba77c6 | |||
| c22b023310 | |||
| 0b6ed3df73 | |||
| a170fdc774 | |||
| e5a80aff33 | |||
| 7139e0c095 | |||
| 129e2b4e69 | |||
| fd187bb84a | |||
| 3fbc57bedc | |||
| 81b85ae25d | |||
| e2f49ba77e | |||
| 728b394063 | |||
| 1f445512f7 | |||
| b553310dc1 | |||
| bb07396abf | |||
| 80cb9451d2 | |||
| 9138fa9c16 | |||
| a6ae1bd377 | |||
| 6bb9dceec9 | |||
| 32efe755e6 | |||
| 141f526f91 | |||
| 9650707caf | |||
| 13dfb3e112 | |||
| 9d9df394c5 | |||
| 353df045d8 | |||
| f02f8c0457 | |||
| 243ca0c45e | |||
| e54b5bbbb8 | |||
| 69e6aa5fe6 | |||
| af7846ea7c | |||
| b237c4b934 | |||
| d91738c667 | |||
| c129362724 | |||
| 49d33b55b8 | |||
| c3b4e0e712 | |||
| f988ecabd2 | |||
| 99a072f732 | |||
| b0e7cf0df0 | |||
| ed80e90bb3 | |||
| c17110087c | |||
| 3cd6b238d2 | |||
| 906f208734 | |||
| 54e8c50a11 | |||
| 5504ca154a | |||
| d666315497 | |||
| 424b0e9411 | |||
| 85fdb38281 | |||
| 4f78d5493c | |||
| 56a7fe94d5 | |||
| 23286f6890 | |||
| 38ea1c1129 | |||
| c6da9c12be | |||
|
|
6d87a209e0 | ||
| f6857ae959 | |||
|
|
a7dca8c5fa | ||
| 98d74658e9 | |||
|
|
9a27018922 | ||
| 922c85962c | |||
|
|
8b621a065e | ||
| 53695a1dc3 | |||
|
|
d92bbfef1a | ||
|
|
4a8178b185 | ||
| b9b3f43956 | |||
|
|
790216404c | ||
| fc4ce793e3 | |||
|
|
36355f75f3 | ||
| ae5677a635 | |||
| 1311dc529a | |||
| 54f0a2a4d2 | |||
| 9f20f4347a | |||
| f9b6336eab | |||
| 6bed688be0 | |||
| fef656243c | |||
| c93a2035dd | |||
| db70b28eb9 | |||
| 918e27da67 | |||
| f7bda06ddf | |||
| 2781638f58 | |||
| c21a137dbb | |||
|
|
8b77448128 | ||
| 9a2d0af8d0 | |||
| 7143a6bd28 | |||
| a11d686b2a | |||
| acbf430ae7 | |||
| c33fb47508 | |||
|
|
e342d7f916 | ||
| 3bb6741e44 | |||
|
|
c7856394c0 | ||
| ecf1be8ab7 | |||
|
|
99ea553d9a | ||
| adcd5aca7d | |||
|
|
2c96bd12de | ||
| 8bb7700a00 | |||
| cbcd66d5c7 | |||
|
|
107cc395d6 | ||
| 0493cd7708 | |||
|
|
f358b44e16 | ||
| 44035795d2 | |||
|
|
04c28d79f2 | ||
| 0605948ab5 | |||
|
|
d134b27614 | ||
| 19bf534086 | |||
|
|
b51f2fddcf | ||
| 2f5b1a7da6 | |||
| 20e6398005 | |||
| 1de224627e | |||
| 9b9e752bd1 | |||
| 1cb1e6837b | |||
| b5e06188b1 | |||
| c375d84874 | |||
| 1d6dc49971 | |||
| dbe85efcef | |||
| 253a5de579 | |||
| 52213c3ad4 | |||
| 87dd69d703 | |||
| e394acd7cc | |||
| 7c48d1134f | |||
| 0d1c6855e5 | |||
| 43d45332ef | |||
| 55e1cdf82a | |||
| 3dc24d011a | |||
| 5ae247fe91 | |||
| 9a3a8ed4e3 | |||
| 1993013193 | |||
| 9f511b4dba | |||
| 522b89fb9f | |||
|
|
2030ca0836 | ||
| cac86ffc7a | |||
|
|
26db8eb602 | ||
| 112923c459 | |||
|
|
929d885b2b | ||
| 1761e31587 | |||
|
|
bfdd56ba48 | ||
| 0114faae2b | |||
|
|
6e28c750dd | ||
| f17dc88f99 | |||
|
|
abf369dcd6 | ||
| 32b869f05b | |||
|
|
64b9491157 | ||
| 69bcf05457 | |||
|
|
dce23d36cc | ||
| b9a77a1d00 | |||
|
|
87b8093f92 | ||
| 0feff4ff12 | |||
| 0ec02ef2e2 | |||
| 37efde8686 | |||
|
|
9116b27d80 | ||
| cdfd4620db | |||
|
|
8e779124dd | ||
| c971d8631f | |||
|
|
0a077b49c4 | ||
| d37aa9d51f | |||
|
|
957e062833 | ||
| 25e7bf6ac3 | |||
|
|
d480fb1dfa | ||
| 7275d36822 | |||
|
|
ab3560487a | ||
| ec5123f74e | |||
| c3b588c03d | |||
| f154f494a6 | |||
| 6c97b88977 | |||
| 873061a254 | |||
| f1020d533d | |||
| ccaf400187 | |||
|
|
8bea5766a3 | ||
| d731061ac9 | |||
| 6be418b06c | |||
| bf294eba43 | |||
|
|
ed39194225 | ||
| 4455ecc2d2 | |||
|
|
28b458450c | ||
| bb2d3e9224 | |||
|
|
69671e2066 | ||
| 0730a01ae8 | |||
|
|
5fef995ece | ||
| 364d28f7c1 | |||
|
|
e861298594 | ||
| 652734eb42 | |||
|
|
5079e2e212 | ||
| 24a43a5e51 | |||
|
|
2e0130a6dc | ||
| 8d9bf6b72c | |||
|
|
b164c5b409 | ||
|
|
7a889170b6 | ||
| 2c8fe4674d | |||
|
|
1cee60147c | ||
| 69f4ec235e | |||
|
|
46f72e131a | ||
| ea1f81e803 | |||
|
|
55fbf641db | ||
| 7878ba4f8e | |||
|
|
01a65ee68c | ||
| 59996cf930 | |||
|
|
b5fad6e358 | ||
| a1c36ecffb | |||
|
|
36b06a66d2 | ||
| 438f0a546c | |||
|
|
761607beae | ||
| 1e5e44e10b | |||
|
|
81a9697352 | ||
| c129a277b0 | |||
|
|
285a79aefc | ||
| c49a7e0a32 | |||
|
|
1c44058286 | ||
| b971005525 | |||
| da33e34d4f | |||
| 8338df57c9 | |||
| 094fa7c640 | |||
|
|
7627951c09 | ||
|
|
cfd2ee2787 | ||
| 546d23f077 | |||
| 249efb0a29 | |||
| dbeb0d6b1f | |||
| 4cfd6f1faf | |||
| e085eccaab | |||
| b42755bc27 | |||
| 22fa8b32a1 | |||
| 318f2c063e | |||
| e377dee571 | |||
| bbe47ad097 | |||
| ac75b7ebf5 | |||
| b03f783051 | |||
| 24b0548002 | |||
| 946bc15aa6 | |||
| 76e79ea4cf | |||
| 454bb77a07 | |||
| 8864a46c8a | |||
| 1d693df861 | |||
| 6576b59d7e | |||
| c30b30bb07 | |||
| 0e9915bd7a | |||
| 11840905f1 | |||
| 98c36e13f6 | |||
| e4c7b633ce | |||
| a8b66af2fa | |||
| dbc9d875c3 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -171,3 +171,8 @@ _modules/*
|
||||
/dist/
|
||||
/node_modules/
|
||||
.env
|
||||
**/logs/
|
||||
|
||||
|
||||
# 6. 기타 개인 설정 파일 (선택적)
|
||||
.github/copilot-instructions.mdworker/fallback_queue/*.json
|
||||
|
||||
267
REFACTORING_REPORT.md
Normal file
267
REFACTORING_REPORT.md
Normal 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% 유지**
|
||||
|
||||
이제 프로젝트는 **더 깔끔하고, 테스트 가능하고, 확장 가능한 구조**를 가지게 되었습니다! 🚀
|
||||
360
SESSION_README.md
Normal file
360
SESSION_README.md
Normal file
@@ -0,0 +1,360 @@
|
||||
# Session 관리 가이드
|
||||
|
||||
## 개요
|
||||
|
||||
본 애플리케이션은 **Redis**를 기본 세션 저장소로 사용하며, Redis 장애 시 **Database(MariaDB)**로 자동 폴백하는 이중화 구조를 가지고 있습니다.
|
||||
|
||||
## 아키텍처
|
||||
|
||||
### 세션 저장소
|
||||
|
||||
| 우선순위 | 핸들러 | 설명 | 성능 |
|
||||
|---------|-------|------|------|
|
||||
| 1순위 | **RedisHandler** | 메모리 기반 고속 세션 | ~0.03초 |
|
||||
| 2순위 | **DatabaseHandler** | DB 기반 안정적 세션 | ~0.05초 (수동 전환 시) |
|
||||
|
||||
### 구성 요소
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 사용자 로그인 요청 │
|
||||
└──────────────┬──────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Session.php 생성자 │
|
||||
│ - Redis 연결 테스트 │
|
||||
│ - SESSION_FORCE_DATABASE 확인 │
|
||||
└──────────────┬──────────────────────────┘
|
||||
│
|
||||
┌──────┴──────┐
|
||||
│ │
|
||||
Redis 정상? Redis 장애?
|
||||
│ │
|
||||
▼ ▼
|
||||
RedisHandler DatabaseHandler
|
||||
(ci_sessions (ci_sessions
|
||||
테이블) 테이블)
|
||||
│ │
|
||||
└──────┬──────┘
|
||||
▼
|
||||
세션 데이터 저장/조회
|
||||
```
|
||||
|
||||
## 설정 파일
|
||||
|
||||
### 1. Session.php (`src/app/Config/Session.php`)
|
||||
|
||||
```php
|
||||
public string $driver = RedisHandler::class;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
// 환경변수로 강제 Database 모드 설정 가능
|
||||
$forceDatabase = env('SESSION_FORCE_DATABASE', false);
|
||||
|
||||
if ($this->driver === RedisHandler::class && !$forceDatabase) {
|
||||
try {
|
||||
// Redis 연결 테스트 (타임아웃: 0.5초)
|
||||
$testRedis = get_redis_connection('session');
|
||||
|
||||
if (!$testRedis) {
|
||||
throw new \Exception('Redis connection failed');
|
||||
}
|
||||
|
||||
// Redis 정상 - Redis 사용
|
||||
$this->savePath = 'tcp://192.168.10.243:6379?database=0';
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Redis 실패 - DatabaseHandler로 폴백
|
||||
$this->driver = DatabaseHandler::class;
|
||||
$this->savePath = 'ci_sessions';
|
||||
}
|
||||
} else {
|
||||
// Database 모드
|
||||
$this->savePath = 'ci_sessions';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 환경 설정 (`.env`)
|
||||
|
||||
```bash
|
||||
# Redis 세션 설정
|
||||
SESSION_REDIS_HOST = 192.168.10.243
|
||||
SESSION_REDIS_PORT = 6379
|
||||
SESSION_REDIS_DATABASE = 0
|
||||
#SESSION_REDIS_PASSWORD =
|
||||
|
||||
# 세션 강제 Database 모드 (Redis 장애 시 true로 변경)
|
||||
SESSION_FORCE_DATABASE = false
|
||||
```
|
||||
|
||||
### 3. Redis Helper (`src/app/Helpers/redis_helper.php`)
|
||||
|
||||
```php
|
||||
function get_redis_connection(string $type = 'worker')
|
||||
{
|
||||
$redis = new \Redis();
|
||||
|
||||
// 타임아웃 0.5초로 빠른 실패 감지
|
||||
$timeout = 0.5;
|
||||
$success = $redis->connect($host, $port, $timeout);
|
||||
|
||||
return $success ? $redis : false;
|
||||
}
|
||||
```
|
||||
|
||||
## 데이터베이스 테이블
|
||||
|
||||
### ci_sessions 테이블 구조
|
||||
|
||||
```sql
|
||||
CREATE TABLE `ci_sessions` (
|
||||
`session_id` VARCHAR(40) NOT NULL DEFAULT '0',
|
||||
`ip_address` VARCHAR(16) NOT NULL DEFAULT '0',
|
||||
`user_agent` VARCHAR(120) NOT NULL,
|
||||
`last_activity` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`user_data` VARCHAR(4000) NOT NULL,
|
||||
PRIMARY KEY (`session_id`)
|
||||
) ENGINE = MEMORY;
|
||||
|
||||
CREATE INDEX `last_activity_idx`
|
||||
ON `ci_sessions` (`last_activity` ASC);
|
||||
```
|
||||
|
||||
**주요 특징:**
|
||||
- **ENGINE = MEMORY**: 메모리 기반 테이블로 매우 빠른 읽기/쓰기 성능
|
||||
- **장점**: Redis와 비슷한 속도 (디스크 I/O 없음)
|
||||
- **단점**: 서버 재시작 시 세션 데이터 소실 (일반적으로 문제없음 - 세션은 휘발성 데이터)
|
||||
- **용량**: VARCHAR(4000)으로 충분한 세션 데이터 저장 가능
|
||||
|
||||
## 운영 가이드
|
||||
|
||||
### 1. Redis 장애 발생 시
|
||||
|
||||
#### 자동 폴백 (기본 동작)
|
||||
- Redis 연결 실패 시 자동으로 DatabaseHandler로 전환
|
||||
- **단점**: 매 요청마다 Redis 연결 시도 → 타임아웃 대기 (약 0.5초 추가)
|
||||
- 사용자는 약간 느린 응답 시간을 경험
|
||||
|
||||
#### 수동 전환 (권장)
|
||||
Redis 장애 감지 즉시 다음 조치:
|
||||
|
||||
```bash
|
||||
# 1. .env 파일 수정
|
||||
vi /path/to/src/.env
|
||||
|
||||
# SESSION_FORCE_DATABASE를 true로 변경
|
||||
SESSION_FORCE_DATABASE = true
|
||||
|
||||
# 2. PHP-FPM 재시작 (선택사항, 다음 요청부터 자동 적용)
|
||||
docker exec projects-admin_confirms kill -USR2 1
|
||||
```
|
||||
|
||||
**장점**: Redis 연결 시도 없이 즉시 Database 사용 → 빠른 응답 (0.05초)
|
||||
|
||||
### 2. Redis 복구 후
|
||||
|
||||
```bash
|
||||
# 1. .env 파일 원복
|
||||
SESSION_FORCE_DATABASE = false
|
||||
|
||||
# 2. PHP-FPM 재시작
|
||||
docker exec projects-admin_confirms kill -USR2 1
|
||||
```
|
||||
|
||||
### 3. 모니터링
|
||||
|
||||
#### 로그 확인
|
||||
```bash
|
||||
# 세션 관련 로그 확인
|
||||
docker exec projects-admin_confirms tail -f /var/www/html/writable/logs/log-$(date +%Y-%m-%d).log | grep -i session
|
||||
|
||||
# Redis 폴백 경고 확인
|
||||
docker exec projects-admin_confirms grep "Redis unavailable" /var/www/html/writable/logs/log-$(date +%Y-%m-%d).log
|
||||
```
|
||||
|
||||
#### 예상 로그 메시지
|
||||
|
||||
**Redis 정상:**
|
||||
```
|
||||
DEBUG - Session: Class initialized using 'CodeIgniter\Session\Handlers\RedisHandler' driver.
|
||||
```
|
||||
|
||||
**Redis 장애 (자동 폴백):**
|
||||
```
|
||||
WARNING - Session: Redis unavailable (Redis connection failed), falling back to DatabaseHandler
|
||||
DEBUG - Session: Class initialized using 'CodeIgniter\Session\Handlers\DatabaseHandler' driver.
|
||||
```
|
||||
|
||||
**Database 강제 모드:**
|
||||
```
|
||||
INFO - Session: Forced to use DatabaseHandler (SESSION_FORCE_DATABASE=true)
|
||||
DEBUG - Session: Class initialized using 'CodeIgniter\Session\Handlers\DatabaseHandler' driver.
|
||||
```
|
||||
|
||||
### 4. 성능 모니터링
|
||||
|
||||
```bash
|
||||
# 로그인 응답 시간 측정
|
||||
for i in {1..5}; do
|
||||
curl -X POST http://localtest2-admin.confirms.co.kr/login/chkLogin \
|
||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||
-d "user_id=test&user_pw=test" \
|
||||
-o /dev/null -s -w " Time: %{time_total}s\n"
|
||||
done
|
||||
```
|
||||
|
||||
**기대 성능:**
|
||||
- Redis 정상: 0.03 ~ 0.05초
|
||||
- Database (수동 전환): 0.05 ~ 0.08초
|
||||
- 자동 폴백 (Redis 다운): 0.5 ~ 1.0초
|
||||
|
||||
## 사용자 알림
|
||||
|
||||
### 프론트엔드 경고 표시
|
||||
|
||||
Redis 장애 시 로그인 페이지에 자동으로 경고 배너가 표시됩니다:
|
||||
|
||||
```javascript
|
||||
// login.php의 JavaScript
|
||||
function checkSystemStatus(responseData) {
|
||||
if (responseData.system && responseData.system.redis_fallback) {
|
||||
// 경고 메시지: "세션 서버(Redis) 장애로 임시 모드로 운영 중입니다."
|
||||
showRedisWarning(responseData.system.warning_message);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**API 응답 예시:**
|
||||
```json
|
||||
{
|
||||
"code": "0",
|
||||
"msg": "success",
|
||||
"system": {
|
||||
"redis_fallback": true,
|
||||
"warning_message": "세션 서버(Redis) 장애로 임시 모드로 운영 중입니다. 시스템 관리자에게 문의하세요."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 트러블슈팅
|
||||
|
||||
### 문제: 로그인이 느림 (2~3초)
|
||||
|
||||
**원인**: Redis 다운 상태에서 자동 폴백 모드 사용 중
|
||||
|
||||
**해결**:
|
||||
```bash
|
||||
# SESSION_FORCE_DATABASE=true로 수동 전환
|
||||
echo "SESSION_FORCE_DATABASE = true" >> /path/to/src/.env
|
||||
```
|
||||
|
||||
### 문제: 세션이 유지되지 않음
|
||||
|
||||
**원인**: ci_sessions 테이블이 없거나 권한 문제
|
||||
|
||||
**해결**:
|
||||
```sql
|
||||
-- 테이블 존재 확인
|
||||
SHOW TABLES LIKE 'ci_sessions';
|
||||
|
||||
-- 권한 확인
|
||||
SHOW GRANTS FOR 'confirms'@'%';
|
||||
|
||||
-- 테이블이 없는 경우 생성
|
||||
CREATE TABLE `ci_sessions` (
|
||||
`session_id` VARCHAR(40) NOT NULL DEFAULT '0',
|
||||
`ip_address` VARCHAR(16) NOT NULL DEFAULT '0',
|
||||
`user_agent` VARCHAR(120) NOT NULL,
|
||||
`last_activity` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`user_data` VARCHAR(4000) NOT NULL,
|
||||
PRIMARY KEY (`session_id`)
|
||||
) ENGINE = MEMORY;
|
||||
|
||||
CREATE INDEX `last_activity_idx`
|
||||
ON `ci_sessions` (`last_activity` ASC);
|
||||
```
|
||||
|
||||
### 문제: 서버 재시작 후 모든 세션이 사라짐
|
||||
|
||||
**원인**: ci_sessions가 MEMORY 엔진을 사용 (정상 동작)
|
||||
|
||||
**설명**:
|
||||
- MEMORY 엔진은 서버 재시작 시 데이터가 삭제됩니다
|
||||
- 세션은 일시적 데이터이므로 일반적으로 문제가 되지 않습니다
|
||||
- 사용자는 재로그인하면 됩니다
|
||||
|
||||
**영구 저장이 필요한 경우**:
|
||||
```sql
|
||||
-- InnoDB로 변경 (성능은 약간 느려짐)
|
||||
ALTER TABLE ci_sessions ENGINE=InnoDB;
|
||||
```
|
||||
|
||||
### 문제: Redis 연결 타임아웃이 너무 김
|
||||
|
||||
**원인**: redis_helper.php의 타임아웃 설정
|
||||
|
||||
**해결**:
|
||||
```php
|
||||
// src/app/Helpers/redis_helper.php
|
||||
$timeout = 0.5; // 0.1 ~ 1.0 사이 값으로 조정
|
||||
$redis->connect($host, $port, $timeout);
|
||||
```
|
||||
|
||||
## 관련 파일
|
||||
|
||||
| 파일 | 역할 |
|
||||
|------|------|
|
||||
| `src/app/Config/Session.php` | 세션 설정 및 폴백 로직 |
|
||||
| `src/app/Helpers/redis_helper.php` | Redis 연결 헬퍼 함수 |
|
||||
| `src/app/Controllers/Login.php` | 로그인 및 시스템 상태 체크 |
|
||||
| `src/app/Views/pages/login.php` | 프론트엔드 경고 표시 |
|
||||
| `src/.env` | 환경 설정 (Redis 연결 정보, 강제 모드) |
|
||||
|
||||
## Worker 및 API (참고)
|
||||
|
||||
### Worker (NaverWorker.php)
|
||||
- Redis 큐 사용 (DB 9)
|
||||
- Redis 장애 시 파일 기반 폴백 (`worker/fallback_queue/*.json`)
|
||||
|
||||
### API (api_receiver.php, KisoController.php)
|
||||
- Redis 큐 사용 (DB 9)
|
||||
- Redis 장애 시 파일 기반 폴백 (`worker/fallback_queue/*.json`)
|
||||
|
||||
## 추가 개선 사항
|
||||
|
||||
### 고려 중인 기능
|
||||
|
||||
1. **Redis Sentinel 도입** (고가용성)
|
||||
- 자동 장애 조치
|
||||
- 마스터/슬레이브 구조
|
||||
|
||||
2. **APM 연동**
|
||||
- New Relic, DataDog 등
|
||||
- 실시간 성능 모니터링
|
||||
|
||||
3. **헬스체크 엔드포인트**
|
||||
```php
|
||||
// GET /health/session
|
||||
{
|
||||
"status": "ok",
|
||||
"driver": "RedisHandler",
|
||||
"redis_available": true,
|
||||
"response_time_ms": 12
|
||||
}
|
||||
```
|
||||
|
||||
## 문의
|
||||
|
||||
세션 관련 문제 발생 시:
|
||||
1. 로그 확인 (`/writable/logs/`)
|
||||
2. Redis 서버 상태 확인
|
||||
3. ci_sessions 테이블 상태 확인
|
||||
4. 필요 시 수동 전환 수행
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-03-25
|
||||
**Version**: 1.0.0
|
||||
209
app/Commands/NaverRetry.php
Normal file
209
app/Commands/NaverRetry.php
Normal file
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
namespace App\Commands;
|
||||
|
||||
use CodeIgniter\CLI\BaseCommand;
|
||||
use CodeIgniter\CLI\CLI;
|
||||
use App\Models\Entities\NaverWorkerLogModel;
|
||||
|
||||
class NaverRetry extends BaseCommand
|
||||
{
|
||||
protected $group = 'Workers';
|
||||
protected $name = 'naver:retry';
|
||||
protected $description = '실패한 Naver Worker 작업을 재처리합니다.';
|
||||
|
||||
protected $usage = 'naver:retry [log_id] [options]';
|
||||
protected $arguments = [
|
||||
'log_id' => '재처리할 특정 로그 ID (선택사항, 없으면 모든 실패 건 재처리)'
|
||||
];
|
||||
protected $options = [
|
||||
'--limit' => '재처리할 최대 개수 (기본: 10)',
|
||||
'--dry-run' => '실제 실행 없이 목록만 확인',
|
||||
'--force' => '재시도 횟수 제한 무시 (3회 이상 실패한 건도 재처리)'
|
||||
];
|
||||
|
||||
public function run(array $params)
|
||||
{
|
||||
helper(['log']);
|
||||
|
||||
$logId = $params[0] ?? null;
|
||||
$limit = CLI::getOption('limit') ?? 10;
|
||||
$isDryRun = CLI::getOption('dry-run') !== null;
|
||||
$isForce = CLI::getOption('force') !== null;
|
||||
|
||||
$logModel = model(NaverWorkerLogModel::class);
|
||||
$naverService = new \App\Services\NaverService();
|
||||
|
||||
// 1. 특정 ID 재처리
|
||||
if ($logId) {
|
||||
$this->retryOne($logModel, $naverService, $logId, $isDryRun, $isForce);
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 실패한 모든 작업 재처리
|
||||
$this->retryFailed($logModel, $naverService, $limit, $isDryRun, $isForce);
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 로그 ID 재처리
|
||||
*/
|
||||
protected function retryOne($logModel, $naverService, $logId, $isDryRun, $isForce)
|
||||
{
|
||||
$log = $logModel->find($logId);
|
||||
|
||||
if (!$log) {
|
||||
CLI::error("❌ Log ID {$logId} not found");
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write(CLI::color("📋 Log ID: {$logId}", 'cyan'));
|
||||
CLI::write(" Status: {$log['status']}");
|
||||
CLI::write(" Retry Count: " . ($log['retry_cnt'] ?? 0));
|
||||
CLI::write(" Error: {$log['error_msg']}");
|
||||
CLI::write(" Created: {$log['created_at']}");
|
||||
|
||||
// 재시도 횟수 체크
|
||||
if (!$isForce && ($log['retry_cnt'] ?? 0) >= 3) {
|
||||
CLI::write(CLI::color('⚠️ 이미 3회 이상 재시도했습니다. --force 옵션으로 강제 실행 가능', 'yellow'));
|
||||
return;
|
||||
}
|
||||
|
||||
// 재시도 불가능한 오류 체크
|
||||
if (!$isForce && $this->isNonRetryableError($log['error_msg'])) {
|
||||
CLI::write(CLI::color('⚠️ 재시도 불가능한 오류입니다. 데이터를 먼저 수정해주세요.', 'yellow'));
|
||||
CLI::write(CLI::color(' (--force 옵션으로 강제 실행 가능)', 'yellow'));
|
||||
return;
|
||||
}
|
||||
|
||||
if ($isDryRun) {
|
||||
CLI::write(CLI::color('🔍 DRY RUN - 재처리하지 않음', 'yellow'));
|
||||
return;
|
||||
}
|
||||
|
||||
$this->processLog($logModel, $naverService, $log);
|
||||
}
|
||||
|
||||
/**
|
||||
* 재시도 불가능한 오류인지 확인
|
||||
*/
|
||||
protected function isNonRetryableError($errorMsg)
|
||||
{
|
||||
if (!$errorMsg) return false;
|
||||
|
||||
// 데이터 수정이 필요한 오류 패턴
|
||||
$nonRetryablePatterns = [
|
||||
'foreign key constraint',
|
||||
'Duplicate entry',
|
||||
'빈 페이로드',
|
||||
'usr_sq.*users 테이블에 없음', // 이미 폴백 적용된 건은 재시도 가능
|
||||
];
|
||||
|
||||
foreach ($nonRetryablePatterns as $pattern) {
|
||||
if (stripos($errorMsg, $pattern) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 실패한 모든 작업 재처리
|
||||
*/
|
||||
protected function retryFailed($logModel, $naverService, $limit, $isDryRun, $isForce)
|
||||
{
|
||||
$query = $logModel->where('status', 'FAIL');
|
||||
|
||||
// force가 아닌 경우 재시도 횟수 3회 미만만 조회
|
||||
if (!$isForce) {
|
||||
$query->groupStart()
|
||||
->where('retry_cnt IS NULL')
|
||||
->orWhere('retry_cnt <', 3)
|
||||
->groupEnd();
|
||||
}
|
||||
|
||||
$failedLogs = $query->orderBy('created_at', 'ASC')->findAll($limit);
|
||||
|
||||
if (empty($failedLogs)) {
|
||||
CLI::write(CLI::color('✅ 재처리할 실패 작업이 없습니다.', 'green'));
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write(CLI::color("📋 실패한 작업 {count}건 발견", 'cyan')
|
||||
->replace('{count}', count($failedLogs)));
|
||||
|
||||
if ($isDryRun) {
|
||||
foreach ($failedLogs as $log) {
|
||||
CLI::write(" - ID: {$log['seq']} | Atcl: {$log['atcl_no']} | Error: {$log['error_msg']}");
|
||||
}
|
||||
CLI::write(CLI::color('🔍 DRY RUN - 재처리하지 않음', 'yellow'));
|
||||
return;
|
||||
}
|
||||
|
||||
// 실제 재처리
|
||||
$successCount = 0;
|
||||
$failCount = 0;
|
||||
|
||||
foreach ($failedLogs as $log) {
|
||||
CLI::write(CLI::color("\n🔄 Retrying Log ID: {$log['seq']}", 'yellow'));
|
||||
|
||||
$result = $this->processLog($logModel, $naverService, $log);
|
||||
|
||||
if ($result) {
|
||||
$successCount++;
|
||||
} else {
|
||||
$failCount++;
|
||||
}
|
||||
|
||||
// 과부하 방지
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
CLI::write(CLI::color("\n✅ 재처리 완료: 성공 {$successCount}건, 실패 {$failCount}건", 'green'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 데이터 재처리
|
||||
*/
|
||||
protected function processLog($logModel, $naverService, $log)
|
||||
{
|
||||
try {
|
||||
// 상태를 RETRY로 변경
|
||||
$logModel->update($log['seq'], ['status' => 'RETRY']);
|
||||
|
||||
// JSON 파싱
|
||||
$responseJson = json_decode($log['raw_payload'], true);
|
||||
$payload = $responseJson['request_data'] ?? [];
|
||||
|
||||
if (empty($payload)) {
|
||||
throw new \Exception("빈 페이로드 데이터");
|
||||
}
|
||||
|
||||
CLI::write(" Article: {$payload['articleNumber']}");
|
||||
|
||||
// 재처리
|
||||
$insertId = $naverService->processArticle($payload);
|
||||
|
||||
// 성공 시 로그 업데이트
|
||||
$logModel->update($log['seq'], [
|
||||
'atcl_no' => $payload['articleNumber'] ?? null,
|
||||
'status' => 'SUCCESS',
|
||||
'target_db_id' => $insertId,
|
||||
'error_msg' => null
|
||||
]);
|
||||
|
||||
CLI::write(CLI::color(" ✅ Success! DB ID: {$insertId}", 'green'));
|
||||
return true;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// 실패 시 로그 업데이트
|
||||
$logModel->update($log['seq'], [
|
||||
'status' => 'FAIL',
|
||||
'error_msg' => $e->getMessage()
|
||||
]);
|
||||
|
||||
CLI::error(" ❌ Failed: " . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,103 +5,294 @@ namespace App\Commands;
|
||||
use CodeIgniter\CLI\BaseCommand;
|
||||
use CodeIgniter\CLI\CLI;
|
||||
|
||||
use App\Models\Entities\NaverWorkerLogModel; // 새로 만든 테이블용 모델
|
||||
|
||||
// 헬퍼 로드 (app/Helpers/log_helper.php 가 있어야 함 autoload 설정 넣어놓았음)
|
||||
|
||||
class NaverWorker extends BaseCommand
|
||||
{
|
||||
protected $group = 'Workers';
|
||||
protected $name = 'naver:worker';
|
||||
protected $description = 'Process Naver verification requests from Redis queue with retry logic.';
|
||||
protected $description = 'Redis에서 데이터를 꺼내 DB에 저장하고 네이버 API를 호출합니다.';
|
||||
|
||||
// 최대 재시도 횟수 정의
|
||||
private const MAX_RETRIES = 3;
|
||||
private const RETRY_DELAY = 60; // 초 단위 (60초 지연 후 재시도)
|
||||
// DB 객체를 담을 변수 선언
|
||||
protected $db;
|
||||
protected $redisHost;
|
||||
protected $redisPort;
|
||||
protected $redisDatabase;
|
||||
|
||||
public function run(array $params)
|
||||
{
|
||||
$redis = new \Redis();
|
||||
// 환경 변수를 사용하도록 변경 (php_worker service의 env 설정 활용)
|
||||
$redisHost = getenv('REDIS_HOST') ?: 'redis';
|
||||
$redisPort = getenv('REDIS_PORT') ?: 6379;
|
||||
helper(['log', 'redis']); // redis helper 추가
|
||||
|
||||
$redis->connect($redisHost, $redisPort);
|
||||
$this->db = \Config\Database::connect();
|
||||
|
||||
CLI::write('Worker started. Listening on naver:queue...');
|
||||
// 워커 시작 시점에 선제적으로 연결 상태를 보정
|
||||
try {
|
||||
$this->db->initialize();
|
||||
} catch (\Throwable $e) {
|
||||
CLI::error('Database connection init failed: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
while (true) {
|
||||
// 메인 큐 및 재시도 큐에서 데이터 꺼내기 (Blocking Pop, 5초 타임아웃)
|
||||
// LIFO (lPush/brPop) 사용 시: ['naver:queue:retry', 'naver:queue']
|
||||
$item = $redis->brPop(['naver:worker_queue'], 5);
|
||||
$logModel = model(NaverWorkerLogModel::class);
|
||||
$naverService = new \App\Services\NaverService(); // 서비스 생성
|
||||
|
||||
// Redis 연결 (실패해도 계속 진행 - 파일 모드로 동작 가능)
|
||||
$redis = get_redis_connection('worker');
|
||||
$config = get_redis_config('worker');
|
||||
|
||||
if ($redis) {
|
||||
CLI::write(CLI::color('🟢 Naver Worker running... (Redis: ' . $config['host'] . ':' . $config['port'] . ' DB:' . $config['database'] . ')', 'green'));
|
||||
} else {
|
||||
CLI::write(CLI::color('⚠️ Naver Worker running in FILE-ONLY mode (Redis unavailable)', 'yellow'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
while (true) {
|
||||
|
||||
// Redis 또는 폴백 파일에서 데이터 읽기
|
||||
$rawData = null;
|
||||
$source = 'redis'; // 데이터 소스 추적
|
||||
|
||||
// 1. Redis에서 데이터 읽기 시도 (Redis가 있을 경우만)
|
||||
if ($redis) {
|
||||
$maxRetries = 2;
|
||||
$retryCount = 0;
|
||||
|
||||
if ($item) {
|
||||
$payload = json_decode($item[1], true);
|
||||
$this->process($redis, $payload); // Redis 객체를 process에 전달
|
||||
while ($retryCount < $maxRetries) {
|
||||
try {
|
||||
$result = $redis->brPop(['naver:raw_queue'], 5); // 5초 타임아웃
|
||||
if ($result) {
|
||||
$rawData = $result[1];
|
||||
$source = 'redis';
|
||||
}
|
||||
break; // 성공하면 루프 탈출
|
||||
} catch (\Exception $e) {
|
||||
$retryCount++;
|
||||
CLI::write(CLI::color("⚠️ Redis error (attempt {$retryCount}/{$maxRetries}): " . $e->getMessage(), 'yellow'));
|
||||
|
||||
if ($retryCount >= $maxRetries) {
|
||||
CLI::write(CLI::color("⚠️ Redis unavailable, switching to file mode", 'yellow'));
|
||||
$redis = null; // Redis를 비활성화
|
||||
break;
|
||||
}
|
||||
|
||||
// Redis 재연결 시도
|
||||
try {
|
||||
CLI::write(CLI::color('🔄 Reconnecting to Redis...', 'yellow'));
|
||||
$redis->close();
|
||||
$redis = get_redis_connection('worker');
|
||||
if ($redis) {
|
||||
CLI::write(CLI::color('✅ Redis reconnected', 'green'));
|
||||
}
|
||||
} catch (\Exception $reconnectError) {
|
||||
CLI::error("Redis reconnection error: " . $reconnectError->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function process(\Redis $redis, $payload)
|
||||
{
|
||||
$articleNum = $payload['articleNumbr'];
|
||||
$requestType = $payload['reqeustType'];
|
||||
$retryCount = $payload['retry_count'] ?? 0;
|
||||
|
||||
CLI::write("Processing {$requestType} for {$articleNum} (Attempt: " . ($retryCount + 1) . ")");
|
||||
|
||||
if (!in_array($requestType, ['REG', 'MOD'])) {
|
||||
CLI::write("Skipping non-verification request {$requestType} for {$articleNum}");
|
||||
return;
|
||||
// 2. Redis에서 데이터 없으면 폴백 파일 확인
|
||||
if (!$rawData) {
|
||||
$rawData = $this->readFromFallbackFile();
|
||||
if ($rawData) {
|
||||
$source = 'file';
|
||||
}
|
||||
}
|
||||
|
||||
// 1. 네이버 CP API 호출
|
||||
$client = \Config\Services::curlrequest([
|
||||
'timeout' => 10,
|
||||
// ... (인증 헤더 설정 등 이전 답변의 보안 관련 항목 추가)
|
||||
]);
|
||||
$url = "https://네이버CP/kiso/center/verification-article/{$articleNum}";
|
||||
// 3. 데이터 없으면 다음 루프
|
||||
if (!$rawData) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 4. 데이터 소스 로깅
|
||||
CLI::write(CLI::color("📥 Data received from: " . strtoupper($source), 'cyan'));
|
||||
|
||||
// [1] 꺼내자마자 DB에 원문 저장 (2차 임시 저장) - 실패 시 재시도
|
||||
try {
|
||||
$logId = $logModel->insert([
|
||||
'raw_payload' => $rawData,
|
||||
'status' => 'INIT'
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
// MySQL 연결 계열 에러 시 재연결 후 재시도
|
||||
if ($this->isMySqlConnectionError($e)) {
|
||||
CLI::write(CLI::color('⚠️ MySQL gone away, reconnecting...', 'yellow'));
|
||||
$this->db->close();
|
||||
$this->db = \Config\Database::connect();
|
||||
$this->db->initialize();
|
||||
$logModel = model(NaverWorkerLogModel::class);
|
||||
|
||||
// 재시도
|
||||
$logId = $logModel->insert([
|
||||
'raw_payload' => $rawData,
|
||||
'status' => 'INIT'
|
||||
]);
|
||||
} else {
|
||||
throw $e; // 다른 에러면 그대로 throw
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$response = $client->get($url);
|
||||
$statusCode = $response->getStatusCode();
|
||||
$responseJson = json_decode($rawData, true);
|
||||
$payload = $responseJson['request_data'] ?? [];
|
||||
|
||||
if ($statusCode >= 200 && $statusCode < 300) {
|
||||
// 2. 성공 처리
|
||||
CLI::write("✅ SUCCESS: {$requestType} for {$articleNum} (Status: {$statusCode})");
|
||||
// 성공 시 DB에 결과 업데이트 등 후속 작업 진행
|
||||
} else {
|
||||
// 3. API 실패 (4xx, 5xx 에러)
|
||||
$this->handleFailure($redis, $payload, $retryCount, "API returned Status: {$statusCode}");
|
||||
if (empty($payload)) {
|
||||
throw new \Exception("빈 페이로드 데이터");
|
||||
}
|
||||
|
||||
// 서비스의 함수 하나로 모든 처리 완료
|
||||
$insertId = $naverService->processArticle($payload);
|
||||
|
||||
// [3] 성공 시 로그 업데이트 (재연결 처리 포함)
|
||||
$this->safeUpdateLog($logModel, $logId, [
|
||||
'atcl_no' => $payload['articleNumber'] ?? null,
|
||||
'status' => 'SUCCESS',
|
||||
'target_db_id' => $insertId
|
||||
]);
|
||||
|
||||
CLI::write("✅ Success! DB ID: $insertId | Source: $source", 'cyan');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// 4. 네트워크/타임아웃 오류
|
||||
$this->handleFailure($redis, $payload, $retryCount, "Network Error: " . $e->getMessage());
|
||||
CLI::error("❌ Task Failed: " . $e->getMessage());
|
||||
|
||||
// payload에서 매물번호 추출 시도
|
||||
$atclNo = null;
|
||||
try {
|
||||
if (!empty($rawData)) {
|
||||
$responseJson = json_decode($rawData, true);
|
||||
$payload = $responseJson['request_data'] ?? [];
|
||||
$atclNo = $payload['articleNumber'] ?? null;
|
||||
}
|
||||
} catch (\Exception $parseEx) {
|
||||
// JSON 파싱 실패는 무시
|
||||
}
|
||||
|
||||
// 실패 로그는 여기서 남김
|
||||
// 1. DB 상태를 FAIL로 업데이트 (필수) (재연결 처리 포함)
|
||||
$this->safeUpdateLog($logModel, $logId, [
|
||||
'atcl_no' => $atclNo,
|
||||
'status' => 'FAIL',
|
||||
'error_msg' => $e->getMessage()
|
||||
]);
|
||||
|
||||
// 2. Redis 실패 큐에 백업 (선택 - Redis가 있을 경우만)
|
||||
if ($redis) {
|
||||
try {
|
||||
$redis->lPush('naver:failed_queue', $rawData);
|
||||
} catch (\Exception $redisEx) {
|
||||
// Redis 실패 시에도 에러 처리하지 않음 (이미 DB에 FAIL 로그 남김)
|
||||
CLI::write(CLI::color('⚠️ Failed to push to failed_queue: ' . $redisEx->getMessage(), 'yellow'));
|
||||
}
|
||||
}
|
||||
|
||||
helper('log');
|
||||
write_custom_log("FAILED_DATA | Error: " . $e->getMessage(), 'ERROR', 'failed');
|
||||
|
||||
// 루프 과부하 방지 (연속 에러 시)
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
private function handleFailure(\Redis $redis, $payload, $retryCount, $reason)
|
||||
}
|
||||
|
||||
/**
|
||||
* MySQL 연결 계열 에러 발생 시 재연결 후 재시도하는 안전한 update
|
||||
*/
|
||||
protected function safeUpdateLog($logModel, $logId, $data)
|
||||
{
|
||||
$articleNum = $payload['articleNumbr'];
|
||||
|
||||
if ($retryCount < self::MAX_RETRIES) {
|
||||
// 5. 재시도 로직: 재시도 횟수 증가 및 큐에 다시 푸시
|
||||
$payload['retry_count'] = $retryCount + 1;
|
||||
|
||||
// 지연된 재시도를 위해 Sorted Set (ZADD) 또는 별도의 큐 사용을 고려할 수 있으나,
|
||||
// 여기서는 단순성을 위해 즉시 재시도 큐에 넣고 sleep을 사용하는 방식을 가정합니다.
|
||||
// **주의: 실제 프로덕션 환경에서는 `Redis ZSET`을 사용하여 지연된 작업을 처리하는 것이 더 일반적입니다.**
|
||||
|
||||
// 단순 재시도 큐 (ZSET을 사용하지 않는 경우)
|
||||
$redis->lPush('naver:queue:retry', json_encode($payload));
|
||||
|
||||
// CLI 환경에서 재시도 간 지연 시간을 강제 (Blocking pop을 쓰므로 실제 지연은 다음 worker 실행 시 발생)
|
||||
CLI::error("Attempt {$retryCount} FAILED for {$articleNum}. Reason: {$reason}. Retrying later.");
|
||||
|
||||
} else {
|
||||
// 6. 최종 실패 처리: DLQ로 이동
|
||||
$payload['fail_reason'] = $reason;
|
||||
$payload['fail_time'] = date('Y-m-d H:i:s');
|
||||
|
||||
$redis->lPush('naver:queue:dlq', json_encode($payload));
|
||||
|
||||
CLI::error("❌ CRITICAL FAIL: {$articleNum} moved to DLQ after " . self::MAX_RETRIES . " attempts.");
|
||||
try {
|
||||
return $logModel->update($logId, $data);
|
||||
} catch (\Throwable $e) {
|
||||
if ($this->isMySqlConnectionError($e)) {
|
||||
CLI::write(CLI::color('⚠️ MySQL gone away on update, reconnecting...', 'yellow'));
|
||||
$this->db->close();
|
||||
$this->db = \Config\Database::connect();
|
||||
$this->db->initialize();
|
||||
$logModel = model(\App\Models\Entities\NaverWorkerLogModel::class);
|
||||
|
||||
// 재시도
|
||||
return $logModel->update($logId, $data);
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MySQL 연결 끊김 계열 에러 여부 판별
|
||||
*/
|
||||
protected function isMySqlConnectionError(\Throwable $e): bool
|
||||
{
|
||||
$message = strtolower($e->getMessage());
|
||||
|
||||
return str_contains($message, 'mysql server has gone away')
|
||||
|| str_contains($message, 'lost connection to mysql server')
|
||||
|| str_contains($message, 'server has gone away');
|
||||
}
|
||||
|
||||
/**
|
||||
* 폴백 파일에서 데이터 읽기 (Redis 장애 시 파일에서 직접 처리)
|
||||
*
|
||||
* @return string|null JSON 데이터 또는 null
|
||||
*/
|
||||
protected function readFromFallbackFile()
|
||||
{
|
||||
$fallbackDir = ROOTPATH . 'worker/fallback_queue';
|
||||
|
||||
// 폴백 디렉토리가 없으면 null 반환
|
||||
if (!is_dir($fallbackDir)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 폴백 파일 목록 가져오기 (오래된 순서대로)
|
||||
$files = glob($fallbackDir . '/*.json');
|
||||
|
||||
if (empty($files)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
sort($files); // 파일명(타임스탬프) 기준 정렬
|
||||
|
||||
// 가장 오래된 파일 하나 처리
|
||||
$filePath = $files[0];
|
||||
|
||||
try {
|
||||
// 파일 락을 사용하여 읽기 (동시 접근 방지)
|
||||
$fp = fopen($filePath, 'r');
|
||||
if (!$fp) {
|
||||
CLI::write(CLI::color("⚠️ Failed to open fallback file: " . basename($filePath), 'yellow'));
|
||||
return null;
|
||||
}
|
||||
|
||||
// 배타적 락 획득 시도
|
||||
if (!flock($fp, LOCK_EX | LOCK_NB)) {
|
||||
// 락 획득 실패 (다른 프로세스가 처리 중)
|
||||
fclose($fp);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 파일 내용 읽기
|
||||
$content = stream_get_contents($fp);
|
||||
|
||||
// 파일 삭제 (처리 완료로 간주)
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
unlink($filePath);
|
||||
|
||||
CLI::write(CLI::color("📂 Processing fallback file: " . basename($filePath), 'green'));
|
||||
|
||||
return $content;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
CLI::write(CLI::color("❌ Error reading fallback file " . basename($filePath) . ": " . $e->getMessage(), 'red'));
|
||||
if (isset($fp) && is_resource($fp)) {
|
||||
flock($fp, LOCK_UN);
|
||||
fclose($fp);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
32
app/Commands/TestLog.php
Normal file
32
app/Commands/TestLog.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Commands;
|
||||
|
||||
use CodeIgniter\CLI\BaseCommand;
|
||||
use CodeIgniter\CLI\CLI;
|
||||
|
||||
class TestLog extends BaseCommand
|
||||
{
|
||||
protected $group = 'Test';
|
||||
protected $name = 'test:log';
|
||||
protected $description = 'Test log_message function';
|
||||
|
||||
public function run(array $params)
|
||||
{
|
||||
CLI::write('Testing log_message()...', 'yellow');
|
||||
|
||||
log_message('error', '===== TEST LOG MESSAGE FROM CLI ===== ' . date('Y-m-d H:i:s'));
|
||||
log_message('debug', 'Debug level test');
|
||||
log_message('info', 'Info level test');
|
||||
|
||||
$logFile = WRITEPATH . 'logs/log-' . date('Y-m-d') . '.log';
|
||||
|
||||
CLI::write('Log file: ' . $logFile);
|
||||
CLI::write('Exists: ' . (file_exists($logFile) ? 'YES' : 'NO'));
|
||||
|
||||
if (file_exists($logFile)) {
|
||||
CLI::write('Last 10 lines:');
|
||||
CLI::write(shell_exec('tail -10 ' . escapeshellarg($logFile)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ class App extends BaseConfig
|
||||
*
|
||||
* E.g., http://example.com/
|
||||
*/
|
||||
public string $baseURL = 'http://test2-admin.confirms.co.kr';
|
||||
public string $baseURL = 'http://localtest2-admin.confirms.co.kr';
|
||||
|
||||
/**
|
||||
* Allowed Hostnames in the Site URL other than the hostname in the baseURL.
|
||||
@@ -199,4 +199,37 @@ class App extends BaseConfig
|
||||
* @see http://www.w3.org/TR/CSP/
|
||||
*/
|
||||
public bool $CSPEnabled = false;
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
* Constructor - .env 값 로드
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// .env 파일의 값으로 속성 오버라이드
|
||||
if (env('app.baseURL')) {
|
||||
$this->baseURL = env('app.baseURL');
|
||||
}
|
||||
|
||||
if (env('app.appTimezone')) {
|
||||
$this->appTimezone = env('app.appTimezone');
|
||||
}
|
||||
|
||||
if (env('app.forceGlobalSecureRequests') !== null) {
|
||||
$this->forceGlobalSecureRequests = filter_var(
|
||||
env('app.forceGlobalSecureRequests'),
|
||||
FILTER_VALIDATE_BOOLEAN
|
||||
);
|
||||
}
|
||||
|
||||
if (env('app.CSPEnabled') !== null) {
|
||||
$this->CSPEnabled = filter_var(
|
||||
env('app.CSPEnabled'),
|
||||
FILTER_VALIDATE_BOOLEAN
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,5 +88,5 @@ class Autoload extends AutoloadConfig
|
||||
*
|
||||
* @var list<string>
|
||||
*/
|
||||
public $helpers = ['url'];
|
||||
public $helpers = ['log','url', 'function'];
|
||||
}
|
||||
|
||||
@@ -159,13 +159,13 @@ class Cache extends BaseConfig
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Redis 설정에 .env 값을 할당 (이전 논의된 Docker 호스트 이름 'redis' 사용)
|
||||
// Redis 설정에 환경 변수 값을 할당 (두 가지 환경 변수 형식 지원)
|
||||
$this->redis = [
|
||||
'host' => env('redis.default.host', '127.0.0.1'),
|
||||
'password' => env('redis.default.password', null),
|
||||
'port' => (int)env('redis.default.port', 6379),
|
||||
'timeout' => (int)env('redis.default.timeout', 0),
|
||||
'database' => (int)env('redis.default.database', 0)
|
||||
'host' => env('REDIS_HOST', env('redis.default.host', '127.0.0.1')),
|
||||
'password' => env('REDIS_PASSWORD', env('redis.default.password')) ?: null,
|
||||
'port' => (int)(env('REDIS_PORT', env('redis.default.port', 6379))),
|
||||
'timeout' => (int)(env('REDIS_TIMEOUT', env('redis.default.timeout', 0))),
|
||||
'database' => (int)(env('REDIS_DATABASE', env('redis.default.database', 0)))
|
||||
];
|
||||
|
||||
// 필요하다면, 이 생성자에서 $handler나 $backupHandler 같은 다른 설정도
|
||||
|
||||
@@ -82,8 +82,18 @@ defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automa
|
||||
/**
|
||||
* ncloud url
|
||||
*/
|
||||
define('NCLOUD_OBJECT_STORAGE_URL', 'https://kr.object.ncloudstorage.com/confirms-object');
|
||||
define('NCLOUD_S3_KEY', 'ncp_iam_BPAMKR3l50hXJiQ6qpSP');
|
||||
define('NCLOUD_S3_SECRET', 'ncp_iam_BPKMKRW2GU59UE59I1QftVGst6NJgnmbSc');
|
||||
define('NCLOUD_S3_BUCKET', 'confirms-object');
|
||||
define('NCLOUD_S3_ENDPOINT', 'https://kr.object.ncloudstorage.com');
|
||||
// 환경별 버킷 설정
|
||||
$environment = getenv('CI_ENVIRONMENT') ?: 'production';
|
||||
|
||||
if ($environment === 'development') {
|
||||
define('NCLOUD_S3_BUCKET', 'confirms-object-test');
|
||||
define('NCLOUD_OBJECT_STORAGE_URL', 'https://kr.object.ncloudstorage.com/confirms-object-test');
|
||||
} else {
|
||||
define('NCLOUD_S3_BUCKET', 'confirms-object');
|
||||
define('NCLOUD_OBJECT_STORAGE_URL', 'https://kr.object.ncloudstorage.com/confirms-object');
|
||||
}
|
||||
|
||||
// .env 파일에서 NCLOUD 설정 읽기
|
||||
define('NCLOUD_S3_KEY', getenv('ncloud.s3.key') ?: 'ncp_iam_BPAMKR3l50hXJiQ6qpSP');
|
||||
define('NCLOUD_S3_SECRET', getenv('ncloud.s3.secret') ?: 'ncp_iam_BPKMKRW2GU59UE59I1QftVGst6NJgnmbSc');
|
||||
define('NCLOUD_S3_ENDPOINT', getenv('ncloud.s3.endpoint') ?: 'https://kr.object.ncloudstorage.com');
|
||||
|
||||
@@ -85,6 +85,7 @@ class Filters extends BaseFilters
|
||||
'index.php/login/*', // /index.php/login/*
|
||||
'register', // 회원가입 등
|
||||
'register/*',
|
||||
'/listfax/listfax/getLists',
|
||||
'kiso/*', // 필요하면 API는 예외
|
||||
],
|
||||
],
|
||||
|
||||
@@ -39,7 +39,7 @@ class Logger extends BaseConfig
|
||||
*
|
||||
* @var int|list<int>
|
||||
*/
|
||||
public $threshold = (ENVIRONMENT === 'production') ? 4 : 9;
|
||||
public $threshold = 9; // Always log everything for debugging
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
@@ -16,8 +16,9 @@ $routes->get('/logout', 'Login::out');
|
||||
$routes->get('/', 'Home\Home::dashboard');
|
||||
$routes->get('/home', 'Home\Home::dashboard');
|
||||
|
||||
$routes->get('/home/viewStatData', to: 'Home\Home::viewStatData'); // 실적조회
|
||||
$routes->get('/home/getHomeFaxCount', to: 'Home\Home::getHomeFaxCount'); // 팩스조회
|
||||
$routes->get('/home/viewStatData', 'Home\Home::viewStatData'); // 실적조회
|
||||
$routes->get('/home/getHomeFaxCount', 'Home\Home::getHomeFaxCount'); // 팩스조회
|
||||
$routes->get('/listfax/listfax/getLists', 'Listfax\ListFax::getLists'); // 팩스수신확인
|
||||
|
||||
/**
|
||||
* 공통 API
|
||||
@@ -27,6 +28,8 @@ $routes->group('common', ['namespace' => 'App\Controllers\Common'], function ($r
|
||||
|
||||
|
||||
$routes->post('common/changeUserPass', 'Common::changeUserPass'); // 비밀번호변경
|
||||
$routes->get('getComplexList', 'Common::getComplexList'); // 단지목록조회
|
||||
$routes->get('getPyeongInfo', 'Common::getPyeongInfo'); // 평형정보조회
|
||||
|
||||
});
|
||||
|
||||
@@ -51,13 +54,128 @@ $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->get('getRecInfo', 'Receipt::getRecInfo'); // 거주인정보조회
|
||||
$routes->get('getHistory', 'Receipt::getHistory'); // 정보변경이력조회
|
||||
$routes->get('getImages', 'Receipt::getImages'); // 이미지 목록 조회
|
||||
$routes->post('uploadFile', 'Receipt::uploadFile'); // 파일업로드
|
||||
$routes->post('removeUploadFile', 'Receipt::removeUploadFile'); // 파일삭제
|
||||
$routes->post('updateImageOrder', 'Receipt::updateImageOrder'); // 이미지 순서 업데이트
|
||||
$routes->get('downloadAllImages', 'Receipt::downloadAllImages'); // 이미지 일괄 다운로드
|
||||
$routes->post('saveImgLocation', 'Receipt::saveImgLocation'); // 촬영위치 저장
|
||||
|
||||
$routes->post('modifyPriceInfo', 'Receipt::modifyPriceInfo'); // 가격정보 수정
|
||||
});
|
||||
|
||||
/**
|
||||
* 조직별 배정 현황
|
||||
*/
|
||||
$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) {
|
||||
/**
|
||||
* 일반확인매물관리
|
||||
* 확인매물현황
|
||||
*/
|
||||
$routes->group('m701', static function ($routes) {
|
||||
$routes->get('m701a/lists', 'M701::lists');
|
||||
@@ -69,6 +187,247 @@ $routes->group('', ['namespace' => 'App\Controllers\V2'], static function ($rout
|
||||
$routes->get('m701a/getResultList', 'M701::getResultList');
|
||||
$routes->get('m701a/excel', 'M701::excel');
|
||||
|
||||
$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'); // 파일업로드
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 배정매물현황
|
||||
*/
|
||||
$routes->group('m702', static function ($routes) {
|
||||
$routes->get('m702a/lists', 'M702::lists');
|
||||
$routes->get('m702a/detail/(:num)', 'M702::detail/$1');
|
||||
|
||||
/**
|
||||
* 배정매물현황 - API
|
||||
*/
|
||||
$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'); // 파일업로드
|
||||
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* 홍보확인서현황
|
||||
*/
|
||||
$routes->group('m703', static function ($routes) {
|
||||
$routes->get('m703a/lists', 'M703::lists');
|
||||
$routes->get('m703a/detail/(:num)', 'M703::detail/$1');
|
||||
|
||||
/**
|
||||
* 홍보확인서현황 - API
|
||||
*/
|
||||
$routes->get('m703a/getResultList', 'M703::getResultList');
|
||||
$routes->get('m703a/excel', 'M703::excel');
|
||||
$routes->post('m703a/saveBunyang', 'M703::saveBunyang'); // 현장확인저장
|
||||
$routes->post('m703a/saveOthers', 'M703::saveOthers'); // 홍보확인서아님
|
||||
$routes->post('m703a/saveDuplicate', 'M703::saveDuplicate'); // 중복
|
||||
$routes->post('m703a/saveBubun', 'M703::saveBubun'); // 부분수신
|
||||
$routes->post('m703a/saveFaxImgs', 'M703::saveFaxImgs'); // 매물정보변경
|
||||
$routes->post('m703a/getNextFaxImgs', 'M703::getNextFaxImgs'); // 다음매물정보조회
|
||||
$routes->post('m703a/saveRequestMessage', 'M703::saveRequestMessage'); // 중개사요청사항저장
|
||||
$routes->post('m703a/saveResult', 'M703::saveResult'); // 결과저장
|
||||
|
||||
|
||||
/**
|
||||
* 홍보확인서 확인
|
||||
*/
|
||||
$routes->get('m703a/find', 'M703::find');
|
||||
});
|
||||
|
||||
/**
|
||||
* 전화확인매물현황
|
||||
*/
|
||||
$routes->group('m704', static function ($routes) {
|
||||
$routes->get('m704a/lists', 'M704::lists');
|
||||
$routes->get('m704a/detail/(:num)', 'M704::detail/$1');
|
||||
|
||||
/**
|
||||
* 전화확인매물현황 - API
|
||||
*/
|
||||
$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'); // 다음매물확인
|
||||
});
|
||||
|
||||
/**
|
||||
* 등기부등본확인매물현황
|
||||
*/
|
||||
$routes->group('m705', static function ($routes) {
|
||||
$routes->get('m705a/lists', 'M705::lists');
|
||||
$routes->get('m705a/detail/(:num)', 'M705::detail/$1');
|
||||
|
||||
/**
|
||||
* 등기부등본확인매물현황 - API
|
||||
*/
|
||||
$routes->get('m705a/getResultList', 'M705::getResultList');
|
||||
$routes->get('m705a/excel', 'M705::excel');
|
||||
|
||||
$routes->post('m705a/rotateImage', 'M705::rotateImage'); // 이미지 회전
|
||||
$routes->post('m705a/saveCorp', 'M705::saveCorp'); // 법인저장
|
||||
$routes->post('m705a/uploadFile', 'M705::uploadFile'); // 파일업로드
|
||||
|
||||
$routes->post('m705a/getNextInfo', 'M705::getNextInfo'); // 다음매물확인
|
||||
$routes->post('m705a/saveRegi', 'M705::saveRegi'); // 매물저장
|
||||
$routes->post('m705a/getNextInfo', 'M705::getNextInfo'); // 다음매물
|
||||
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 1차 재검증 매물현황
|
||||
*/
|
||||
$routes->group('m706', static function ($routes) {
|
||||
$routes->get('m706a/lists', 'M706::lists');
|
||||
$routes->get('m706a/detail/(:num)', 'M706::detail/$1');
|
||||
|
||||
/**
|
||||
* 1차 재검증 매물현황 - API
|
||||
*/
|
||||
$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'); // 등기부등본 저장
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 현장확인매물 홍보확인서
|
||||
*/
|
||||
$routes->group('m708', static function ($routes) {
|
||||
$routes->get('m708a/lists', 'M708::lists');
|
||||
$routes->get('m708a/detail/(:num)', 'M708::detail/$1');
|
||||
|
||||
/**
|
||||
* 1차 재검증 매물현황 - API
|
||||
*/
|
||||
$routes->get('m708a/getResultList', 'M708::getResultList');
|
||||
$routes->get('m708a/excel', 'M708::excel');
|
||||
$routes->post('m708a/rotateImage', 'M708::rotateImage'); // 이미지 회전
|
||||
$routes->get('m708a/getArticleInfo', 'M708::getArticleInfo'); // 매물검색
|
||||
$routes->post('m708a/saveNotArticle', 'M708::saveNotArticle'); // 홍보확인서 아님 저장
|
||||
$routes->post('m708a/saveDuplImgs', 'M708::saveDuplImgs'); // 중복으로 저장
|
||||
$routes->post('m708a/saveMobileBunyang', 'M708::saveMobileBunyang'); // 모바일분양권 저장
|
||||
$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/saveResult3', 'M708::saveResult3'); // 분양계약서저장
|
||||
$routes->post('m708a/getNextFaxImgs', 'M708::getNextFaxImgs'); // 다음매물
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 모바일 추가 서류
|
||||
*/
|
||||
$routes->group('m709', static function ($routes) {
|
||||
$routes->get('m709a/lists', 'M709::lists');
|
||||
$routes->get('m709a/detail/(:num)', 'M709::detail/$1');
|
||||
|
||||
/**
|
||||
* 모바일 추가 서류 - API
|
||||
*/
|
||||
$routes->get('m709a/getResultList', 'M709::getResultList');
|
||||
$routes->get('m709a/excel', 'M709::excel');
|
||||
$routes->post('m709a/rotateImage', 'M709::rotateImage'); // 이미지 회전
|
||||
$routes->get('m709a/getArticleInfo', 'M709::getArticleInfo'); // 매물검색
|
||||
$routes->post('m709a/saveNotArticle', 'M709::saveNotArticle'); // 홍보확인서 아님 저장
|
||||
$routes->post('m709a/saveDuplImgs', 'M709::saveDuplImgs'); // 중복으로 저장
|
||||
$routes->post('m709a/saveAddress', 'M709::saveAddress'); // 정보 저장
|
||||
$routes->post('m709a/saveImageArticle', 'M709::saveImageArticle'); // 확인결과저장
|
||||
$routes->post('m709a/getNextFaxImgs', 'M709::getNextFaxImgs'); // 다음매물
|
||||
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* 전송대기매물현황
|
||||
*/
|
||||
$routes->group('m710', static function ($routes) {
|
||||
$routes->get('m710a/lists', 'M710::lists');
|
||||
|
||||
/**
|
||||
* 모바일 추가 서류 - API
|
||||
*/
|
||||
$routes->get('m710a/getResultList', 'M710::getResultList');
|
||||
$routes->get('m710a/excel', 'M710::excel');
|
||||
$routes->get('m710a/sendApi', 'M710::sendApi'); // 전송요청 api 저장
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 모바일 자동검증
|
||||
*/
|
||||
$routes->group('m711', static function ($routes) {
|
||||
$routes->get('m711a/lists', 'M711::lists');
|
||||
|
||||
/**
|
||||
* 모바일 자동검증 - API
|
||||
*/
|
||||
$routes->get('m711a/getResultList', 'M711::getResultList');
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* 신홍보확인서 현황
|
||||
*/
|
||||
$routes->group('m712', static function ($routes) {
|
||||
$routes->get('m712a/lists', 'M712::lists');
|
||||
$routes->get('m712a/detail/(:num)', 'M712::detail/$1');
|
||||
|
||||
/**
|
||||
* 신홍보확인서 현황 - API
|
||||
*/
|
||||
$routes->get('m712a/getResultList', 'M712::getResultList');
|
||||
$routes->post('m712a/rotateImage', 'M712::rotateImage'); // 이미지 회전
|
||||
$routes->post('m712a/uploadFile', 'M712::uploadFile'); // 파일업로드
|
||||
$routes->post('m712a/saveNotReceived', 'M712::saveNotReceived'); // 서류미수취 저장
|
||||
$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'); // 다음매물
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
@@ -152,11 +511,11 @@ $routes->group('article', ['namespace' => 'App\Controllers\Article'], function (
|
||||
*/
|
||||
$routes->group('results', ['namespace' => 'App\Controllers\Results'], function ($routes) {
|
||||
/** 화면 */
|
||||
$routes->match(['get', 'post'], 'summary/stats_s01', 'Summary::lists'); // 현장확인요약실적
|
||||
$routes->match(['get', 'post'], 'dept/stats_d01', 'Dept::lists'); // 현장확인요약실적
|
||||
$routes->match(['get', 'post'], 'person/stats_p01', 'Person::lists'); // 현장확인개인별실적
|
||||
$routes->match(['get', 'post'], 'assign/stats_a01', 'Assign::lists'); // 현장확인인원별배정현황
|
||||
$routes->match(['get', 'post'], 'm409/m409a/stats', 'M409::stats'); // 확인매물일별실적
|
||||
$routes->match(['GET', 'POST'], 'summary/stats_s01', 'Summary::lists'); // 현장확인요약실적
|
||||
$routes->match(['GET', 'POST'], 'dept/stats_d01', 'Dept::lists'); // 현장확인요약실적
|
||||
$routes->match(['GET', 'POST'], 'person/stats_p01', 'Person::lists'); // 현장확인개인별실적
|
||||
$routes->match(['GET', 'POST'], 'assign/stats_a01', 'Assign::lists'); // 현장확인인원별배정현황
|
||||
$routes->match(['GET', 'POST'], 'm409/m409a/stats', 'M409::stats'); // 확인매물일별실적
|
||||
|
||||
|
||||
/** API - 현장확인조직별실적 */
|
||||
@@ -181,7 +540,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 확인매물일별실적
|
||||
$routes->group('m409', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm409a/stats', 'M409::stats');
|
||||
$routes->match(['GET', 'POST'], 'm409a/stats', 'M409::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m409a/getResultList', 'M409::getResultList');
|
||||
@@ -190,7 +549,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 확인매물개인별실적
|
||||
$routes->group('m410', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm410a/stats', 'M410::stats');
|
||||
$routes->match(['GET', 'POST'], 'm410a/stats', 'M410::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m410a/getResultList', 'M410::getResultList');
|
||||
@@ -199,7 +558,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 확인매물매체사실적
|
||||
$routes->group('m411', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm411a/stats', 'M411::stats');
|
||||
$routes->match(['GET', 'POST'], 'm411a/stats', 'M411::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m411a/getResultList', 'M411::getResultList');
|
||||
@@ -208,7 +567,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 확인매물일자별실적
|
||||
$routes->group('m412', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm412a/stats', 'M412::stats');
|
||||
$routes->match(['GET', 'POST'], 'm412a/stats', 'M412::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m412a/getResultList', 'M412::getResultList');
|
||||
@@ -218,7 +577,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 검증소요시간
|
||||
$routes->group('m415', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm415a/stats', 'M415::stats');
|
||||
$routes->match(['GET', 'POST'], 'm415a/stats', 'M415::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m415a/getResultList', 'M415::getResultList');
|
||||
@@ -227,7 +586,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 개인별이동거리
|
||||
$routes->group('m416', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm416a/stats', 'M416::stats');
|
||||
$routes->match(['GET', 'POST'], 'm416a/stats', 'M416::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m416a/getResultList', 'M416::getResultList');
|
||||
@@ -236,7 +595,7 @@ $routes->group('', ['namespace' => 'App\Controllers\Results'], static function (
|
||||
|
||||
// 신규매물실적관리
|
||||
$routes->group('m417', static function ($routes) {
|
||||
$routes->match(['get', 'post'], 'm417a/stats', 'M417::stats');
|
||||
$routes->match(['GET', 'POST'], 'm417a/stats', 'M417::stats');
|
||||
|
||||
// API
|
||||
$routes->get('m417a/getResultList', 'M417::getResultList');
|
||||
@@ -310,8 +669,20 @@ $routes->group('manage', ['namespace' => 'App\Controllers\Manage'], function ($r
|
||||
/** API - 로그인로그관리 */
|
||||
$routes->get('loginlog/getLogList', 'LoginLog::getLogList');
|
||||
$routes->get('loginlog/excel', 'LoginLog::excel');
|
||||
|
||||
/** Worker 로그 관리 */
|
||||
$routes->get('workerlog', 'WorkerLog::index');
|
||||
$routes->get('workerlog/stream', 'WorkerLog::stream');
|
||||
$routes->get('workerlog/download', 'WorkerLog::download');
|
||||
$routes->post('workerlog/delete', 'WorkerLog::delete');
|
||||
});
|
||||
|
||||
/**
|
||||
* 금리비교
|
||||
*/
|
||||
$routes->group('interest_rates', ['namespace' => 'App\Controllers\Interest'], function ($routes) {
|
||||
$routes->get('interest/lists', 'Rates::lists');
|
||||
});
|
||||
|
||||
/**
|
||||
* 로그인 API
|
||||
@@ -330,3 +701,12 @@ $routes->post('/login/chkLogin', 'Login::chkLogin');
|
||||
if (is_file($filepath = APPPATH . 'Config/Routes/Api.php')) {
|
||||
require $filepath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Worker 관리
|
||||
*/
|
||||
$routes->group('manage/worker', ['namespace' => 'App\Controllers\Manage'], function ($routes) {
|
||||
$routes->get('failed', 'WorkerLogController::failedList');
|
||||
$routes->post('retry', 'WorkerLogController::retrySelected');
|
||||
$routes->get('detail/(:num)', 'WorkerLogController::detail/$1');
|
||||
});
|
||||
@@ -6,5 +6,5 @@ use CodeIgniter\Router\RouteCollection;
|
||||
/** @var RouteCollection $routes */
|
||||
|
||||
$routes->group('kiso', function(RouteCollection $routes) {
|
||||
$routes->match(['get', 'post'], 'api/vrfcReq', 'KisoController::vrfcReq');
|
||||
$routes->match(['GET', 'POST'], 'api/vrfcReq', 'KisoController::vrfcReq');
|
||||
});
|
||||
@@ -4,7 +4,7 @@ namespace Config;
|
||||
|
||||
use CodeIgniter\Config\BaseConfig;
|
||||
use CodeIgniter\Session\Handlers\BaseHandler;
|
||||
use CodeIgniter\Session\Handlers\FileHandler;
|
||||
use CodeIgniter\Session\Handlers\DatabaseHandler;
|
||||
use CodeIgniter\Session\Handlers\RedisHandler;
|
||||
|
||||
class Session extends BaseConfig
|
||||
@@ -15,14 +15,11 @@ class Session extends BaseConfig
|
||||
* --------------------------------------------------------------------------
|
||||
*
|
||||
* The session storage driver to use:
|
||||
* - `CodeIgniter\Session\Handlers\FileHandler`
|
||||
* - `CodeIgniter\Session\Handlers\DatabaseHandler`
|
||||
* - `CodeIgniter\Session\Handlers\MemcachedHandler`
|
||||
* - `CodeIgniter\Session\Handlers\RedisHandler`
|
||||
*
|
||||
* @var class-string<BaseHandler>
|
||||
*/
|
||||
// public string $driver = FileHandler::class;
|
||||
public string $driver = RedisHandler::class;
|
||||
|
||||
/**
|
||||
@@ -51,16 +48,61 @@ class Session extends BaseConfig
|
||||
*
|
||||
* The location to save sessions to and is driver dependent.
|
||||
*
|
||||
* For the 'files' driver, it's a path to a writable directory.
|
||||
* WARNING: Only absolute paths are supported!
|
||||
*
|
||||
* For the 'database' driver, it's a table name.
|
||||
* Please read up the manual for the format with other session drivers.
|
||||
* For Redis: tcp://host:port?database=n&password=xxx
|
||||
*
|
||||
* IMPORTANT: You are REQUIRED to set a valid save path!
|
||||
*/
|
||||
// public string $savePath = WRITEPATH . 'session';
|
||||
public string $savePath = 'tcp://192.168.10.243:6379?database=0';
|
||||
public string $savePath;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// 환경변수로 강제로 Database 모드 설정 가능 (Redis 장애 시 수동 전환)
|
||||
$forceDatabase = env('SESSION_FORCE_DATABASE', false);
|
||||
|
||||
// Redis 설정: Redis 연결 실패 시 Database로 폴백
|
||||
if ($this->driver === RedisHandler::class && !$forceDatabase) {
|
||||
helper('redis');
|
||||
|
||||
try {
|
||||
// Redis 연결 테스트
|
||||
$testRedis = get_redis_connection('session');
|
||||
|
||||
if (!$testRedis) {
|
||||
throw new \Exception('Redis connection failed');
|
||||
}
|
||||
|
||||
// Redis 정상 - Redis 설정 사용
|
||||
$config = get_redis_config('session');
|
||||
|
||||
$this->savePath = sprintf(
|
||||
'tcp://%s:%s?database=%s',
|
||||
$config['host'],
|
||||
$config['port'],
|
||||
$config['database']
|
||||
);
|
||||
|
||||
if (!empty($config['password'])) {
|
||||
$this->savePath .= '&password=' . $config['password'];
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Redis 실패 - DatabaseHandler로 폴백
|
||||
log_message('warning', 'Session: Redis unavailable (' . $e->getMessage() . '), falling back to DatabaseHandler');
|
||||
$this->driver = DatabaseHandler::class;
|
||||
$this->savePath = 'ci_sessions'; // 테이블 이름
|
||||
}
|
||||
} else {
|
||||
// Database 강제 모드 또는 기본 Database 설정
|
||||
if ($forceDatabase && $this->driver === RedisHandler::class) {
|
||||
log_message('info', 'Session: Forced to use DatabaseHandler (SESSION_FORCE_DATABASE=true)');
|
||||
$this->driver = DatabaseHandler::class;
|
||||
}
|
||||
$this->savePath = 'ci_sessions';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
@@ -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([
|
||||
|
||||
299
app/Controllers/Article/Dept.php
Normal file
299
app/Controllers/Article/Dept.php
Normal 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);
|
||||
}
|
||||
}
|
||||
187
app/Controllers/Article/Dept2.php
Normal file
187
app/Controllers/Article/Dept2.php
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
134
app/Controllers/Article/GroundCnt.php
Normal file
134
app/Controllers/Article/GroundCnt.php
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
248
app/Controllers/Article/Processible.php
Normal file
248
app/Controllers/Article/Processible.php
Normal file
@@ -0,0 +1,248 @@
|
||||
<?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()
|
||||
{
|
||||
log_message('info', '[Processible::saveArea] 진입');
|
||||
|
||||
try {
|
||||
$rows = $this->request->getPost('rows');
|
||||
$rows = json_decode($rows, true);
|
||||
|
||||
if (empty($rows)) {
|
||||
log_message('info', '[Processible::saveArea] 저장가능한 데이터가 없습니다.');
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '저장가능한 데이터가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
// API 형식으로 변환 및 DB 저장
|
||||
$syncSlotData = [];
|
||||
foreach ($rows as $row) {
|
||||
// DB 저장 (API 실패와 무관하게 저장됨)
|
||||
$this->model->saveArea($row);
|
||||
|
||||
// API 데이터 구성
|
||||
$syncSlotData[] = [
|
||||
'baseDate' => $row['sc_date'],
|
||||
'legalDivisionNumber' => $row['region_cd'],
|
||||
'slots' => [
|
||||
'am' => [
|
||||
'max' => (int) $row['am_cnt'],
|
||||
'reserved' => 0
|
||||
],
|
||||
'pm' => [
|
||||
'max' => (int) $row['pm_cnt'],
|
||||
'reserved' => 0
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
log_message('info', '[Processible::saveArea] DB 저장 완료 | Count: ' . count($rows));
|
||||
|
||||
// 네이버 API 슬롯 동기화 시도
|
||||
log_message('info', '[Processible::saveArea] 슬롯 동기화 시작 | Count: ' . count($syncSlotData));
|
||||
$naverClient = new \App\Libraries\NaverApiClient();
|
||||
$apiResponse = $naverClient->syncSiteSlot($syncSlotData);
|
||||
|
||||
// API 응답 에러 체크
|
||||
$hasError = false;
|
||||
$errorMessage = '';
|
||||
|
||||
if ($apiResponse === null) {
|
||||
$hasError = true;
|
||||
$errorMessage = 'API 응답 없음 (null)';
|
||||
} elseif (!empty($apiResponse['error'])) {
|
||||
$hasError = true;
|
||||
$errorType = $apiResponse['error_type'] ?? 'UNKNOWN';
|
||||
$httpCode = $apiResponse['http_code'] ?? 'N/A';
|
||||
$errorMessage = "API Error: {$errorType} (HTTP {$httpCode})";
|
||||
} elseif (isset($apiResponse['http_code']) && $apiResponse['http_code'] >= 400) {
|
||||
$hasError = true;
|
||||
$errorMessage = "HTTP Error: {$apiResponse['http_code']}";
|
||||
}
|
||||
|
||||
// API 에러 발생 시 (DB는 이미 저장됨)
|
||||
if ($hasError) {
|
||||
log_message('error', "[Processible::saveArea] {$errorMessage} | Response: " . json_encode($apiResponse, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '1',
|
||||
'msg' => 'DB 저장은 완료되었으나 네이버 슬롯 동기화에 실패했습니다. 관리자에게 문의하세요.',
|
||||
'error' => $errorMessage,
|
||||
'dbSaved' => true,
|
||||
'syncData' => $syncSlotData,
|
||||
'apiResponse' => $apiResponse
|
||||
]);
|
||||
}
|
||||
|
||||
// 성공
|
||||
log_message('info', '[Processible::saveArea] Naver API 슬롯 동기화 성공 | Response: ' . json_encode($apiResponse, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'dbSaved' => true,
|
||||
'syncData' => $syncSlotData,
|
||||
'apiResponse' => $apiResponse
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
log_message('error', '[Processible::saveArea] 예외 발생: ' . $e->getMessage());
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '처리 중 오류가 발생했습니다: ' . $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
public function saveCount()
|
||||
{
|
||||
try {
|
||||
|
||||
$rows = $this->request->getPost('rows');
|
||||
$rows = json_decode($rows, true);
|
||||
|
||||
if (count($rows) > 0) {
|
||||
|
||||
$results = [];
|
||||
$hasError = false;
|
||||
|
||||
foreach ($rows as $row):
|
||||
$result = $this->model->saveCount($row);
|
||||
$results[] = $result;
|
||||
|
||||
if (!$result['success']) {
|
||||
$hasError = true;
|
||||
}
|
||||
endforeach;
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => $hasError ? '9' : '0',
|
||||
'msg' => $hasError ? '일부 저장 실패' : 'success',
|
||||
'debug' => $results // 디버깅 정보 포함
|
||||
]);
|
||||
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '저장가능한 데이터가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
1459
app/Controllers/Article/Receipt.php
Normal file
1459
app/Controllers/Article/Receipt.php
Normal file
File diff suppressed because it is too large
Load Diff
145
app/Controllers/Article/Receipt2.php
Normal file
145
app/Controllers/Article/Receipt2.php
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
152
app/Controllers/Article/Record.php
Normal file
152
app/Controllers/Article/Record.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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 = [];
|
||||
|
||||
@@ -4,16 +4,19 @@ namespace App\Controllers\Common;
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\common\CommonModel;
|
||||
use App\Models\manage\UserModel;
|
||||
use App\Libraries\NaverApiClient;
|
||||
|
||||
|
||||
class Common extends BaseController
|
||||
{
|
||||
private $model;
|
||||
private $userModel;
|
||||
private $naverApiClient;
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new CommonModel();
|
||||
$this->userModel = new UserModel();
|
||||
$this->naverApiClient = new NaverApiClient();
|
||||
}
|
||||
|
||||
public function getVrfcCode()
|
||||
@@ -118,4 +121,54 @@ class Common extends BaseController
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 단지 조회
|
||||
public function getComplexList()
|
||||
{
|
||||
$legalDivisionNumber = $this->request->getGet("legalDivisionNumber");
|
||||
$realEstateType = $this->request->getGet("realEstateType") ?? null;
|
||||
|
||||
try {
|
||||
$complexList = $this->naverApiClient->getComplexList($legalDivisionNumber , $realEstateType);
|
||||
|
||||
return $this->response->setJSON($complexList);
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 평형 조회
|
||||
*
|
||||
* complexNumber : 단지 번호
|
||||
* realEstateType : 매물 종류 (APT, OFFICETEL, VILLA 등)
|
||||
*/
|
||||
public function getPyeongInfo()
|
||||
{
|
||||
$complexNumber = $this->request->getGet("complexNumber");
|
||||
$realEstateType = $this->request->getGet("realEstateType");
|
||||
try {
|
||||
|
||||
if ( $realEstateType == 'A01' || $realEstateType == 'A02' || $realEstateType == 'A03' ) {
|
||||
$pyeongInfo = $this->naverApiClient->getPyeongTypeList($complexNumber);
|
||||
} else if ( $realEstateType == 'A05' || $realEstateType == 'A06' ) {
|
||||
$pyeongInfo = $this->naverApiClient->getVillaPyeongTypeList($complexNumber);
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '지원하지 않는 매물 종류입니다.',
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->response->setJSON($pyeongInfo);
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
app/Controllers/Interest/Rates.php
Normal file
40
app/Controllers/Interest/Rates.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,6 +13,23 @@ class KisoController extends BaseController
|
||||
/** @var ResponseInterface */
|
||||
protected $response;
|
||||
|
||||
/**
|
||||
* 네이버 검증 요청 API
|
||||
*
|
||||
* Required Parameters:
|
||||
* - articleNumber: 기사 번호
|
||||
* - requestType: 요청 타입 (verify, check, validate)
|
||||
* - requestDatetime: 요청 일시 (YYYY-MM-DD HH:MM:SS)
|
||||
*
|
||||
* Error Codes:
|
||||
* - E001: 필수 파라미터 누락
|
||||
* - E002: requestType 값 오류
|
||||
* - E003: requestDatetime 형식 오류
|
||||
* - E005: HTTP 메소드 오류
|
||||
* - E999: Redis 연결 오류
|
||||
*
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function vrfcReq()
|
||||
{
|
||||
// 1. 요청 방식에 따라 데이터 파싱
|
||||
@@ -25,56 +42,79 @@ class KisoController extends BaseController
|
||||
} else {
|
||||
// 지원하지 않는 메소드 처리 (예: PUT, DELETE 등)
|
||||
return $this->response->setStatusCode(Response::HTTP_METHOD_NOT_ALLOWED)
|
||||
->setJSON(['resultCode' => 'E005', 'resultMessage' => 'Method not allowed. Use GET or POST.']);
|
||||
->setJSON(['code' => 'E005', 'message' => 'Method not allowed. Use GET or POST.']);
|
||||
}
|
||||
|
||||
// 2. 필수 항목 검증
|
||||
$requiredKeys = ['articleNumber', 'requestType', 'requestDatetime'];
|
||||
|
||||
foreach ($requiredKeys as $key) {
|
||||
// 파싱된 데이터($data) 내에 키가 없거나 값이 비어있는지 확인
|
||||
if (empty($data[$key])) {
|
||||
// isset()과 trim()을 사용하여 '0' 값도 허용
|
||||
if (!isset($data[$key]) || trim((string)$data[$key]) === '') {
|
||||
return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST)
|
||||
->setJSON([
|
||||
'resultCode' => 'E001',
|
||||
'resultMessage' => "Missing required parameter: {$key}"
|
||||
'code' => 'E001',
|
||||
'message' => "Missing required parameter: {$key}"
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Redis 연결 및 예외 처리
|
||||
// 3. Redis 연결 및 직접 푸시
|
||||
try {
|
||||
$redis = new \Redis();
|
||||
// Docker 환경이므로 host를 'redis'로 설정
|
||||
$success = $redis->connect('redis', 6379);
|
||||
|
||||
if (!$success) {
|
||||
// 3. requestType 값 검증
|
||||
$validRequestTypes = ['verify', 'check', 'validate']; // 허용되는 requestType 값
|
||||
if (!in_array($data['requestType'], $validRequestTypes, true)) {
|
||||
return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST)
|
||||
->setJSON([
|
||||
'code' => 'E002',
|
||||
'message' => "Invalid requestType. Allowed values: " . implode(', ', $validRequestTypes)
|
||||
]);
|
||||
}
|
||||
|
||||
// 4. requestDatetime 날짜 형식 검증 (Y-m-d H:i:s 형식)
|
||||
$datetime = \DateTime::createFromFormat('Y-m-d H:i:s', $data['requestDatetime']);
|
||||
if (!$datetime || $datetime->format('Y-m-d H:i:s') !== $data['requestDatetime']) {
|
||||
return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST)
|
||||
->setJSON([
|
||||
'code' => 'E003',
|
||||
'message' => "Invalid requestDatetime format. Use: YYYY-MM-DD HH:MM:SS"
|
||||
]);
|
||||
}
|
||||
|
||||
// 5. Redis 연결 및 큐 저장
|
||||
helper('redis');
|
||||
try {
|
||||
$redis = get_redis_connection('worker');
|
||||
|
||||
if (!$redis) {
|
||||
throw new \Exception('Redis connection failed');
|
||||
}
|
||||
|
||||
$redis->select(10); // 10번 DB 선택
|
||||
|
||||
// 데이터 준비
|
||||
$data['retry_count'] = 0;
|
||||
$data['received_at'] = date('Y-m-d H:i:s');
|
||||
|
||||
// 리스트에 데이터 삽입 (이 명령어가 실행되어야 monitor에 LPUSH가 뜹니다)
|
||||
$redis->lPush('naver:queue', json_encode($data));
|
||||
// 리스트에 데이터 삽입
|
||||
$pushResult = $redis->lPush('naver:queue', json_encode($data));
|
||||
|
||||
if (!$pushResult) {
|
||||
throw new \Exception('Failed to push data to Redis queue');
|
||||
}
|
||||
|
||||
// 성공 로그 기록
|
||||
log_message('info', "Request queued successfully - Article: {$data['articleNumber']}, Type: {$data['requestType']}");
|
||||
|
||||
} catch (\Exception $e) {
|
||||
log_message('error', 'Redis Push Error: ' . $e->getMessage());
|
||||
return $this->response->setStatusCode(500)->setJSON([
|
||||
'resultCode' => 'E999',
|
||||
'resultMessage' => 'Redis Connection Error'
|
||||
'code' => 'E999',
|
||||
'message' => 'Redis Connection Error'
|
||||
]);
|
||||
}
|
||||
|
||||
// 4. 성공 응답
|
||||
return $this->response->setStatusCode(Response::HTTP_ACCEPTED) // 202 Accepted
|
||||
// 6. 성공 응답
|
||||
return $this->response->setStatusCode(Response::HTTP_OK) // 200 OK
|
||||
->setJSON([
|
||||
'resultCode' => 'S000',
|
||||
'resultMessage' => 'Request successfully queued for processing',
|
||||
'articleNumber' => $data['articleNumber']
|
||||
'code' => 'success',
|
||||
'message' => ''
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
27
app/Controllers/LogTest.php
Normal file
27
app/Controllers/LogTest.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers;
|
||||
|
||||
class LogTest extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
log_message('error', '===== WEB LOG TEST ===== ' . date('Y-m-d H:i:s'));
|
||||
log_message('info', 'Info from web');
|
||||
log_message('debug', 'Debug from web');
|
||||
|
||||
$logFile = WRITEPATH . 'logs/log-' . date('Y-m-d') . '.log';
|
||||
|
||||
echo "ENVIRONMENT: " . ENVIRONMENT . "<br>";
|
||||
echo "Log file: " . $logFile . "<br>";
|
||||
echo "Exists: " . (file_exists($logFile) ? 'YES' : 'NO') . "<br>";
|
||||
echo "Writable: " . (is_writable(dirname($logFile)) ? 'YES' : 'NO') . "<br>";
|
||||
|
||||
if (file_exists($logFile)) {
|
||||
echo "<h3>Last 20 lines:</h3>";
|
||||
echo "<pre>";
|
||||
echo htmlspecialchars(shell_exec('tail -20 ' . escapeshellarg($logFile)));
|
||||
echo "</pre>";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ namespace App\Controllers;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\common\LoginModel;
|
||||
use CodeIgniter\Session\Handlers\DatabaseHandler;
|
||||
|
||||
class Login extends BaseController
|
||||
{
|
||||
@@ -13,9 +14,47 @@ class Login extends BaseController
|
||||
$this->loginModel = new LoginModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Redis 폴백 상태 체크 (세션이 DatabaseHandler로 동작 중인지)
|
||||
*/
|
||||
private function getSystemStatus(): array
|
||||
{
|
||||
$status = [
|
||||
'redis_fallback' => false,
|
||||
'warning_message' => ''
|
||||
];
|
||||
|
||||
// Session 설정에서 현재 드라이버 확인
|
||||
$sessionConfig = config('Session');
|
||||
if ($sessionConfig->driver === DatabaseHandler::class) {
|
||||
$status['redis_fallback'] = true;
|
||||
$status['warning_message'] = '세션 서버(Redis) 장애로 임시 모드로 운영 중입니다. 시스템 관리자에게 문의하세요.';
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON 응답에 시스템 상태 추가
|
||||
*/
|
||||
private function jsonResponse(array $data): \CodeIgniter\HTTP\ResponseInterface
|
||||
{
|
||||
$systemStatus = $this->getSystemStatus();
|
||||
$data['system'] = $systemStatus;
|
||||
|
||||
return $this->response->setJSON($data);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// 로그인
|
||||
@@ -52,7 +91,7 @@ class Login extends BaseController
|
||||
];
|
||||
|
||||
if (!$this->validate($rules)) {
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'errors' => $this->validator->getErrors()
|
||||
]);
|
||||
@@ -63,6 +102,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);
|
||||
@@ -74,7 +114,7 @@ class Login extends BaseController
|
||||
|
||||
$this->loginModel->insertUserLog($logs);
|
||||
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'msg' => '존재하지 않는 아이디입니다.'
|
||||
]);
|
||||
@@ -88,7 +128,7 @@ class Login extends BaseController
|
||||
|
||||
$this->loginModel->insertUserLog($logs);
|
||||
|
||||
return $this->response->setJSON(body: [
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'msg' => '잘못된 비밀번호 입니다.'
|
||||
]);
|
||||
@@ -111,6 +151,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'] = '로그인 성공';
|
||||
@@ -119,7 +167,7 @@ class Login extends BaseController
|
||||
|
||||
$this->session->set($newdata);
|
||||
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
@@ -132,7 +180,17 @@ class Login extends BaseController
|
||||
log_message('error', '[LOGIN ERROR] ' . $e->getMessage());
|
||||
log_message('error', $e->getTraceAsString());
|
||||
|
||||
return $this->response->setJSON([
|
||||
// 세션 관련 에러인지 확인
|
||||
$errorMessage = $e->getMessage();
|
||||
if (stripos($errorMessage, 'session') !== false ||
|
||||
stripos($errorMessage, 'redis') !== false) {
|
||||
return $this->jsonResponse([
|
||||
'code' => '8',
|
||||
'msg' => '세션 서비스 오류입니다. 시스템 관리자에게 문의해주세요.'
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->jsonResponse([
|
||||
'code' => '9',
|
||||
'msg' => '서버 내부 오류가 발생했습니다. 잠시 후 다시 시도해주세요.'
|
||||
]);
|
||||
@@ -143,7 +201,9 @@ class Login extends BaseController
|
||||
public function out()
|
||||
{
|
||||
$this->session->destroy();
|
||||
return redirect()->to('/login');
|
||||
return redirect()
|
||||
->to('/login')
|
||||
->deleteCookie('save_id');
|
||||
}
|
||||
|
||||
|
||||
|
||||
222
app/Controllers/Manage/WorkerLog.php
Normal file
222
app/Controllers/Manage/WorkerLog.php
Normal file
@@ -0,0 +1,222 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Manage;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
|
||||
class WorkerLog extends BaseController
|
||||
{
|
||||
/**
|
||||
* Worker 로그 통합 뷰어
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->data['title'] = 'Worker 로그 통합 관리';
|
||||
|
||||
// 로그 디렉토리 목록
|
||||
$logDirs = [
|
||||
'api_receiver' => ROOTPATH . 'worker/logs',
|
||||
'naver_worker' => WRITEPATH . 'logs/worker'
|
||||
];
|
||||
|
||||
// 날짜 필터 (기본값: 오늘)
|
||||
$date = $this->request->getGet('date') ?? date('Y-m-d');
|
||||
$logType = $this->request->getGet('type') ?? 'all';
|
||||
|
||||
$logs = [];
|
||||
|
||||
// API Receiver 로그 읽기
|
||||
if ($logType === 'all' || $logType === 'api_receiver') {
|
||||
$apiLogFile = $logDirs['api_receiver'] . '/' . $date . '.log';
|
||||
if (file_exists($apiLogFile)) {
|
||||
$logs['api_receiver'] = $this->parseLogFile($apiLogFile);
|
||||
}
|
||||
}
|
||||
|
||||
// Naver Worker 로그 읽기
|
||||
if ($logType === 'all' || $logType === 'naver_worker') {
|
||||
$workerLogFile = $logDirs['naver_worker'] . '/' . $date . '.log';
|
||||
if (file_exists($workerLogFile)) {
|
||||
$logs['naver_worker'] = $this->parseLogFile($workerLogFile);
|
||||
}
|
||||
|
||||
// Failed 로그도 읽기
|
||||
$failedLogFile = $logDirs['naver_worker'] . '/' . $date . '_failed.log';
|
||||
if (file_exists($failedLogFile)) {
|
||||
$logs['naver_worker_failed'] = $this->parseLogFile($failedLogFile);
|
||||
}
|
||||
}
|
||||
|
||||
// 모든 로그를 시간순으로 통합 정렬
|
||||
$allLogs = [];
|
||||
foreach ($logs as $type => $entries) {
|
||||
foreach ($entries as $entry) {
|
||||
$entry['source'] = $type;
|
||||
$allLogs[] = $entry;
|
||||
}
|
||||
}
|
||||
|
||||
// 시간 역순 정렬 (최신순)
|
||||
usort($allLogs, function($a, $b) {
|
||||
return strtotime($b['timestamp']) - strtotime($a['timestamp']);
|
||||
});
|
||||
|
||||
$this->data['logs'] = $allLogs;
|
||||
$this->data['date'] = $date;
|
||||
$this->data['logType'] = $logType;
|
||||
$this->data['logDirs'] = $logDirs;
|
||||
|
||||
// 사용 가능한 날짜 목록 (최근 30일)
|
||||
$this->data['availableDates'] = $this->getAvailableLogDates($logDirs);
|
||||
|
||||
return view('pages/manage/worker_log', $this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 파일 파싱
|
||||
*/
|
||||
private function parseLogFile($filePath)
|
||||
{
|
||||
$logs = [];
|
||||
$lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$logs[] = $this->parseLogLine($line);
|
||||
}
|
||||
|
||||
return $logs;
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 한 줄 파싱
|
||||
*/
|
||||
private function parseLogLine($line)
|
||||
{
|
||||
// 로그 포맷: [2025-12-22 10:30:45] [INFO] [NaverWorker::run:95] 메시지
|
||||
if (preg_match('/\[(.+?)\]\s*\[(.+?)\]\s*(?:\[(.+?)\]\s*)?(.+)/', $line, $matches)) {
|
||||
return [
|
||||
'timestamp' => $matches[1],
|
||||
'level' => $matches[2],
|
||||
'location' => $matches[3] ?? '',
|
||||
'message' => $matches[4]
|
||||
];
|
||||
}
|
||||
|
||||
// 파싱 실패한 경우 원본 그대로
|
||||
return [
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'level' => 'UNKNOWN',
|
||||
'location' => '',
|
||||
'message' => $line
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 파일이 존재하는 날짜 목록 가져오기
|
||||
*/
|
||||
private function getAvailableLogDates($logDirs)
|
||||
{
|
||||
$dates = [];
|
||||
|
||||
foreach ($logDirs as $dir) {
|
||||
if (!is_dir($dir)) continue;
|
||||
|
||||
$files = scandir($dir);
|
||||
foreach ($files as $file) {
|
||||
if (preg_match('/(\d{4}-\d{2}-\d{2})(?:_failed)?\.log$/', $file, $matches)) {
|
||||
$dates[$matches[1]] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$dates = array_keys($dates);
|
||||
rsort($dates); // 최신순 정렬
|
||||
|
||||
return array_slice($dates, 0, 30); // 최근 30일만
|
||||
}
|
||||
|
||||
/**
|
||||
* 실시간 로그 스트리밍 (Ajax)
|
||||
*/
|
||||
public function stream()
|
||||
{
|
||||
$type = $this->request->getGet('type') ?? 'naver_worker';
|
||||
$lastId = (int) ($this->request->getGet('lastId') ?? 0);
|
||||
|
||||
$logDirs = [
|
||||
'api_receiver' => ROOTPATH . 'worker/logs',
|
||||
'naver_worker' => WRITEPATH . 'logs/worker'
|
||||
];
|
||||
|
||||
$logFile = $logDirs[$type] . '/' . date('Y-m-d') . '.log';
|
||||
|
||||
$newLogs = [];
|
||||
if (file_exists($logFile)) {
|
||||
$lines = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
|
||||
// lastId 이후의 로그만 반환
|
||||
if ($lastId < count($lines)) {
|
||||
$newLines = array_slice($lines, $lastId);
|
||||
|
||||
foreach ($newLines as $line) {
|
||||
$newLogs[] = $this->parseLogLine($line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'logs' => $newLogs,
|
||||
'lastId' => $lastId + count($newLogs)
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 파일 다운로드
|
||||
*/
|
||||
public function download()
|
||||
{
|
||||
$date = $this->request->getGet('date') ?? date('Y-m-d');
|
||||
$type = $this->request->getGet('type') ?? 'naver_worker';
|
||||
|
||||
$logDirs = [
|
||||
'api_receiver' => ROOTPATH . 'worker/logs',
|
||||
'naver_worker' => WRITEPATH . 'logs/worker'
|
||||
];
|
||||
|
||||
$logFile = $logDirs[$type] . '/' . $date . '.log';
|
||||
|
||||
if (!file_exists($logFile)) {
|
||||
return $this->response->setStatusCode(404)->setBody('로그 파일을 찾을 수 없습니다.');
|
||||
}
|
||||
|
||||
return $this->response->download($logFile, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 로그 파일 삭제
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
$date = $this->request->getPost('date');
|
||||
$type = $this->request->getPost('type');
|
||||
|
||||
if (!$date || !$type) {
|
||||
return $this->response->setJSON(['success' => false, 'message' => '필수 파라미터 누락']);
|
||||
}
|
||||
|
||||
$logDirs = [
|
||||
'api_receiver' => ROOTPATH . 'worker/logs',
|
||||
'naver_worker' => WRITEPATH . 'logs/worker'
|
||||
];
|
||||
|
||||
$logFile = $logDirs[$type] . '/' . $date . '.log';
|
||||
|
||||
if (file_exists($logFile)) {
|
||||
unlink($logFile);
|
||||
return $this->response->setJSON(['success' => true, 'message' => '로그 파일이 삭제되었습니다.']);
|
||||
}
|
||||
|
||||
return $this->response->setJSON(['success' => false, 'message' => '로그 파일을 찾을 수 없습니다.']);
|
||||
}
|
||||
}
|
||||
366
app/Controllers/Manage/WorkerLogController.php
Normal file
366
app/Controllers/Manage/WorkerLogController.php
Normal file
@@ -0,0 +1,366 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Manage;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\Entities\NaverWorkerLogModel;
|
||||
|
||||
class WorkerLogController extends BaseController
|
||||
{
|
||||
protected $logModel;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->logModel = new NaverWorkerLogModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 실패 로그 목록 (오류 유형별 분석)
|
||||
*/
|
||||
public function failedList()
|
||||
{
|
||||
$db = \Config\Database::connect();
|
||||
|
||||
// 1. 전체 통계
|
||||
$stats = [
|
||||
'total_fail' => $this->logModel->where('status', 'FAIL')->countAllResults(false),
|
||||
'retry_available' => $this->logModel
|
||||
->where('status', 'FAIL')
|
||||
->groupStart()
|
||||
->where('retry_cnt IS NULL')
|
||||
->orWhere('retry_cnt <', 3)
|
||||
->groupEnd()
|
||||
->countAllResults(false),
|
||||
'retry_exhausted' => $this->logModel
|
||||
->where('status', 'FAIL')
|
||||
->where('retry_cnt >=', 3)
|
||||
->countAllResults(false),
|
||||
];
|
||||
|
||||
// 2. 오류 유형별 분류
|
||||
$errorTypes = $this->classifyErrors();
|
||||
|
||||
// 3. 최근 실패 목록
|
||||
$recentFails = $this->logModel
|
||||
->select('seq, atcl_no, status, error_msg, retry_cnt, created_at')
|
||||
->where('status', 'FAIL')
|
||||
->orderBy('created_at', 'DESC')
|
||||
->findAll(50);
|
||||
|
||||
// 각 오류에 대한 해결 가이드 추가
|
||||
foreach ($recentFails as &$log) {
|
||||
$log['error_type'] = $this->detectErrorType($log['error_msg']);
|
||||
$log['solution'] = $this->getSolution($log['error_type']);
|
||||
$log['can_retry'] = $this->canRetry($log);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'stats' => $stats,
|
||||
'errorTypes' => $errorTypes,
|
||||
'logs' => $recentFails
|
||||
];
|
||||
|
||||
return view('manage/worker_log/failed_list', array_merge($this->data, $data));
|
||||
}
|
||||
|
||||
/**
|
||||
* 오류 유형 분류
|
||||
*/
|
||||
protected function classifyErrors()
|
||||
{
|
||||
$db = \Config\Database::connect();
|
||||
|
||||
$errorPatterns = [
|
||||
'foreign_key' => [
|
||||
'pattern' => 'foreign key constraint',
|
||||
'label' => 'FK 제약조건 위반',
|
||||
'severity' => 'high',
|
||||
'count' => 0
|
||||
],
|
||||
'duplicate' => [
|
||||
'pattern' => 'Duplicate entry',
|
||||
'label' => '중복 데이터',
|
||||
'severity' => 'medium',
|
||||
'count' => 0
|
||||
],
|
||||
'missing_user' => [
|
||||
'pattern' => 'usr_sq.*users 테이블에 없음',
|
||||
'label' => '담당자 정보 없음',
|
||||
'severity' => 'medium',
|
||||
'count' => 0
|
||||
],
|
||||
'empty_payload' => [
|
||||
'pattern' => '빈 페이로드',
|
||||
'label' => '빈 데이터',
|
||||
'severity' => 'low',
|
||||
'count' => 0
|
||||
],
|
||||
'api_error' => [
|
||||
'pattern' => 'API.*FAIL|HTTP.*40[0-9]|HTTP.*50[0-9]',
|
||||
'label' => 'API 통신 오류',
|
||||
'severity' => 'medium',
|
||||
'count' => 0
|
||||
],
|
||||
'unknown' => [
|
||||
'pattern' => '',
|
||||
'label' => '기타 오류',
|
||||
'severity' => 'low',
|
||||
'count' => 0
|
||||
]
|
||||
];
|
||||
|
||||
$failedLogs = $this->logModel
|
||||
->select('error_msg')
|
||||
->where('status', 'FAIL')
|
||||
->findAll();
|
||||
|
||||
foreach ($failedLogs as $log) {
|
||||
$classified = false;
|
||||
|
||||
foreach ($errorPatterns as $key => &$pattern) {
|
||||
if ($key === 'unknown') continue;
|
||||
|
||||
if ($pattern['pattern'] && preg_match('/' . $pattern['pattern'] . '/i', $log['error_msg'])) {
|
||||
$pattern['count']++;
|
||||
$classified = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$classified) {
|
||||
$errorPatterns['unknown']['count']++;
|
||||
}
|
||||
}
|
||||
|
||||
return $errorPatterns;
|
||||
}
|
||||
|
||||
/**
|
||||
* 오류 유형 감지
|
||||
*/
|
||||
protected function detectErrorType($errorMsg)
|
||||
{
|
||||
if (!$errorMsg) return 'unknown';
|
||||
|
||||
if (stripos($errorMsg, 'foreign key constraint') !== false) {
|
||||
return 'foreign_key';
|
||||
}
|
||||
if (stripos($errorMsg, 'Duplicate entry') !== false) {
|
||||
return 'duplicate';
|
||||
}
|
||||
if (stripos($errorMsg, 'usr_sq') !== false && stripos($errorMsg, 'users 테이블') !== false) {
|
||||
return 'missing_user';
|
||||
}
|
||||
if (stripos($errorMsg, '빈 페이로드') !== false) {
|
||||
return 'empty_payload';
|
||||
}
|
||||
if (preg_match('/API.*FAIL|HTTP.*40[0-9]|HTTP.*50[0-9]/i', $errorMsg)) {
|
||||
return 'api_error';
|
||||
}
|
||||
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* 오류 유형별 해결 방법
|
||||
*/
|
||||
protected function getSolution($errorType)
|
||||
{
|
||||
$solutions = [
|
||||
'foreign_key' => [
|
||||
'title' => 'DB 데이터 수정 필요',
|
||||
'steps' => [
|
||||
'1. 참조하는 테이블의 데이터가 존재하는지 확인',
|
||||
'2. region 테이블의 orphaned usr_sq 값 수정',
|
||||
'3. TypeSParameterMapper의 폴백 로직 확인'
|
||||
],
|
||||
'auto_retry' => false
|
||||
],
|
||||
'duplicate' => [
|
||||
'title' => '중복 데이터 처리',
|
||||
'steps' => [
|
||||
'1. 기존 데이터 확인 (atcl_no로 검색)',
|
||||
'2. 중복 원인 파악 (동일 요청 2회 수신?)',
|
||||
'3. 필요시 기존 데이터 삭제 후 재처리'
|
||||
],
|
||||
'auto_retry' => false
|
||||
],
|
||||
'missing_user' => [
|
||||
'title' => '담당자 정보 수정됨 - 재처리 가능',
|
||||
'steps' => [
|
||||
'✅ TypeSParameterMapper가 자동 폴백 적용됨',
|
||||
'✅ 바로 재처리 가능 (usr_sq=1로 처리됨)'
|
||||
],
|
||||
'auto_retry' => true
|
||||
],
|
||||
'empty_payload' => [
|
||||
'title' => '잘못된 요청 데이터',
|
||||
'steps' => [
|
||||
'1. raw_payload 확인',
|
||||
'2. 네이버 API 응답 확인',
|
||||
'3. 재처리 불가 - 데이터 삭제 권장'
|
||||
],
|
||||
'auto_retry' => false
|
||||
],
|
||||
'api_error' => [
|
||||
'title' => 'API 통신 오류',
|
||||
'steps' => [
|
||||
'1. 일시적 오류인지 확인 (네트워크, 타임아웃)',
|
||||
'2. 네이버 API 서버 상태 확인',
|
||||
'3. 일시적 오류면 재처리 가능'
|
||||
],
|
||||
'auto_retry' => true
|
||||
],
|
||||
'unknown' => [
|
||||
'title' => '원인 미상',
|
||||
'steps' => [
|
||||
'1. error_msg 상세 확인',
|
||||
'2. 로그 파일 확인',
|
||||
'3. 개발팀 검토 필요'
|
||||
],
|
||||
'auto_retry' => false
|
||||
]
|
||||
];
|
||||
|
||||
return $solutions[$errorType] ?? $solutions['unknown'];
|
||||
}
|
||||
|
||||
/**
|
||||
* 재시도 가능 여부
|
||||
*/
|
||||
protected function canRetry($log)
|
||||
{
|
||||
// 재시도 횟수 체크
|
||||
if (($log['retry_cnt'] ?? 0) >= 3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 오류 유형별 재시도 가능 여부
|
||||
$errorType = $this->detectErrorType($log['error_msg']);
|
||||
$solution = $this->getSolution($errorType);
|
||||
|
||||
return $solution['auto_retry'] ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 선택한 로그 재처리 (AJAX)
|
||||
*/
|
||||
public function retrySelected()
|
||||
{
|
||||
$logIds = $this->request->getPost('log_ids');
|
||||
|
||||
if (empty($logIds) || !is_array($logIds)) {
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => '재처리할 로그를 선택해주세요.'
|
||||
]);
|
||||
}
|
||||
|
||||
$naverService = new \App\Services\NaverService();
|
||||
$results = [
|
||||
'success' => 0,
|
||||
'fail' => 0,
|
||||
'details' => []
|
||||
];
|
||||
|
||||
foreach ($logIds as $logId) {
|
||||
$log = $this->logModel->find($logId);
|
||||
|
||||
if (!$log) {
|
||||
$results['details'][] = [
|
||||
'id' => $logId,
|
||||
'status' => 'error',
|
||||
'message' => '로그를 찾을 수 없습니다.'
|
||||
];
|
||||
continue;
|
||||
}
|
||||
|
||||
// 재시도 가능 여부 체크
|
||||
if (!$this->canRetry($log)) {
|
||||
$results['details'][] = [
|
||||
'id' => $logId,
|
||||
'atcl_no' => $log['atcl_no'],
|
||||
'status' => 'skip',
|
||||
'message' => '재시도 불가능 (횟수 초과 또는 수정 필요)'
|
||||
];
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
// 재처리
|
||||
$this->logModel->update($logId, ['status' => 'RETRY']);
|
||||
|
||||
$responseJson = json_decode($log['raw_payload'], true);
|
||||
$payload = $responseJson['request_data'] ?? [];
|
||||
|
||||
if (empty($payload)) {
|
||||
throw new \Exception("빈 페이로드 데이터");
|
||||
}
|
||||
|
||||
$insertId = $naverService->processArticle($payload);
|
||||
|
||||
$this->logModel->update($logId, [
|
||||
'atcl_no' => $payload['articleNumber'] ?? null,
|
||||
'status' => 'SUCCESS',
|
||||
'target_db_id' => $insertId,
|
||||
'error_msg' => null,
|
||||
'retry_cnt' => ($log['retry_cnt'] ?? 0) + 1
|
||||
]);
|
||||
|
||||
$results['success']++;
|
||||
$results['details'][] = [
|
||||
'id' => $logId,
|
||||
'atcl_no' => $log['atcl_no'],
|
||||
'status' => 'success',
|
||||
'message' => "성공 (DB ID: {$insertId})"
|
||||
];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$this->logModel->update($logId, [
|
||||
'status' => 'FAIL',
|
||||
'error_msg' => $e->getMessage(),
|
||||
'retry_cnt' => ($log['retry_cnt'] ?? 0) + 1
|
||||
]);
|
||||
|
||||
$results['fail']++;
|
||||
$results['details'][] = [
|
||||
'id' => $logId,
|
||||
'atcl_no' => $log['atcl_no'],
|
||||
'status' => 'fail',
|
||||
'message' => $e->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'results' => $results
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 로그 상세 (AJAX)
|
||||
*/
|
||||
public function detail($id)
|
||||
{
|
||||
$log = $this->logModel->find($id);
|
||||
|
||||
if (!$log) {
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => '로그를 찾을 수 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
// raw_payload JSON 파싱
|
||||
$log['parsed_payload'] = json_decode($log['raw_payload'], true);
|
||||
$log['error_type'] = $this->detectErrorType($log['error_msg']);
|
||||
$log['solution'] = $this->getSolution($log['error_type']);
|
||||
$log['can_retry'] = $this->canRetry($log);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'log' => $log
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -31,6 +31,7 @@ class Assign extends BaseController
|
||||
{
|
||||
$start = (int) $this->request->getGet('start') ?: 0;
|
||||
$end = (int) $this->request->getGet('length') ?: 10;
|
||||
$draw = (int) $this->request->getGet('draw') ?: 1;
|
||||
|
||||
$data = [
|
||||
'bonbu' => $this->request->getGet('bonbu'),
|
||||
@@ -42,12 +43,18 @@ class Assign extends BaseController
|
||||
'srchTxt' => $this->request->getGet('srchTxt'),
|
||||
];
|
||||
|
||||
$totalCount = $this->assignModel->getTotalCount($data);
|
||||
|
||||
|
||||
$datas = $this->assignModel->getUserList($start, $end, $data);
|
||||
|
||||
// 첫 번째 행에서 total_count 추출 (없으면 0)
|
||||
$totalCount = !empty($datas) ? (int)$datas[0]['total_count'] : 0;
|
||||
|
||||
// 각 행에서 total_count 컬럼 제거
|
||||
foreach ($datas as &$row) {
|
||||
unset($row['total_count']);
|
||||
}
|
||||
|
||||
return $this->response->setJSON(body: [
|
||||
'draw' => $draw,
|
||||
'recordsTotal' => $totalCount,
|
||||
'recordsFiltered' => $totalCount,
|
||||
'data' => $datas,
|
||||
|
||||
163
app/Controllers/V2/BaseV2Controller.php
Normal file
163
app/Controllers/V2/BaseV2Controller.php
Normal file
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\common\CodeModel;
|
||||
|
||||
/**
|
||||
* BaseV2Controller
|
||||
* V2 모듈 공통 로직: lists / getResultList / excel
|
||||
*
|
||||
* 하위 클래스에서 구현해야 하는 메서드:
|
||||
* - createModel() : 모듈 전용 Model 인스턴스 반환
|
||||
* - getCodeKeys() : lists()에서 로드할 코드 카테고리 배열 반환
|
||||
* - getViewName() : lists()에서 렌더링할 뷰 경로 반환
|
||||
* - getSearchKeys() : getResultList/excel에서 수집할 GET 파라미터 키 배열 반환
|
||||
*/
|
||||
abstract class BaseV2Controller extends BaseController
|
||||
{
|
||||
protected $model;
|
||||
protected $codeModel;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->codeModel = new CodeModel();
|
||||
$this->model = $this->createModel();
|
||||
}
|
||||
|
||||
abstract protected function createModel();
|
||||
abstract protected function getCodeKeys(): array;
|
||||
abstract protected function getViewName(): string;
|
||||
abstract protected function getSearchKeys(): array;
|
||||
|
||||
public function lists(): string
|
||||
{
|
||||
$codes = $this->codeModel->getCodeLists($this->getCodeKeys());
|
||||
$sido = $this->model->getAreaList();
|
||||
$bonbu = $this->model->getBonbuList();
|
||||
$team = $this->model->getTeamList();
|
||||
$user = $this->model->getUserList();
|
||||
|
||||
$this->data['codes'] = $codes;
|
||||
$this->data['sido'] = $sido;
|
||||
$this->data['bonbu'] = $bonbu;
|
||||
$this->data['team'] = $team;
|
||||
$this->data['user'] = $user;
|
||||
|
||||
return view($this->getViewName(), $this->data);
|
||||
}
|
||||
|
||||
public function getResultList()
|
||||
{
|
||||
$start = (int) $this->request->getGet('start') ?: 0;
|
||||
$end = (int) $this->request->getGet('length') ?: 10;
|
||||
|
||||
$data = $this->buildSearchData();
|
||||
|
||||
$totalCount = $this->model->getTotalCount($data);
|
||||
$datas = $this->model->getResultList($start, $end, $data);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'recordsTotal' => $totalCount,
|
||||
'recordsFiltered' => $totalCount,
|
||||
'data' => $datas,
|
||||
]);
|
||||
}
|
||||
|
||||
public function excel()
|
||||
{
|
||||
try {
|
||||
$data = $this->buildSearchData();
|
||||
$datas = $this->model->getExcelList($data);
|
||||
|
||||
return $this->response->setJSON(['data' => $datas]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$e->getPrevious()->getTraceAsString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* getSearchKeys()에 정의된 키만 GET에서 수집해서 배열로 반환
|
||||
*/
|
||||
protected function buildSearchData(): array
|
||||
{
|
||||
$data = [];
|
||||
foreach ($this->getSearchKeys() as $key) {
|
||||
$rawValue = $this->request->getGet($key);
|
||||
$data[$key] = $this->normalizeSearchValue($key, $rawValue);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통 파라미터 정규화
|
||||
* - null/공백은 빈 문자열로 통일
|
||||
* - 문자열은 trim 처리
|
||||
* - 날짜 키(date 포함)는 형식 검증 실패 시 빈 문자열로 처리
|
||||
*/
|
||||
protected function normalizeSearchValue(string $key, $value)
|
||||
{
|
||||
if (is_array($value)) {
|
||||
return array_map(static function ($item) {
|
||||
if ($item === null) {
|
||||
return '';
|
||||
}
|
||||
if (is_string($item)) {
|
||||
$item = trim($item);
|
||||
return $item === '' ? '' : $item;
|
||||
}
|
||||
return $item;
|
||||
}, $value);
|
||||
}
|
||||
|
||||
if ($value === null) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (is_string($value)) {
|
||||
$value = trim($value);
|
||||
if ($value === '') {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->isDateKey($key) && !$this->isValidDateValue((string) $value)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 날짜 성격 파라미터 판별
|
||||
* 예: receipt_sdate, receipt_edate, complete_sdate, stat_complete_date 등
|
||||
*/
|
||||
protected function isDateKey(string $key): bool
|
||||
{
|
||||
return strpos($key, 'date') !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 허용 날짜 형식 검증
|
||||
* - YYYY-MM-DD
|
||||
* - YYYYMMDD
|
||||
*/
|
||||
protected function isValidDateValue(string $value): bool
|
||||
{
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value) === 1) {
|
||||
[$year, $month, $day] = explode('-', $value);
|
||||
return checkdate((int) $month, (int) $day, (int) $year);
|
||||
}
|
||||
|
||||
if (preg_match('/^\d{8}$/', $value) === 1) {
|
||||
$year = substr($value, 0, 4);
|
||||
$month = substr($value, 4, 2);
|
||||
$day = substr($value, 6, 2);
|
||||
return checkdate((int) $month, (int) $day, (int) $year);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
1151
app/Controllers/V2/M702.php
Normal file
1151
app/Controllers/V2/M702.php
Normal file
File diff suppressed because it is too large
Load Diff
554
app/Controllers/V2/M703.php
Normal file
554
app/Controllers/V2/M703.php
Normal file
@@ -0,0 +1,554 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use App\Models\v2\M703Model;
|
||||
|
||||
class M703 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M703Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['CP_ID', 'STEP_VERIFICATION', 'RECEIPT_STATUS3', 'FAX_CORP'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m703/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'chk_atcl_no',
|
||||
'caller_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'vrfc_type_sub',
|
||||
'target_yn',
|
||||
'rcpt_cpid',
|
||||
'chk_rec',
|
||||
'fax_corp',
|
||||
];
|
||||
}
|
||||
|
||||
public function detail($id)
|
||||
{
|
||||
$naver = new NaverApiClient();
|
||||
$id = (string) $id;
|
||||
|
||||
if ($id === '') {
|
||||
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
||||
$codes = $this->codeModel->getCodeLists(['CONFIRM_RESULT_D11', 'CONSULTANT_COMMENT', 'TRADE_TYPE', 'VRFCREQ_WAY']); // 코드조회
|
||||
|
||||
$data = $this->model->getDetail($id);
|
||||
|
||||
|
||||
$article = null;
|
||||
$confirm = null;
|
||||
if (!empty($data)) {
|
||||
switch ($data['work_type']) {
|
||||
case "1": // 현장확인 매물
|
||||
$article = $this->model->getArticleInfo1($data['atcl_no']);
|
||||
$article['stat_cd'] = $data['stat_cd'];
|
||||
$confirm = $this->model->getV2Confirm($data['vr_sq'], $data['work_type']);
|
||||
break;
|
||||
case "2": // 일반확인 매물
|
||||
$article = $this->model->getArticleInfo2($data['atcl_no']);
|
||||
$confirm = $this->model->getV2Confirm($data['vr_sq']);
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data['article'] = $article;
|
||||
$this->data['confirm'] = $confirm;
|
||||
}
|
||||
|
||||
// 단지번호
|
||||
$hscp_info = [];
|
||||
if (!empty($article['hscp_no'])) {
|
||||
$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 = $naver->aptDetail($article['hscp_no']);
|
||||
}
|
||||
|
||||
if (in_array($article['rlet_type_cd'], $villa_rlet_type_cd)) { // villa 단지
|
||||
$detail_hscp = $naver->villaDetail($article['hscp_no']);
|
||||
}
|
||||
|
||||
$this->data['hscp_info'] = $hscp_info;
|
||||
}
|
||||
|
||||
|
||||
$memo = $this->model->getMomo($data['vr_sq']);
|
||||
$history = $this->model->getHistory($data['vr_sq'], $data['work_type']);
|
||||
|
||||
$this->data['codes'] = $codes;
|
||||
|
||||
$this->data['data'] = $data;
|
||||
$this->data['memo'] = $memo;
|
||||
$this->data['history'] = $history;
|
||||
|
||||
|
||||
|
||||
return view("pages/v2/m703/detail", $this->data);
|
||||
}
|
||||
|
||||
// 현장확인 저장
|
||||
public function saveBunyang()
|
||||
{
|
||||
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');
|
||||
$work_type = '1';
|
||||
$result_d11 = $this->request->getPost('result_d11');
|
||||
$comment_d11 = $this->request->getPost('comment_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_info_1 = $this->request->getPost('fax_conf_info_1');
|
||||
$fax_conf_info_2 = $this->request->getPost('fax_conf_info_2');
|
||||
$fax_conf_info_3 = $this->request->getPost('fax_conf_info_3');
|
||||
|
||||
$resyn = $this->request->getPost('resYn');
|
||||
$dbusageagryn = $this->request->getPost('dbUsageAgrYn');
|
||||
$memo1 = $this->request->getPost('memo_vie'); //메모
|
||||
$memo2 = $this->request->getPost('memo_cal'); //메모
|
||||
|
||||
if (empty($memo1)) {
|
||||
$memo = $memo2;
|
||||
} else {
|
||||
$memo = $memo1;
|
||||
}
|
||||
|
||||
$this->model->saveReceiptFax($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);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 홍보확인서 아님
|
||||
public function saveOthers()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
|
||||
$this->model->saveNotArticleFax($fax_sq);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 중복저장
|
||||
public function saveDuplicate()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
|
||||
$this->model->saveDuplicateFax($fax_sq, $atcl_no, $vr_sq);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 부분수신
|
||||
public function saveBubun()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
|
||||
|
||||
$this->model->saveBubunFax($fax_sq);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 매물정보 변경
|
||||
public function saveFaxImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq'); // 확인요청순번
|
||||
$atcl_no = $this->request->getPost('atcl_no'); // 매물번호
|
||||
$fax_sq = $this->request->getPost('fax_sq'); // fax 순번
|
||||
$trade_type = $this->request->getPost('trade_type'); // 거래구분
|
||||
$deal_amt = $this->request->getPost('deal_amt'); // 매매가
|
||||
$wrrnt_amt = $this->request->getPost('wrrnt_amt'); // 전세가
|
||||
$lease_amt = $this->request->getPost('lease_amt'); // 월세가
|
||||
$isale_amt = $this->request->getPost('isale_amt'); // 분양가
|
||||
$prem_amt = $this->request->getPost('prem_amt'); // 프리미엄
|
||||
|
||||
|
||||
$this->model->saveFaxImgInfo($fax_sq, $vr_sq, $atcl_no, $trade_type, $deal_amt, $wrrnt_amt, $lease_amt, $isale_amt, $prem_amt);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 중개사 요청사항(메모) 저장
|
||||
public function saveRequestMessage()
|
||||
{
|
||||
try {
|
||||
|
||||
$rcpt_sq = $this->request->getPost('vr_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$fax_sq = $this->request->getPost('fax_sq'); // FAX 순번
|
||||
$msg = $this->request->getPost('msg');
|
||||
|
||||
$rsrv_sq = $this->request->getPost('rsrv_sq');
|
||||
|
||||
// UPDATE result
|
||||
$this->model->saveRequestMessage($rcpt_sq, $rsrv_sq, $msg);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 다음 매물정보 조회
|
||||
public function getNextFaxImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$curr_fax_sq = $this->request->getPost('curr_fax_sq');
|
||||
|
||||
$data = $this->model->getNextFaxImgs($curr_fax_sq);
|
||||
|
||||
if (empty($data)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => 'FAX 이미지가 존재하지 않습니다.'
|
||||
]);
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 결과저장
|
||||
public function saveResult()
|
||||
{
|
||||
$naver = new NaverApiClient();
|
||||
|
||||
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');
|
||||
$result_d11 = $this->request->getPost('result_d11');
|
||||
$comment_d11 = $this->request->getPost('comment_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_info_1 = $this->request->getPost('fax_conf_info_1');
|
||||
$fax_conf_info_2 = $this->request->getPost('fax_conf_info_2');
|
||||
$fax_conf_info_3 = $this->request->getPost('fax_conf_info_3');
|
||||
|
||||
$resyn = $this->request->getPost('resYn');
|
||||
$dbusageagryn = $this->request->getPost('dbUsageAgrYn');
|
||||
$memo = $this->request->getPost('memo_cal'); //메모
|
||||
|
||||
$m415 = new M415Model();
|
||||
|
||||
|
||||
$article = $this->model->getArticleInfo2($atcl_no, $vr_sq);
|
||||
$v2_vrfc_req = $this->model->get_v2_vrfc_req($vr_sq);
|
||||
|
||||
$stat = intval($article['stat_cd']);
|
||||
if ($stat > 40) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '이미 저장된 데이터입니다.',
|
||||
]);
|
||||
} else if ($stat == 19) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '해당 매물은 등록 취소된 매물입니다.',
|
||||
]);
|
||||
} else {
|
||||
|
||||
//거주여부 & DB활용동의여부 수정 UPDATE
|
||||
if (!empty($resyn)) {
|
||||
$this->model->updateResDB($resyn, $dbusageagryn, $vr_sq);
|
||||
}
|
||||
|
||||
// DB에 결과를 저장한다.
|
||||
$return = $this->model->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);
|
||||
|
||||
if (empty($return['code']) && $work_type == "2") {
|
||||
// 검증센터에 데이터를 전송한다.
|
||||
$m710Model = new M710Model();
|
||||
$sendData = $this->model->getDataConfirmAPI($vr_sq);
|
||||
|
||||
$h_yn = $this->model->get_send_yn('H');
|
||||
if ($h_yn['stop_yn'] == 'N') { //전송금지
|
||||
//1.해당매물정보를v2_stop_api_save_info에다 넣음
|
||||
$m710Model->insert_v2_stop_api_save_info($sendData['atclNo'], $vr_sq, 'H', $fax_sq);
|
||||
|
||||
//2.아무렇지않게 행동한다
|
||||
$send_result['result'] = 'success';
|
||||
} else {
|
||||
$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 ($fax_conf_info_3 != 'Y' || intval($sendData['try_cnt']) < 1) {
|
||||
$stat_cd = '30';
|
||||
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '의뢰인 정보 불일치로 저장되었습니다.',
|
||||
]);
|
||||
}
|
||||
|
||||
if ($sendData['try_cnt'] >= '1') {
|
||||
$stat_cd = '69'; // 검증실패
|
||||
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경
|
||||
|
||||
//★ 검증실패면 검증실패시간 업데이트하고 검증소요시간, 전체소요시간 산출
|
||||
//1.서류전화 들어온시간
|
||||
$insert_tm = $m415->getFaxSaveTime($vr_sq);
|
||||
//2.서류/전화 불일치 시간
|
||||
$tel_doc_conf_dt = $m415->getFaxFailTimeForHistory($vr_sq);
|
||||
//3.검증실패시간
|
||||
$finishTime = $m415->get_69_ForHistory($vr_sq);
|
||||
//3.해당 정보를 테이블에 넣는다
|
||||
$m415->insert_v2_time_required_Conf_Done($atcl_no, $article['cpid'], $article['vrfc_type'], $insert_tm['recv_time'], $tel_doc_conf_dt['insert_tm'], $finishTime['insert_tm']);
|
||||
|
||||
$this->model->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0302', '1', 'add'); // 최종실패로 저장
|
||||
|
||||
} else {
|
||||
//★ 1차실패니까 검증실패시간 업데이트하고 검증소요시간 산출
|
||||
//1.서류전화 들어온시간
|
||||
$insert_tm = $m415->getFaxSaveTime($vr_sq);
|
||||
//2.서류/전화 불일치 시간
|
||||
$tel_doc_conf_dt = $m415->getFaxFailTimeForHistory($vr_sq);
|
||||
//3.해당 정보를 테이블에 넣는다
|
||||
$sf = 'F';
|
||||
$m415->insert_v2_time_required_Conf($atcl_no, $article['cpid'], $article['vrfc_type'], $insert_tm['recv_time'], $tel_doc_conf_dt['insert_tm'], $sf);
|
||||
|
||||
$this->model->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0301', '1', 'add'); // 1차실패로 저장
|
||||
}
|
||||
|
||||
$this->model->increseTryCnt($vr_sq);
|
||||
|
||||
if ($result_d11 == '20013') {
|
||||
$this->model->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0203', '1', 'add'); // 기타로 저장
|
||||
} else {
|
||||
$this->model->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0202', '1', 'add'); // 불일치로 저장
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
log_message('debug', '703 save stat_cd = 35 start ::: ' . $vr_sq);
|
||||
$stat_cd = '35'; // 서류/전화 확인 성공
|
||||
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 전송완료 상태로 변경
|
||||
|
||||
if ($article['vrfc_type_sub'] == "D2") {
|
||||
log_message('debug', '703 save stat_cd = 35 D2 ::: ' . $vr_sq);
|
||||
$rgbk_confirm = $this->model->getRgbk_confirm($vr_sq);
|
||||
|
||||
if ($rgbk_confirm == '1') {
|
||||
log_message('debug', '703 save stat_cd = 35 rgbk_confirm ::: ' . $vr_sq);
|
||||
if ($this->model->check_chg_stat49($vr_sq)) {
|
||||
log_message('debug', '703 save stat_cd = 40 savechangeStep ::: ' . $vr_sq);
|
||||
$stat_cd = '40';
|
||||
$this->model->saveChangeStep($fax_sq, $vr_sq, $stat_cd); // 등기부등본 확인중 상태로 변경..
|
||||
}
|
||||
|
||||
//★등기 로 넘어갈때
|
||||
//1.서류전화 들어온시간
|
||||
$insert_tm = $m415->getFaxSaveTime($vr_sq);
|
||||
log_message('debug', '703 save stat_cd = 35 insert_tm ::: ' . $insert_tm['recv_time']);
|
||||
//2.서류/전화 확인일자
|
||||
$tel_doc_conf_dt = $m415->get_cert_ing_TimeForHistory($vr_sq);
|
||||
log_message('debug', '703 save stat_cd = 35 tel_doc_conf_dt ::: ' . $tel_doc_conf_dt['insert_tm']);
|
||||
|
||||
//3.해당 정보를 테이블에 넣는다
|
||||
if (empty($tel_doc_conf_dt)) {
|
||||
$tel_doc_conf_dt['insert_tm'] = date("Y-m-d H:i:s");
|
||||
log_message('debug', '703 save stat_cd = 35 tel_doc_conf_dt null ::: ' . $tel_doc_conf_dt['insert_tm']);
|
||||
}
|
||||
|
||||
$sf = 'T';
|
||||
$m415->insert_v2_time_required_Conf($atcl_no, $article['cpid'], $article['vrfc_type'], $insert_tm['recv_time'], $tel_doc_conf_dt['insert_tm'], $sf);
|
||||
log_message('debug', '703 save stat_cd = 35 insert_v2_time_required_Conf ::: ' . json_encode(array($atcl_no, $article['cpid'], $article['vrfc_type'], $insert_tm['recv_time'], $tel_doc_conf_dt['insert_tm'], $sf)));
|
||||
|
||||
$this->model->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); // 검증완료 상태로 변경
|
||||
|
||||
//★검증완료일때
|
||||
//0.불일치 이력이 있는지 확인
|
||||
$cnt = $m415->getFaxFailTimeForHistory($vr_sq);
|
||||
if (empty($cnt)) { //검증완료일땐 불일치가없어야 통계포함된다
|
||||
//1.서류전화 들어온시간
|
||||
$insert_tm = $m415->getFaxSaveTime($vr_sq);
|
||||
//2.서류/전화 확인일자
|
||||
$tel_doc_conf_dt = $m415->getConfTimeForHistory($vr_sq);
|
||||
//3.검증시간
|
||||
$finishTime = $m415->get_60_ForHistory($vr_sq);
|
||||
//3.해당 정보를 테이블에 넣는다
|
||||
$m415->insert_v2_time_required_Conf_Done($atcl_no, $article['cpid'], $article['vrfc_type'], $insert_tm['recv_time'], $tel_doc_conf_dt['insert_tm'], $finishTime['insert_tm']);
|
||||
}
|
||||
$this->model->set_v2_st_daily(NULL, $v2_vrfc_req['cpid'], 'D0205', '1', 'add'); // 홍보확인서완료 등기부등본확인 안함 저장
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
$return = $send_result['error'];
|
||||
$err_time = date("Y-m-d H:i:s");
|
||||
$this->model->saveApiErr($fax_sq, $send_result['error']['code'], $send_result['error']['message'], $err_time, $v2_vrfc_req['atcl_no']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 홍보확인서 확인
|
||||
public function find()
|
||||
{
|
||||
$fax = $this->model->getOneFax();
|
||||
|
||||
if (empty($fax)) {
|
||||
return redirect()->back()
|
||||
->with('alert', '새로운 FAX가 존재하지 않습니다.');
|
||||
}
|
||||
|
||||
|
||||
return redirect()->to('/m703/m703a/detail/' . $fax['fax_sq']);
|
||||
}
|
||||
}
|
||||
800
app/Controllers/V2/M704.php
Normal file
800
app/Controllers/V2/M704.php
Normal file
@@ -0,0 +1,800 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\MyUpload;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use Exception;
|
||||
use App\Models\v2\M704Model;
|
||||
|
||||
class M704 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M704Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID', 'TEL_FAIL_CAUSE', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m704/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'stat_complete_date',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'vrfc_type_sub',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'reference_file_url_yn',
|
||||
'corp_own',
|
||||
];
|
||||
}
|
||||
|
||||
public function detail($id)
|
||||
{
|
||||
$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', 'TEL_FAIL_CAUSE']); // 코드조회
|
||||
|
||||
$data = $this->model->getDetail($id);
|
||||
$memo = $this->model->getMemo($id);
|
||||
$history = $this->model->getHistory($id);
|
||||
|
||||
$regist2 = $this->model->oneGetRecordInfo($id, "2"); //등기부등본
|
||||
$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;
|
||||
$this->data['memo'] = $memo;
|
||||
$this->data['history'] = $history;
|
||||
$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()
|
||||
{
|
||||
$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/multi_" . $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->saveChangedHistory($vr_sq, '30', 'C26', $usr_id, '녹취파일 업로드');
|
||||
|
||||
// 파일업로드 정보 저장
|
||||
$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 saveMemo()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
$memo = $this->request->getPost('memo');
|
||||
|
||||
$data = [
|
||||
$memo,
|
||||
$vr_sq,
|
||||
];
|
||||
|
||||
// UPDATE v2_vrfc_req
|
||||
$this->model->saveMemo($data);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 전화실패
|
||||
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()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
|
||||
$data = $this->model->getNextTelInfo($vr_sq);
|
||||
|
||||
if (empty($data)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '전화매물이 존재하지 않습니다.'
|
||||
]);
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
727
app/Controllers/V2/M705.php
Normal file
727
app/Controllers/V2/M705.php
Normal file
@@ -0,0 +1,727 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\Common;
|
||||
use App\Libraries\MyUpload;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use App\Models\v2\M705Model;
|
||||
|
||||
class M705 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M705Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID', 'TEL_FAIL_CAUSE', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m705/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'vrfc_type_sub',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'chk_spc_yn',
|
||||
'reference_file_url_yn',
|
||||
'corp_own',
|
||||
];
|
||||
}
|
||||
|
||||
public function getNotAssign()
|
||||
{
|
||||
try {
|
||||
|
||||
$res = $this->model->getNotAssign();
|
||||
|
||||
if (empty($res)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '미배정건이 존재하지 않습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'res' => $res['vr_sq'],
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 엑셀 다운로드
|
||||
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)
|
||||
{
|
||||
$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);
|
||||
$record = $this->model->getRecordInfo($id, '1'); // 홍보확인서
|
||||
$regist = $this->model->getRecordInfo($id, '2'); // 등기부등본
|
||||
$memo = $this->model->getMemo($id); // 메모
|
||||
$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;
|
||||
$this->data['regist'] = $regist;
|
||||
$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);
|
||||
}
|
||||
|
||||
// 이미지회전
|
||||
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 saveCorp()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
|
||||
$this->model->saveCorp($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');
|
||||
|
||||
|
||||
|
||||
$files = $this->request->getFiles();
|
||||
|
||||
$uploadPath = "/upload/v2_file/" . $vr_sq . "/";
|
||||
|
||||
$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',
|
||||
'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'); // 등기부등본 미확인여부 상세
|
||||
$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()
|
||||
{
|
||||
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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
559
app/Controllers/V2/M706.php
Normal file
559
app/Controllers/V2/M706.php
Normal file
@@ -0,0 +1,559 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use Exception;
|
||||
use App\Models\v2\M706Model;
|
||||
|
||||
class M706 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M706Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m706/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'rcpt_cpid',
|
||||
];
|
||||
}
|
||||
|
||||
public function detail($id)
|
||||
{
|
||||
$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', 'CONSULTANT_COMMENT', 'TEL_FAIL_CAUSE']); // 코드조회
|
||||
$record = $this->model->getRecordInfo($id, '1'); //홍보확인서
|
||||
$regist = $this->model->getRecordInfo($id, '2'); //등기부등본
|
||||
|
||||
$data = $this->model->getDetail($id);
|
||||
$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;
|
||||
|
||||
$this->data['data'] = $data;
|
||||
$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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
580
app/Controllers/V2/M708.php
Normal file
580
app/Controllers/V2/M708.php
Normal file
@@ -0,0 +1,580 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\Common;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use Exception;
|
||||
use App\Models\v2\M708Model;
|
||||
|
||||
class M708 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M708Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['CP_ID', 'STEP_VERIFICATION', 'RECEIPT_STATUS3', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m708/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'chk_atcl_no',
|
||||
'caller_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'target_yn',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'rcpt_v2',
|
||||
];
|
||||
}
|
||||
|
||||
public function detail($id)
|
||||
{
|
||||
$id = (string) $id;
|
||||
|
||||
if ($id === '') {
|
||||
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
||||
$codes = $this->codeModel->getCodeLists(['CONFIRM_RESULT_D11', 'CONSULTANT_COMMENT']); // 코드조회
|
||||
|
||||
$data = $this->model->getDetail($id);
|
||||
$memo = $this->model->getMemo($id);
|
||||
|
||||
$article = null;
|
||||
$confirm = null;
|
||||
if (!empty($data)) {
|
||||
switch ($data['work_type']) {
|
||||
case "1": // 현장확인 매물
|
||||
$article = $this->model->getArticleInfo1($data['atcl_no']);
|
||||
$article['stat_cd'] = $data['stat_cd'];
|
||||
$confirm = $this->model->getV2Confirm($data['vr_sq'], $data['work_type']);
|
||||
break;
|
||||
case "2": // 일반확인 매물
|
||||
$article = $this->model->getArticleInfo2($data['atcl_no']);
|
||||
$confirm = $this->model->getV2Confirm($data['vr_sq']);
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data['article'] = $article;
|
||||
$this->data['confirm'] = $confirm;
|
||||
}
|
||||
|
||||
$history = $this->model->getHistory($data['vr_sq']);
|
||||
|
||||
$this->data['codes'] = $codes;
|
||||
$this->data['data'] = $data;
|
||||
$this->data['memo'] = $memo;
|
||||
$this->data['history'] = $history;
|
||||
|
||||
|
||||
return view("pages/v2/m708/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 getArticleInfo()
|
||||
{
|
||||
try {
|
||||
|
||||
$atcl_no = $this->request->getGet('atcl_no');
|
||||
|
||||
$row = $this->model->getArticleInfo($atcl_no);
|
||||
|
||||
|
||||
if (empty($row)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '매물이 존재하지 않습니다.',
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'atcl_no' => $row['vr_sq'],
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 홍보확인서 아님 저장
|
||||
public function saveNotArticle()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
|
||||
$this->model->saveNotArticle($fax_sq);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 중복으로 저장
|
||||
public function saveDuplImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
|
||||
$this->model->saveDuplImgs($fax_sq, $atcl_no, $vr_sq);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 모바일 분양권 저장
|
||||
public function saveMobileBunyang()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
|
||||
$this->model->saveMobileBunyang($fax_sq, $atcl_no, $vr_sq);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 분양권 저장
|
||||
public function saveBunyang()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
|
||||
$this->model->saveBunyang($fax_sq);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 중개인 요청사항 저장
|
||||
public function saveRequestMessage()
|
||||
{
|
||||
$rcpt_sq = $this->request->getPost('vr_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$fax_sq = $this->request->getPost('fax_sq'); // FAX 순번
|
||||
$msg = $this->request->getPost('msg');
|
||||
|
||||
$rsrv_sq = $this->request->getPost('rsrv_sq');
|
||||
|
||||
// UPDATE result
|
||||
$this->model->saveRequestMessage($rcpt_sq, $rsrv_sq, $msg);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
}
|
||||
|
||||
// 확인결과 저장
|
||||
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');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$work_type = $this->request->getPost('work_type');
|
||||
$file_type = $this->request->getPost('file_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 = $this->model->get_v2_vrfc_req($vr_sq);
|
||||
|
||||
if (intval($article['stat_cd']) >= 40) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '이미 저장된 데이터입니다.',
|
||||
]);
|
||||
} else {
|
||||
|
||||
// 거주여부 & DB활용동의여부 수정 UPDATE
|
||||
if (!empty($resyn)) {
|
||||
$this->model->updateResDb($resyn, $dbusageagryn, $vr_sq);
|
||||
}
|
||||
|
||||
// DB에 결과 저장
|
||||
$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([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 분양계약서 조회
|
||||
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([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 다음 매물정보 조회
|
||||
public function getNextFaxImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$curr_fax_sq = $this->request->getPost('curr_fax_sq');
|
||||
|
||||
$data = $this->model->getNextFaxImgs($curr_fax_sq);
|
||||
|
||||
if (empty($data)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => 'FAX 이미지가 존재하지 않습니다.'
|
||||
]);
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
333
app/Controllers/V2/M709.php
Normal file
333
app/Controllers/V2/M709.php
Normal file
@@ -0,0 +1,333 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\Common;
|
||||
use App\Models\v2\M709Model;
|
||||
|
||||
class M709 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M709Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['CP_ID', 'STEP_VERIFICATION', 'RECEIPT_STATUS3', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m709/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'chk_atcl_no',
|
||||
'caller_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'target_yn',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'rcpt_v2',
|
||||
];
|
||||
}
|
||||
|
||||
public function detail($id)
|
||||
{
|
||||
$id = (string) $id;
|
||||
|
||||
if ($id === '') {
|
||||
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
||||
$codes = $this->codeModel->getCodeLists(['CONFIRM_RESULT_D11', 'CONSULTANT_COMMENT']); // 코드조회
|
||||
|
||||
$data = $this->model->getDetail($id);
|
||||
$memo = $this->model->getMemo($id);
|
||||
|
||||
|
||||
|
||||
$article = null;
|
||||
$confirm = null;
|
||||
if (!empty($data)) {
|
||||
switch ($data['work_type']) {
|
||||
case "1": // 현장확인 매물
|
||||
$article = $this->model->getArticleInfo1($data['atcl_no']);
|
||||
break;
|
||||
case "2": // 일반확인 매물
|
||||
$article = $this->model->getArticleInfo2($data['atcl_no']);
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data['article'] = $article;
|
||||
$this->data['confirm'] = $confirm;
|
||||
}
|
||||
|
||||
// dd($data);
|
||||
// exit;
|
||||
|
||||
$history = $this->model->getHistory($id);
|
||||
|
||||
$this->data['codes'] = $codes;
|
||||
$this->data['data'] = $data;
|
||||
$this->data['memo'] = $memo;
|
||||
$this->data['history'] = $history;
|
||||
|
||||
return view("pages/v2/m709/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 getArticleInfo()
|
||||
{
|
||||
try {
|
||||
|
||||
$atcl_no = $this->request->getGet('atcl_no');
|
||||
|
||||
$row = $this->model->getArticleInfo($atcl_no);
|
||||
|
||||
|
||||
if (empty($row)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => '매물이 존재하지 않습니다.',
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'atcl_no' => $row['vr_sq'],
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 홍보확인서 아님 저장
|
||||
public function saveNotArticle()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
|
||||
$this->model->saveNotArticle($fax_sq);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 중복으로 저장
|
||||
public function saveDuplImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
|
||||
$this->model->saveDuplImgs($fax_sq, $atcl_no, $vr_sq);
|
||||
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 정보저장
|
||||
public function saveAddress()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq'); // 확인요청순번
|
||||
$atcl_no = $this->request->getPost('atcl_no'); // 매물번호
|
||||
$fax_sq = $this->request->getPost('fax_sq'); // fax 순번
|
||||
$address2 = $this->request->getPost('address2'); // 상세주소1
|
||||
$address3 = $this->request->getPost('address3'); // 상세주소2
|
||||
$trade_type = $this->request->getPost('trade_type'); // 거래구분
|
||||
$floor = $this->request->getPost('floor'); // 층
|
||||
$floor2 = $this->request->getPost('floor2'); // 총층
|
||||
|
||||
|
||||
$data = [
|
||||
'vr_sq' => $vr_sq,
|
||||
'atcl_no' => $atcl_no,
|
||||
'fax_sq' => $fax_sq,
|
||||
'address2' => $address2,
|
||||
'address3' => $address3,
|
||||
'trade_type' => $trade_type,
|
||||
'floor' => $floor,
|
||||
'floor2' => $floor2,
|
||||
];
|
||||
|
||||
$this->model->saveAddress($data);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 확인결과저장
|
||||
public function saveImageArticle()
|
||||
{
|
||||
try {
|
||||
|
||||
$fax_sq = $this->request->getPost('fax_sq');
|
||||
$work_type = $this->request->getPost('work_type');
|
||||
$atcl_no = $this->request->getPost('atcl_no');
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
$file_type = $this->request->getPost('file_type');
|
||||
|
||||
$data = [
|
||||
'fax_sq' => $fax_sq,
|
||||
'work_type' => $work_type,
|
||||
'atcl_no' => $atcl_no,
|
||||
'vr_sq' => $vr_sq,
|
||||
'file_type' => $file_type,
|
||||
];
|
||||
|
||||
$this->model->saveImageArticle($data);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 다음 매물정보 조회
|
||||
public function getNextFaxImgs()
|
||||
{
|
||||
try {
|
||||
|
||||
$curr_fax_sq = $this->request->getPost('curr_fax_sq');
|
||||
|
||||
$data = $this->model->getNextFaxImgs($curr_fax_sq);
|
||||
|
||||
if (empty($data)) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => 'FAX 이미지가 존재하지 않습니다.'
|
||||
]);
|
||||
} else {
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
136
app/Controllers/V2/M710.php
Normal file
136
app/Controllers/V2/M710.php
Normal file
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\common\CodeModel;
|
||||
use App\Models\v2\M710Model;
|
||||
|
||||
class M710 extends BaseController
|
||||
{
|
||||
private $model, $codeModel;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new M710Model();
|
||||
$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/m710/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'), // 매물종류
|
||||
'status' => $this->request->getGet('status'), // 전송여부
|
||||
];
|
||||
|
||||
$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 getExcelList()
|
||||
{
|
||||
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'), // 매물종류
|
||||
'status' => $this->request->getGet('status'), // 전송여부
|
||||
];
|
||||
|
||||
$datas = $this->model->getExcelList($data);
|
||||
|
||||
return $this->response->setJSON(body: [
|
||||
'data' => $datas,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
$e->getPrevious()->getTraceAsString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 전송 api
|
||||
public function sendApi()
|
||||
{
|
||||
try {
|
||||
|
||||
$type = $this->request->getPost('type');
|
||||
|
||||
$this->model->updateSendApi($type);
|
||||
|
||||
return $this->response->setJSON([
|
||||
'code' => '0',
|
||||
'msg' => 'success',
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->response->setJSON([
|
||||
'code' => '9',
|
||||
'msg' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
18
app/Controllers/V2/M711.php
Normal file
18
app/Controllers/V2/M711.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
|
||||
class M711 extends BaseController
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function lists(): string
|
||||
{
|
||||
return view("pages/v2/m711/lists", $this->data);
|
||||
}
|
||||
}
|
||||
672
app/Controllers/V2/M712.php
Normal file
672
app/Controllers/V2/M712.php
Normal file
@@ -0,0 +1,672 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\Common;
|
||||
use App\Libraries\MyUpload;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M712Model;
|
||||
|
||||
class M712 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M712Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m712/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'vrfc_type_sub',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'reference_file_url_yn',
|
||||
'ownerTypeCode',
|
||||
'document_not_received_yn',
|
||||
];
|
||||
}
|
||||
|
||||
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('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);
|
||||
}
|
||||
|
||||
// 이미지회전
|
||||
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 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 saveNotReceived()
|
||||
{
|
||||
try {
|
||||
|
||||
$vr_sq = $this->request->getPost('vr_sq');
|
||||
$atcl_no = $this->request->getPost('rcpt_no');
|
||||
|
||||
$this->model->saveNotReceived($vr_sq);
|
||||
|
||||
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 이면 상태값 변경 : 등기부등본 확인완료 상태. (수정변경이력 저장)
|
||||
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',
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
} 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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
695
app/Controllers/V2/M713.php
Normal file
695
app/Controllers/V2/M713.php
Normal file
@@ -0,0 +1,695 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\V2;
|
||||
|
||||
use App\Controllers\V2\BaseV2Controller;
|
||||
use App\Libraries\MyUpload;
|
||||
use App\Libraries\NaverApiClient;
|
||||
use App\Models\results\M415Model;
|
||||
use App\Models\v2\M710Model;
|
||||
use App\Models\v2\M713Model;
|
||||
|
||||
class M713 extends BaseV2Controller
|
||||
{
|
||||
protected function createModel()
|
||||
{
|
||||
return new M713Model();
|
||||
}
|
||||
|
||||
protected function getCodeKeys(): array
|
||||
{
|
||||
return ['STEP_VERIFICATION', 'VRFCREQ_WAY', 'CP_ID', 'ARTICLE_TYPE'];
|
||||
}
|
||||
|
||||
protected function getViewName(): string
|
||||
{
|
||||
return 'pages/v2/m713/lists';
|
||||
}
|
||||
|
||||
protected function getSearchKeys(): array
|
||||
{
|
||||
return [
|
||||
'atcl_no',
|
||||
'stat_cd',
|
||||
'realtor_nm',
|
||||
'charger_gbn',
|
||||
'assign_yn',
|
||||
'receipt_sdate',
|
||||
'receipt_edate',
|
||||
'complete_sdate',
|
||||
'complete_edate',
|
||||
'srcSido',
|
||||
'srcGugun',
|
||||
'srcDong',
|
||||
'bonbu',
|
||||
'team',
|
||||
'damdang',
|
||||
'vrfcreq_way',
|
||||
'vrfc_type_sub',
|
||||
'rcpt_cpid',
|
||||
'rlet_type_cd',
|
||||
'chk_spc_yn',
|
||||
'reference_file_url_yn',
|
||||
'corp_own',
|
||||
];
|
||||
}
|
||||
|
||||
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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
75
app/Controllers/V2/V2StDailyModel.php
Normal file
75
app/Controllers/V2/V2StDailyModel.php
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
204
app/Controllers/Webfax/Crontab.php
Normal file
204
app/Controllers/Webfax/Crontab.php
Normal 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,10 +13,31 @@ class AuthCheck implements FilterInterface
|
||||
$session = session();
|
||||
log_message('debug', 'URI PATH: ' . service('uri')->getPath());
|
||||
|
||||
// 로그인 체크
|
||||
if (!$session->get('logged_in')) {
|
||||
// 로그인 안 되어 있으면 로그인 페이지로
|
||||
return redirect()->to('/login');
|
||||
try {
|
||||
// 세션 읽기 시도
|
||||
$loggedIn = $session->get('logged_in');
|
||||
|
||||
// 로그인 체크
|
||||
if (!$loggedIn) {
|
||||
// 로그인 안 되어 있으면 로그인 페이지로
|
||||
return redirect()->to('/login');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// 세션 오류 (Redis 다운 등) - 모든 예외 catch
|
||||
log_message('error', '[SESSION ERROR in AuthCheck] ' . $e->getMessage());
|
||||
|
||||
// AJAX 요청인 경우 JSON 응답
|
||||
if ($request->isAJAX()) {
|
||||
return service('response')
|
||||
->setStatusCode(503)
|
||||
->setJSON([
|
||||
'code' => '8',
|
||||
'msg' => '세션 서비스 오류입니다. 페이지를 새로고침 해주세요. (Redis)'
|
||||
]);
|
||||
}
|
||||
|
||||
// 일반 요청인 경우 로그인 페이지로 리다이렉트 (에러 메시지 포함)
|
||||
return redirect()->to('/login')->with('error', '세션 서비스 오류입니다. 시스템 관리자에게 문의해주세요.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
13
app/Helpers/cron_helper.php
Normal file
13
app/Helpers/cron_helper.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -7,40 +7,33 @@ if (!function_exists('limitHscpMarketPriceInfo')) {
|
||||
* @param string $ptp_no 평형코드
|
||||
* @param string $atcl_amt 가격
|
||||
*/
|
||||
function limitHscpMarketPriceInfo($CI, $trade_type, $hscp_no, $ptp_no, $atcl_amt)
|
||||
function limitHscpMarketPriceInfo($trade_type, $hscp_no, $ptp_no, $atcl_amt)
|
||||
{
|
||||
$return = array();
|
||||
|
||||
if (!empty($hscp_no) && !empty($ptp_no)) {
|
||||
|
||||
$hscpMarketPriceInfo = $CI->call_kiso_api->hscpMarketPriceInfo($hscp_no, $ptp_no);
|
||||
$naver = new \App\Libraries\NaverApiClient();
|
||||
$hscpMarketPriceInfo = $naver->getComplexPriceByUnitType((int)$hscp_no, (int)$ptp_no);
|
||||
|
||||
if (isset($hscpMarketPriceInfo['error'])) { //결과값 확인
|
||||
if ($hscpMarketPriceInfo['error']['code'] == 'VC027') {
|
||||
$return = array();
|
||||
} else {
|
||||
$return = $hscpMarketPriceInfo['error'];
|
||||
}
|
||||
if (isset($hscpMarketPriceInfo['error']) && $hscpMarketPriceInfo['error']) { //결과값 확인
|
||||
log_message('error', '네이버 시세 API 호출 실패: ' . json_encode($hscpMarketPriceInfo));
|
||||
return array();
|
||||
} else {
|
||||
$limitH = 0;
|
||||
$limitL = 0;
|
||||
$sise = array();
|
||||
$sise = $hscpMarketPriceInfo['data'];
|
||||
// 상한가, 하한가 체크 ( 상한가 * 2, 하한가 * 0.7) 이내의 범위에 가격이 있어야 함.
|
||||
if ($trade_type == 'A1') {
|
||||
// 매매
|
||||
if (isset($hscpMarketPriceInfo['result']['deal_uplmt_prc'])) {
|
||||
$limitH = $hscpMarketPriceInfo['result']['deal_uplmt_prc'];
|
||||
}
|
||||
if (isset($hscpMarketPriceInfo['result']['deal_lwlmt_prc'])) {
|
||||
$limitL = $hscpMarketPriceInfo['result']['deal_lwlmt_prc'];
|
||||
}
|
||||
$limitH = $sise['dealCeilingPrice'] ?? 0;
|
||||
$limitL = $sise['dealFloorPrice'] ?? 0;
|
||||
|
||||
} elseif ($trade_type == 'B1') {
|
||||
// 전세
|
||||
if (isset($hscpMarketPriceInfo['result']['lease_uplmt_prc'])) {
|
||||
$limitH = $hscpMarketPriceInfo['result']['lease_uplmt_prc'];
|
||||
}
|
||||
if (isset($hscpMarketPriceInfo['result']['lease_lwlmt_prc'])) {
|
||||
$limitL = $hscpMarketPriceInfo['result']['lease_lwlmt_prc'];
|
||||
}
|
||||
$limitH = $sise['leaseCeilingPrice'] ?? 0;
|
||||
$limitL = $sise['leaseFloorPrice'] ?? 0;
|
||||
}
|
||||
|
||||
if (!empty($limitH)) {
|
||||
@@ -237,6 +230,31 @@ function han($s)
|
||||
}
|
||||
// function to_han ($str) { return preg_replace('/(\\\u[a-f0-9]+)+/e','han("$0")',$str); }
|
||||
|
||||
if (!function_exists('db_now')) {
|
||||
/**
|
||||
* DB의 현재 시간을 지정된 포맷으로 반환하는 RawSql 생성
|
||||
* @param string|null $format MariaDB 포맷 (예: '%Y-%m-%d %H:%i:%s')
|
||||
*/
|
||||
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(), '$mysqlFormat')");
|
||||
}
|
||||
// 포맷이 없으면 기본 NOW() 반환
|
||||
return new \CodeIgniter\Database\RawSql('NOW()');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 비밀번호 문자 조합 검사
|
||||
* - 영문 대문자 / 소문자 / 숫자 / 특수문자 중 최소 $minTypes 종류 이상
|
||||
@@ -267,3 +285,170 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 무엇이 변경되었는지 확인한다.
|
||||
* $table(DB의 원래 데이터), data (변경된 내용) ==> array
|
||||
*/
|
||||
function what_is_changed($table, $data){
|
||||
$return = '';
|
||||
if (empty($table) || empty($data)){
|
||||
log_message('warning', 'what_is_changed 함수에 빈 데이터 전달 | table: ' . json_encode($table) . ', data: ' . json_encode($data));
|
||||
return $return;
|
||||
}
|
||||
|
||||
foreach ( $data as $key => $value ) {
|
||||
if (!array_key_exists($key, $table)) {
|
||||
$table[$key] = '';
|
||||
}
|
||||
|
||||
if (strcmp(trim((string) $table[$key]), trim((string) $value)) != 0){
|
||||
switch ( $key ) {
|
||||
case 'trade_type': // 거래구분
|
||||
$return .= ', 거래구분 : ';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_product_info2': // 매매, 전세, 월세보증금
|
||||
$return .= ', 거래가 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_product_info3': // 월세
|
||||
$return .= ', 월세 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_dtl_addr': // 상세주소
|
||||
$return .= ', 상세주소 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_li_addr': //리 주소
|
||||
$return .= ', 리 주소 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_jibun_addr': //지번 주소
|
||||
$return .= ', 지번 주소 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_etc_addr': //기타 주소
|
||||
$return .= ', 기타 주소 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_ref_addr': // 상세주소
|
||||
$return .= ', 기타주소2 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_ho': // 기타주소
|
||||
$return .= ', 기타주소 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_hscp_no': // 단지
|
||||
$return .= ', 단지번호 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_ptp_no': // 평형
|
||||
$return .= ', 평형 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'rcpt_floor': // 층
|
||||
$return .= ', 층 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'exp_spc_yn': // 층
|
||||
$return .= ', 면적확인여부 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'excls_spc1': // 층
|
||||
$return .= ', 전용면적 첫번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'excls_spc2': // 층
|
||||
$return .= ', 전용면적 두번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'room_cnt': // 층
|
||||
$return .= ', 방개수 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'sply_spc': // 층
|
||||
$return .= ', 공급면적 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'share_spc': // 층
|
||||
$return .= ', 공용면적 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'tot_spc': // 층
|
||||
$return .= ', 연면적 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'tot_spc1': // 층
|
||||
$return .= ', 연면적 첫번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'tot_spc2': // 층
|
||||
$return .= ', 연면적 두번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'grnd_spc1': // 층
|
||||
$return .= ', 대지면적 첫번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'grnd_spc2': // 층
|
||||
$return .= ', 대지면적 두번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'grnd_spc3': // 층
|
||||
$return .= ', 대지면적 세번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'grnd_spc4': // 층
|
||||
$return .= ', 대지면적 네번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'grnd_spc5': // 층
|
||||
$return .= ', 대지면적 다섯번째 값 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'spc_stat': // 층
|
||||
$return .= ', 면적구분 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
case 'request_msg': // 층
|
||||
$return .= ', 메모변경 :';
|
||||
$return .= $table[$key] . ' => ' . $value . "\n";
|
||||
break;
|
||||
// case 'rcpt_x': // 좌표 x 12x.xxxxx (경도: longitude)
|
||||
// $return .= '거래구분 :';
|
||||
// break;
|
||||
// case 'rcpt_y': // 좌표 y 3x.xxxx (위도: latitude)
|
||||
// $return .= '거래구분 :';
|
||||
// break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return trim(substr($return, 1));
|
||||
}
|
||||
45
app/Helpers/log_helper.php
Normal file
45
app/Helpers/log_helper.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
if (! function_exists('write_custom_log')) {
|
||||
/**
|
||||
* 전용 로그 기록 함수 (Worker, API 리시버 등 어디서나 사용 가능)
|
||||
*/
|
||||
function write_custom_log($message, $level = 'INFO', $type = 'service')
|
||||
{
|
||||
$logDir = WRITEPATH . 'logs';
|
||||
if (!is_dir($logDir)) {
|
||||
@mkdir($logDir, 0777, true);
|
||||
}
|
||||
|
||||
// --- 호출 위치 추적 로직 추가 ---
|
||||
// debug_backtrace는 호출 스택을 가져옵니다.
|
||||
// [0]은 현재 함수(write_custom_log), [1]은 이 함수를 호출한 곳입니다.
|
||||
$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
|
||||
$caller = $bt[1] ?? null;
|
||||
$fileInfo = $bt[0] ?? null; // 파일명과 라인수는 호출 시점인 0번 인덱스에 들어있음
|
||||
|
||||
$location = 'unknown';
|
||||
if ($caller) {
|
||||
$class = $caller['class'] ?? '';
|
||||
$func = $caller['function'] ?? '';
|
||||
$line = $fileInfo['line'] ?? '0';
|
||||
|
||||
// 클래스명에서 Namespace 제외하고 클래스명만 짧게 가져오기 (선택 사항)
|
||||
$classShort = substr(strrchr($class, "\\"), 1) ?: $class;
|
||||
|
||||
$location = "{$classShort}::{$func}:{$line}";
|
||||
}
|
||||
// ----------------------------
|
||||
|
||||
$suffix = ($type === 'failed') ? '-failed' : '';
|
||||
$logFile = $logDir . '/log-' . date('Y-m-d') . $suffix . '.log';
|
||||
|
||||
$timestamp = date('Y-m-d H:i:s');
|
||||
$singleLine = str_replace(["\r", "\n", "\t"], " ", $message);
|
||||
|
||||
// 포맷에 [$location] 추가
|
||||
$formatted = "[$timestamp] [$level] [$location] $singleLine" . PHP_EOL;
|
||||
|
||||
@file_put_contents($logFile, $formatted, FILE_APPEND);
|
||||
}
|
||||
}
|
||||
35
app/Helpers/query_log_helper.php
Normal file
35
app/Helpers/query_log_helper.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('write_query_log')) {
|
||||
/**
|
||||
* SQL 쿼리 로그를 writable/logs/sql-query-{date}.log에 기록
|
||||
*
|
||||
* @param string $message 로그 메시지
|
||||
* @param string $sql SQL 쿼리 (선택)
|
||||
*/
|
||||
function write_query_log(string $message, string $sql = '')
|
||||
{
|
||||
$logDir = WRITEPATH . 'logs';
|
||||
$logFile = $logDir . '/sql-query-' . date('Y-m-d') . '.log';
|
||||
|
||||
$timestamp = date('Y-m-d H:i:s');
|
||||
$logMessage = "[{$timestamp}] {$message}";
|
||||
|
||||
if (!empty($sql)) {
|
||||
$logMessage .= "\nSQL: {$sql}";
|
||||
}
|
||||
|
||||
$logMessage .= "\n" . str_repeat('-', 80) . "\n";
|
||||
|
||||
// 로그 디렉토리 확인 및 생성
|
||||
if (!is_dir($logDir)) {
|
||||
mkdir($logDir, 0755, true);
|
||||
}
|
||||
|
||||
// 파일에 쓰기
|
||||
file_put_contents($logFile, $logMessage, FILE_APPEND | LOCK_EX);
|
||||
|
||||
// log_message도 호출 (작동하면 좋고, 안되도 파일에는 기록됨)
|
||||
log_message('error', $message);
|
||||
}
|
||||
}
|
||||
82
app/Helpers/redis_helper.php
Normal file
82
app/Helpers/redis_helper.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('get_redis_connection')) {
|
||||
/**
|
||||
* Redis 연결을 반환하는 헬퍼 함수
|
||||
* .env 환경변수에서 설정을 읽어 Redis에 연결합니다.
|
||||
*
|
||||
* @param string $type 'worker' 또는 'session' (기본값: 'worker')
|
||||
* @return Redis|false Redis 객체 또는 연결 실패 시 false
|
||||
* @throws RedisException
|
||||
*/
|
||||
function get_redis_connection(string $type = 'worker')
|
||||
{
|
||||
$redis = new \Redis();
|
||||
|
||||
try {
|
||||
// 타입에 따라 다른 환경변수 사용
|
||||
if ($type === 'session') {
|
||||
$host = env('SESSION_REDIS_HOST', '127.0.0.1');
|
||||
$port = env('SESSION_REDIS_PORT', '6379');
|
||||
$database = env('SESSION_REDIS_DATABASE', '0');
|
||||
$password = env('SESSION_REDIS_PASSWORD', '');
|
||||
} else {
|
||||
// worker, default
|
||||
$host = env('REDIS_HOST', '127.0.0.1');
|
||||
$port = env('REDIS_PORT', '6379');
|
||||
$database = env('REDIS_DATABASE', '9');
|
||||
$password = env('REDIS_PASSWORD', '');
|
||||
}
|
||||
|
||||
// Redis 연결 (타임아웃: 0.5초)
|
||||
$timeout = 0.5;
|
||||
$success = $redis->connect($host, (int)$port, $timeout);
|
||||
|
||||
if (!$success) {
|
||||
log_message('error', "Redis connection failed: {$host}:{$port}");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 비밀번호 인증 (있는 경우)
|
||||
if (!empty($password)) {
|
||||
$redis->auth($password);
|
||||
}
|
||||
|
||||
// 데이터베이스 선택
|
||||
$redis->select((int)$database);
|
||||
|
||||
return $redis;
|
||||
|
||||
} catch (\RedisException $e) {
|
||||
log_message('error', "Redis connection error: " . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('get_redis_config')) {
|
||||
/**
|
||||
* Redis 설정 정보를 배열로 반환
|
||||
*
|
||||
* @param string $type 'worker' 또는 'session'
|
||||
* @return array Redis 설정 배열
|
||||
*/
|
||||
function get_redis_config(string $type = 'worker'): array
|
||||
{
|
||||
if ($type === 'session') {
|
||||
return [
|
||||
'host' => env('SESSION_REDIS_HOST', '127.0.0.1'),
|
||||
'port' => env('SESSION_REDIS_PORT', '6379'),
|
||||
'database' => env('SESSION_REDIS_DATABASE', '0'),
|
||||
'password' => env('SESSION_REDIS_PASSWORD', ''),
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DATABASE', '9'),
|
||||
'password' => env('REDIS_PASSWORD', ''),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -33,4 +33,172 @@ 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);
|
||||
}
|
||||
|
||||
// ROOTPATH와 결합하여 절대 경로 생성 (img 폴더는 프로젝트 루트에 있음)
|
||||
$fullWmPath = ROOTPATH . $wmImagePath;
|
||||
|
||||
if (!is_file($fullWmPath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$wm = new \Imagick($fullWmPath);
|
||||
$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();
|
||||
|
||||
// 워터마크 텍스트가 있는 경우에만 텍스트 그리기
|
||||
if (!empty($wmText)) {
|
||||
$draw = new \ImagickDraw();
|
||||
|
||||
// 폰트 경로: img/watermark/fonts/
|
||||
if (!empty($wmFont)) {
|
||||
$fontPath = ROOTPATH . 'img/watermark/fonts/' . $wmFont;
|
||||
if (is_file($fontPath)) {
|
||||
$draw->setFont($fontPath);
|
||||
}
|
||||
}
|
||||
|
||||
$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('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] Exception: {message} at {file}:{line}', [
|
||||
'message' => $e->getMessage(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 서버상의 위치를 웹상의 위치로 변경한다...
|
||||
*/
|
||||
public function realpath_to_webpath($realpath)
|
||||
{
|
||||
$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/',
|
||||
);
|
||||
|
||||
$return_path = str_replace($arrImagePath, '/upload/', $realpath);
|
||||
$return_path = str_replace(' ', '', $return_path);
|
||||
return $return_path;
|
||||
}
|
||||
|
||||
}
|
||||
57
app/Libraries/FormValidation.php
Normal file
57
app/Libraries/FormValidation.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@ class MyUpload
|
||||
}
|
||||
|
||||
/**
|
||||
* 파일 업로드 요청
|
||||
* 파일 업로드 요청 (Object Storage 전용)
|
||||
* 추가일 2025.12.24
|
||||
* 작성자 - yangsh
|
||||
*/
|
||||
@@ -73,39 +73,40 @@ class MyUpload
|
||||
|
||||
$newName = $file->getRandomName();
|
||||
|
||||
// ✅ PHP 임시 업로드 파일 경로 (writable로 move() 필요 없음)
|
||||
// ✅ PHP 임시 업로드 파일 경로
|
||||
$tmpFile = $file->getTempName();
|
||||
if (!is_file($tmpFile)) {
|
||||
$this->set_error('upload_temp_file_missing');
|
||||
log_message('error', 'do_upload2 temp file missing: ' . $tmpFile);
|
||||
log_message('error', '[MyUpload] Temp file missing: ' . $tmpFile);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ✅ 클라우드에 올라갈 "Key"를 직접 만든다 (로컬 경로 절대 넣지 말기)
|
||||
// 예시: upload/tmp/랜덤파일명 또는 upload/apt_file/{rcpt_no}/...
|
||||
// ✅ 클라우드에 올라갈 "Key"
|
||||
$objectKey = $filePath . $newName;
|
||||
|
||||
// 클라우드 업로드 (필수)
|
||||
$up = $this->upload_object_storage($objectKey, $tmpFile, 'file');
|
||||
|
||||
if ($up === false) {
|
||||
$this->set_error('upload_destination_cloud_error');
|
||||
$this->set_error('cloud_upload_failed');
|
||||
log_message('error', '[MyUpload] Cloud upload failed: ' . $objectKey);
|
||||
@unlink($tmpFile);
|
||||
return false;
|
||||
}
|
||||
|
||||
// (선택) tmp 파일 삭제
|
||||
// tmp 파일 삭제
|
||||
@unlink($tmpFile);
|
||||
|
||||
$this->s3_data = [
|
||||
'object_key' => $objectKey,
|
||||
'object_storage_url' => $up['object_storage_url'] ?? null,
|
||||
'origin_name' => $file->getClientName(),
|
||||
'file_name' => basename($objectKey), // xxxx.jpg
|
||||
'base_name' => pathinfo($objectKey, PATHINFO_FILENAME), // xxxx
|
||||
'ext' => pathinfo($objectKey, PATHINFO_EXTENSION), // jpg
|
||||
'file_name' => basename($objectKey),
|
||||
'base_name' => pathinfo($objectKey, PATHINFO_FILENAME),
|
||||
'ext' => pathinfo($objectKey, PATHINFO_EXTENSION),
|
||||
];
|
||||
|
||||
|
||||
log_message('debug', 's3_data=' . json_encode($this->s3_data ?? null, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
|
||||
|
||||
log_message('info', '[MyUpload] Cloud upload success: ' . $objectKey);
|
||||
|
||||
return $this->s3_data;
|
||||
}
|
||||
@@ -386,6 +387,7 @@ class MyUpload
|
||||
'Key' => ltrim($object_storage_upload_path, '/'),
|
||||
'Body' => $blobData,
|
||||
'ACL' => 'public-read',
|
||||
'ContentType' => 'image/jpeg',
|
||||
]);
|
||||
|
||||
|
||||
|
||||
673
app/Libraries/NaverApiClient.php
Normal file
673
app/Libraries/NaverApiClient.php
Normal file
@@ -0,0 +1,673 @@
|
||||
<?php
|
||||
|
||||
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] 매물 정보 조회
|
||||
*/
|
||||
public function getArticleInfo(string $articleNumber): ?array
|
||||
{
|
||||
$this->charger = 'admin';
|
||||
$url = "{$this->baseUrl}/kiso/center/verification-article/{$articleNumber}?charger={$this->charger}";
|
||||
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* [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-site/{$articleNumber}?charger={$this->charger}";
|
||||
|
||||
log_message('info', "[updateArticleInfo] 호출됨 - URL: {$url}, 데이터: " . json_encode($updateData, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$result = $this->request('PUT', $url, $updateData);
|
||||
|
||||
log_message('info', "[updateArticleInfo] 결과 - " . ($result === null ? 'NULL' : json_encode($result, JSON_UNESCAPED_UNICODE)));
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/** 일반매물 수정시 */
|
||||
public function v2updateArticleInfo(string $articleNumber, array $updateData, string $charger = 'admin'): ?array
|
||||
{
|
||||
$this->charger = $charger;
|
||||
$url = "{$this->baseUrl}/kiso/center/verification-article/{$articleNumber}?charger={$this->charger}";
|
||||
|
||||
log_message('info', "[v2updateArticleInfo] 호출됨 - URL: {$url}, 데이터: " . json_encode($updateData, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$result = $this->request('PUT', $url, $updateData);
|
||||
|
||||
log_message('info', "[v2updateArticleInfo] 결과 - " . ($result === null ? 'NULL' : json_encode($result, JSON_UNESCAPED_UNICODE)));
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* [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('PATCH', $url, $priceData);
|
||||
}
|
||||
|
||||
/**
|
||||
* 현장확인 슬롯 동기화
|
||||
* API (가) - /kiso/center/site-slot
|
||||
* 신규/변경 일자별 데이터 전송
|
||||
* @syncData array
|
||||
* @param string $baseDate 기준일자(ISO 8601 형식: YYYY-MM-DD 예: 2024-01-31)
|
||||
* @param string $legalDivisionNumber 구역번호 "1111000000"
|
||||
* @param object slots 오전/오후/ 슬롯 정보
|
||||
[
|
||||
{
|
||||
"baseDate": "2025-04-30",
|
||||
"legalDivisionNumber": "1111000000",
|
||||
"slots": {
|
||||
"am": { "max": 10, "reserved": 0 },
|
||||
"pm": { "max": 100, "reserved": 0 }
|
||||
}
|
||||
}
|
||||
]
|
||||
*/
|
||||
public function syncSiteSlot($syncData){
|
||||
$url = $this->baseUrl . "/kiso/center/verification-site/slots";
|
||||
return $this->request('POST', $url, $syncData);
|
||||
}
|
||||
|
||||
/**
|
||||
* 현장확인 매물검증 결과 관리
|
||||
* API: POST /kiso/center/verification-site/{매물번호}/report?charger={담당자명}
|
||||
* @param string $type 현장확인 S11: 예약, S21: 방문, S31: 검수
|
||||
* @param string $code 결과코드 10000: 성공, 20000: 실패, 30000: 지연, 20121: 방문전취소, 20122:방문후취소, 20123:촬영후취소
|
||||
* @param string $message 내용
|
||||
* @param string $reserveDate 예약 년월일 2005-07-31
|
||||
*/
|
||||
public function verificationSiteReport(string $articleNumber, array $reportData, string $charger = 'admin'): ?array
|
||||
{
|
||||
$this->charger = $charger;
|
||||
$url = "{$this->baseUrl}/kiso/center/verification-site/{$articleNumber}/report?charger={$this->charger}";
|
||||
|
||||
return $this->request('POST', $url, $reportData);
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 단지/평형 시세조회()
|
||||
* @param Long hscpNo 단지번호
|
||||
* @param int ptpNo 평형번호
|
||||
* API: GET /confirms/hscpMarketPriceInfo.nhn?hscpNo={단지번호}&ptpNo={평형번호}
|
||||
*/
|
||||
// public function hscpMarketPriceInfo($hscpNo, $ptpNo){
|
||||
// $url = '/confirms/hscpMarketPriceInfo.nhn';
|
||||
// $url = $this->commonModel->getCompanyInfo(3);
|
||||
// $url = $url['api_server'] . $url;
|
||||
// $data = [
|
||||
// 'hscpNo' => $hscpNo,
|
||||
// 'ptpNo' => $ptpNo
|
||||
// ];
|
||||
|
||||
// return $this->request('GET', $url, $data);
|
||||
// }
|
||||
public function getComplexPriceByUnitType(int $hscpNo, int $ptpNo): ?array
|
||||
{
|
||||
$url = $this->baseUrl . "/kiso/marketprice/complex/{$hscpNo}/pyeong-type/{$ptpNo}";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 법정동 기준 단지 목록 조회
|
||||
* API: GET /kiso/complex/legal-division/{법정동코드}
|
||||
* legalDivisionNumber : 법정동 코드
|
||||
*/
|
||||
public function getComplexList($legalDivisionNumber, $realEstateType = null)
|
||||
{
|
||||
$url = $this->baseUrl . "/kiso/complex/legal-division/{$legalDivisionNumber}";
|
||||
if ($realEstateType !== null) {
|
||||
$url .= "?realEstateType={$realEstateType}";
|
||||
}
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 단지평형목록 조회(아파트/오피스텔)
|
||||
*/
|
||||
public function getPyeongTypeList($complexNumber){
|
||||
$url = $this->baseUrl . "/kiso/complex/{$complexNumber}/pyeongs";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
/**
|
||||
* 빌라 단지 평형 목록 조회
|
||||
*/
|
||||
public function getVillaPyeongTypeList($complexNumber){
|
||||
$url = $this->baseUrl . "/kiso/complex/villa/{$complexNumber}/pyeongs";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 단지 상세 조회
|
||||
*/
|
||||
public function getComplexDetail($complexNumber){
|
||||
$url = $this->baseUrl . "/kiso/complex/{$complexNumber}";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 빌라 단지 상세 조회
|
||||
*/
|
||||
public function getVillaComplexDetail($complexNumber){
|
||||
$url = $this->baseUrl . "/kiso/complex/villa/{$complexNumber}";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
/**
|
||||
* 빌라 단지 동호수 조회
|
||||
*/
|
||||
public function getVillaBuildingList($complexNumber){
|
||||
$url = $this->baseUrl . "/kiso/complex/villa/{$complexNumber}/buildings";
|
||||
return $this->request('GET', $url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 현장확인 동기화 결과 전송
|
||||
* API: GET /site/submitSyncResult.nhn?reserveNoList={예약번호리스트}
|
||||
* @param string reserveNoList 예약번호 리스트 (쉼표로 구분된 문자열, 예: "12345,67890,54321")
|
||||
*/
|
||||
|
||||
|
||||
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 공통 실행 함수
|
||||
*/
|
||||
private function request(string $method, string $url, ?array $data = null): ?array
|
||||
{
|
||||
// 요청 데이터 로깅
|
||||
if ($data) {
|
||||
log_message('info', "[Naver API $method REQUEST] URL: $url | Data: " . json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
} else {
|
||||
log_message('info', "[Naver API $method REQUEST] URL: $url");
|
||||
}
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
|
||||
if ($method === 'PUT') {
|
||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
|
||||
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'
|
||||
]);
|
||||
}
|
||||
} elseif ($method === 'GET') {
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
'X-Naver-Client-Id: yqBbvQZ123_hjH3b3Df9'
|
||||
]);
|
||||
} elseif ($method === 'POST') {
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
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'
|
||||
]);
|
||||
}
|
||||
} 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);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$curlError = curl_error($ch);
|
||||
$curlErrno = curl_errno($ch);
|
||||
curl_close($ch);
|
||||
|
||||
// CURL 오류 체크
|
||||
if ($curlErrno !== 0) {
|
||||
log_message('error', "[Naver API $method CURL ERROR] URL: $url | Error ($curlErrno): $curlError");
|
||||
return [
|
||||
'error' => true,
|
||||
'error_type' => 'CURL_ERROR',
|
||||
'curl_errno' => $curlErrno,
|
||||
'curl_error' => $curlError,
|
||||
'url' => $url
|
||||
];
|
||||
}
|
||||
|
||||
// 결과 로그 기록 (성공/실패 모두 기록하여 추적 가능하게 함)
|
||||
if ($httpCode === 200 || $httpCode === 202) {
|
||||
log_message('info', "[Naver API $method SUCCESS] URL: $url | Code: $httpCode | Response: $response");
|
||||
} else {
|
||||
log_message('error', "[Naver API $method FAIL] URL: $url | Code: $httpCode | Response: $response");
|
||||
return [
|
||||
'error' => true,
|
||||
'error_type' => 'HTTP_ERROR',
|
||||
'http_code' => $httpCode,
|
||||
'response' => $response,
|
||||
'url' => $url
|
||||
];
|
||||
}
|
||||
|
||||
return json_decode($response, true);
|
||||
}
|
||||
}
|
||||
29
app/Libraries/qrcode.php
Normal file
29
app/Libraries/qrcode.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
47
app/Models/Entities/ChangedHistoryModel.php
Normal file
47
app/Models/Entities/ChangedHistoryModel.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class ChangedHistoryModel extends Model
|
||||
{
|
||||
protected $table = 'changed_history';
|
||||
protected $primaryKey = 'seq';
|
||||
protected $useAutoIncrement = true;
|
||||
protected $returnType = 'array';
|
||||
protected $protectFields = true;
|
||||
|
||||
protected $allowedFields = [
|
||||
'rcpt_sq',
|
||||
'rcpt_stat',
|
||||
'changed_type',
|
||||
'changed_id',
|
||||
'changed_tm',
|
||||
'remark',
|
||||
];
|
||||
|
||||
/**
|
||||
* 정보변경 이력 1건 저장
|
||||
*/
|
||||
public function addHistory(
|
||||
int $rcptSq,
|
||||
?string $rcptStat,
|
||||
?string $changedType,
|
||||
?string $changedId,
|
||||
?string $remark,
|
||||
?string $changedTm = null
|
||||
): bool {
|
||||
$data = [
|
||||
'rcpt_sq' => $rcptSq,
|
||||
'rcpt_stat' => $rcptStat,
|
||||
'changed_type' => $changedType,
|
||||
'changed_id' => $changedId,
|
||||
'changed_tm' => $changedTm ?? date('Y-m-d H:i:s'),
|
||||
'remark' => $remark,
|
||||
];
|
||||
|
||||
return $this->insert($data) !== false;
|
||||
}
|
||||
}
|
||||
|
||||
19
app/Models/Entities/NaverRawStagingModel.php
Normal file
19
app/Models/Entities/NaverRawStagingModel.php
Normal 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;
|
||||
}
|
||||
}
|
||||
26
app/Models/Entities/NaverWorkerLogModel.php
Normal file
26
app/Models/Entities/NaverWorkerLogModel.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class NaverWorkerLogModel extends Model
|
||||
{
|
||||
protected $table = 'naver_worker_logs';
|
||||
protected $primaryKey = 'seq'; // 'id'가 아니므로 명시 필요
|
||||
|
||||
protected $useAutoIncrement = true;
|
||||
|
||||
protected $returnType = 'array'; // 또는 'object'
|
||||
protected $useSoftDeletes = false;
|
||||
|
||||
// 대량 입력을 허용할 필드들
|
||||
protected $allowedFields = [
|
||||
'atcl_no', 'raw_payload', 'status',
|
||||
'retry_cnt', 'error_msg', 'target_db_id'
|
||||
];
|
||||
|
||||
// 날짜 자동 업데이트 설정
|
||||
protected $useTimestamps = true;
|
||||
protected $createdField = 'created_at';
|
||||
protected $updatedField = 'updated_at';
|
||||
}
|
||||
111
app/Models/Entities/ReceiptModel.php
Normal file
111
app/Models/Entities/ReceiptModel.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
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_product_info4', 'rcpt_product_info5', 'rcpt_product_info6',
|
||||
'trade_type', 'rcpt_ptp_no', 'rcpt_hscp_no',
|
||||
'dealAmount', 'warrantyAmount', 'leaseAmount', 'preSaleAmount', 'premiumAmount', 'preSaleOptionAmount',
|
||||
'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');
|
||||
|
||||
// 1. SELECT 문 구성
|
||||
$builder->select("
|
||||
a.rcpt_sq, a.comp_sq, a.rcpt_rating, ... (중략) ...,
|
||||
DATE_FORMAT(COALESCE(b.rsrv_date, a.rsrv_date), '%Y-%m-%d') AS rsrv_date,
|
||||
get_code_name('RECEIPT_STATUS1', LEFT(a.rcpt_stat, 2)) AS rcpt_stat_nm,
|
||||
CASE WHEN imgs.has_I1 = 1 THEN 'Y' ELSE 'N' END AS conf_img_yn
|
||||
", false);
|
||||
|
||||
// 2. JOIN 설정
|
||||
$builder->join('result b', 'a.rcpt_sq = b.rcpt_sq', 'left outer');
|
||||
$builder->join('region_codes c', 'a.rcpt_dong = c.region_cd', 'inner');
|
||||
$builder->join('departments d', 'b.dept_sq = d.dept_sq', 'left outer');
|
||||
$builder->join('users u', 'b.usr_sq = u.usr_sq', 'left outer');
|
||||
|
||||
// 서브쿼리 조인 (imgs)
|
||||
$subQuery = $this->db->table('result_imgs')
|
||||
->select("rsrv_sq")
|
||||
->selectMax("CASE WHEN img_type = 'I5' AND use_yn = 'Y' THEN 1 ELSE 0 END", "has_I5")
|
||||
->selectMax("CASE WHEN img_type = 'I1' AND use_yn = 'Y' THEN 1 ELSE 0 END", "has_I1")
|
||||
->groupBy("rsrv_sq")
|
||||
->getCompiledSelect();
|
||||
|
||||
$builder->join("($subQuery) imgs", "imgs.rsrv_sq = b.rsrv_sq", "left", false);
|
||||
|
||||
// 3. WHERE 조건 (권한 및 기본 필터)
|
||||
if (in_array($params['usr_level'], ['4', '40'])) {
|
||||
if (!empty($params['child_dept'])) {
|
||||
$builder->whereIn('b.dept_sq', $params['child_dept']);
|
||||
} else {
|
||||
$builder->where('b.usr_sq', $params['usr_sq']);
|
||||
}
|
||||
}
|
||||
|
||||
// 기본 3개월 데이터 제한
|
||||
$builder->where('a.insert_tm >= DATE_ADD(CURDATE(), INTERVAL -3 MONTH)', null, false);
|
||||
|
||||
// 4. 검색 조건 동적 생성
|
||||
if (!empty($params['rcpt_atclno'])) {
|
||||
$builder->where('a.rcpt_atclno', $params['rcpt_atclno']);
|
||||
} else {
|
||||
if (!empty($params['sdate'])) {
|
||||
$builder->where('a.insert_tm >=', $params['sdate'] . ' 00:00:00');
|
||||
$builder->where('a.insert_tm <', date('Y-m-d', strtotime($params['edate'] . ' +1 day')));
|
||||
}
|
||||
|
||||
// 중개사/매도자 통합 검색 (Group Start/End 사용)
|
||||
if (!empty($params['agent_nm'])) {
|
||||
$builder->groupStart()
|
||||
->like('a.agent_nm', $params['agent_nm'])
|
||||
->orLike('a.sellr_nm', $params['agent_nm'])
|
||||
->groupEnd();
|
||||
}
|
||||
|
||||
// 상태(Status) 다중 체크
|
||||
if ($params['stat_all'] !== 'Y' && !empty($params['stat_arr'])) {
|
||||
$builder->groupStart();
|
||||
foreach ($params['stat_arr'] as $stat) {
|
||||
$builder->orLike('a.rcpt_stat', $stat, 'after');
|
||||
}
|
||||
$builder->groupEnd();
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 정렬 및 페이징
|
||||
$builder->orderBy('a.rcpt_atclno', 'desc');
|
||||
|
||||
// 데이터 수 조회를 위해 복제 또는 countAllResults 활용
|
||||
$totalCount = 0;
|
||||
if ($total) {
|
||||
$countBuilder = clone $builder;
|
||||
$totalCount = $countBuilder->countAllResults(false);
|
||||
}
|
||||
|
||||
$offset = ($pageNum - 1) * $pageSize;
|
||||
$result = $builder->get($pageSize, $offset)->getResultArray();
|
||||
|
||||
return [
|
||||
'data' => $result,
|
||||
'total' => $totalCount
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
36
app/Models/Entities/RegionModel.php
Normal file
36
app/Models/Entities/RegionModel.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class RegionModel extends Model
|
||||
{
|
||||
protected $table = 'region_codes';
|
||||
protected $primaryKey = 'region_cd';
|
||||
protected $returnType = 'array';
|
||||
protected $useSoftDeletes = false;
|
||||
protected $useTimestamps = false;
|
||||
|
||||
protected $allowedFields = [
|
||||
'region_cd', 'region_nm', 'use_yn', 'dept_sq', 'usr_sq'
|
||||
];
|
||||
|
||||
/**
|
||||
* 지역 코드로 담당자 정보 조회
|
||||
*
|
||||
* @param string $regionCd 지역 코드 (sectorNumber)
|
||||
* @return array|null ['dept_sq' => 26, 'usr_sq' => 1] 또는 null
|
||||
*/
|
||||
public function getChargeByRegionCd($regionCd)
|
||||
{
|
||||
if (empty($regionCd)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->select('dept_sq, usr_sq')
|
||||
->where('region_cd', $regionCd)
|
||||
->where('use_yn', 'Y')
|
||||
->first();
|
||||
}
|
||||
}
|
||||
43
app/Models/Entities/ResultModel.php
Normal file
43
app/Models/Entities/ResultModel.php
Normal 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();
|
||||
}
|
||||
}
|
||||
31
app/Models/Entities/V2articleinfoModel.php
Normal file
31
app/Models/Entities/V2articleinfoModel.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class V2articleinfoModel extends Model
|
||||
{
|
||||
protected $table = 'v2_article_info';
|
||||
protected $primaryKey = 'vr_sq';
|
||||
protected $useAutoIncrement = false; // 메인 테이블의 vr_sq를 수동으로 입력받음
|
||||
protected $returnType = 'array';
|
||||
|
||||
protected $allowedFields = [
|
||||
'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', 'bild_no', 'charger', 'req_price_yn', 'reg_charger',
|
||||
'dept1_sq', 'dept2_sq', 'reg_dept2_sq', 'reg_dept1_sq', 'floor2',
|
||||
'dong_ho_chk', 'hscplqry_lv', 'ownerNm', 'ownerTelNo', 'chg_trade_type',
|
||||
'chg_address2', 'chg_address3', 'chg_seller_tel', 'chg_amt', 'reg_status',
|
||||
'cupnNo', 'roomSiteAtclRgstCnt', 'roomSiteAtclExpsCnt', 'redvlp_area_nm',
|
||||
'biz_stp_desc', 'cert_register', 'direct_trad_yn', 'confirm_doc_img_url',
|
||||
'confirm_doc_owner_check_yn', 'owner_birth', 'vrfc_type_sub',
|
||||
'cert_register_save_yn', 'confirm_doc_img_url_save_yn', 'address4',
|
||||
'reference_file_url', 'reference_file_url_save_yn', 'reference_file_url_yn',
|
||||
'registerBookUniqueNo', 'relationSellerAndOwner', 'ownerTypeCode', 'registerBookUniqueNumber'
|
||||
];
|
||||
}
|
||||
22
app/Models/Entities/V2articleinfoetcModel.php
Normal file
22
app/Models/Entities/V2articleinfoetcModel.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class V2articleinfoetcModel extends Model
|
||||
{
|
||||
protected $table = 'v2_article_info_etc';
|
||||
protected $primaryKey = 'vr_sq';
|
||||
protected $useAutoIncrement = false; // 메인 테이블의 vr_sq를 수동으로 입력받음
|
||||
protected $returnType = 'array';
|
||||
|
||||
protected $allowedFields = [
|
||||
'vr_sq', 'atcl_no', 'corp_own', 'vir_addr_yn', 'bild_no', 'vrfcMthdTpcd',
|
||||
'cert_uncnfrm_status', 'expsStartYmdt', 'vrfcAutoPassYn', 'address2a',
|
||||
'address2b', 'registerBookUniqueNo', 'ownerTypeCode', 'orgRepCphNo',
|
||||
'orgRepTelNo', 'orgRltrNm', 'orgRepNm', 'smsSendTime', 'document_cert_method',
|
||||
'noRgbkVrfcReqYn', 'areaByBdbkVrfcReqYn', 'orgAtclNo', 'atclStatCd',
|
||||
'repNm', 'cpName', 'document_not_received', 'final_failure'
|
||||
];
|
||||
}
|
||||
43
app/Models/Entities/V2chghistoryModel.php
Normal file
43
app/Models/Entities/V2chghistoryModel.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class V2chghistoryModel extends Model
|
||||
{
|
||||
protected $table = 'v2_chg_history';
|
||||
protected $primaryKey = 'seq'; // 실제 PK 컬럼명으로 수정하세요 (st_date, cpid, gbn_cd가 복합키인 경우도 있음)
|
||||
protected $allowedFields = ['vr_sq', 'stat_cd', 'chg_type', 'memo', 'insert_id', 'insert_tm'];
|
||||
|
||||
protected $useTimestamps = false; // insert_tm을 직접 넣으시므로 false
|
||||
|
||||
/**
|
||||
* 상태 변경 이력 저장 (CI4 통합 버전)
|
||||
* @param array $data ['vr_sq' => 값, 'stat_cd' => 값, ...]
|
||||
* @param string $saveType 'I'(Upsert), 'U'(Update)
|
||||
*/
|
||||
public function v2_savehistory(array $data )
|
||||
{
|
||||
$payload = [
|
||||
'vr_sq' => $data['vr_sq'],
|
||||
'stat_cd' => $data['stat_cd'],
|
||||
'chg_type' => $data['chg_type'],
|
||||
'memo' => $data['memo'] ?? '',
|
||||
'insert_id' => $data['insert_id'] ?? '0',
|
||||
'insert_tm' => $data['insert_tm'] ?? db_now(),
|
||||
];
|
||||
|
||||
// insert 수행
|
||||
if (!$this->insert($payload)) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => $this->db->error()['code'],
|
||||
'message' => $this->db->error()['message'],
|
||||
],
|
||||
'query' => (string)$this->getLastQuery()
|
||||
];
|
||||
}
|
||||
|
||||
return ['error' => ['code' => 0, 'message' => ''], 'id' => $this->getInsertID()];
|
||||
}
|
||||
}
|
||||
50
app/Models/Entities/V2chgstatModel.php
Normal file
50
app/Models/Entities/V2chgstatModel.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class V2chgstatModel extends Model
|
||||
{
|
||||
protected $table = 'v2_chg_stat';
|
||||
protected $primaryKey = 'seq'; // 실제 PK 컬럼명으로 수정하세요 (st_date, cpid, gbn_cd가 복합키인 경우도 있음)
|
||||
protected $allowedFields = ['vr_sq', 'stat_cd', 'insert_user', 'insert_tm'];
|
||||
|
||||
protected $useTimestamps = false; // insert_tm을 직접 넣으시므로 false
|
||||
|
||||
/**
|
||||
* 상태 변경 이력 저장 (CI4 통합 버전)
|
||||
* @param array $data ['vr_sq' => 값, 'stat_cd' => 값, ...]
|
||||
* @param string $saveType 'I'(Upsert), 'U'(Update)
|
||||
*/
|
||||
public function saveChgstat(array $data, string $saveType)
|
||||
{
|
||||
// 1. 기본값 세팅 (데이터 유연성 확보)
|
||||
$payload = [
|
||||
'vr_sq' => $data['vr_sq'] ?? null,
|
||||
'stat_cd' => $data['stat_cd'] ?? '10', // 기본값 30
|
||||
'insert_user' => $data['insert_user'] ?? 0,
|
||||
'insert_tm' => $data['insert_tm'] ?? date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
if (empty($payload['vr_sq'])) {
|
||||
throw new \Exception("V2chgstatModel Error: vr_sq is required.");
|
||||
}
|
||||
|
||||
if ($saveType === 'I') {
|
||||
// CI2 방식의 ON DUPLICATE KEY UPDATE 유지 (seq 번호 보존을 위해)
|
||||
$sql = "INSERT INTO v2_chg_stat (vr_sq, stat_cd, insert_user, insert_tm)
|
||||
VALUES (:vr_sq:, :stat_cd:, :insert_user:, :insert_tm:)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
insert_user = VALUES(insert_user),
|
||||
insert_tm = VALUES(insert_tm)";
|
||||
|
||||
return $this->db->query($sql, $payload);
|
||||
} else {
|
||||
// Update 방식
|
||||
return $this->where('vr_sq', $payload['vr_sq'])
|
||||
->where('stat_cd', $payload['stat_cd'])
|
||||
->set($payload)
|
||||
->update();
|
||||
}
|
||||
}
|
||||
}
|
||||
132
app/Models/Entities/V2modifyinfoModel.php
Normal file
132
app/Models/Entities/V2modifyinfoModel.php
Normal 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]);
|
||||
}
|
||||
}
|
||||
50
app/Models/Entities/V2stdailyModel.php
Normal file
50
app/Models/Entities/V2stdailyModel.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class V2stdailyModel extends Model
|
||||
{
|
||||
protected $table = 'v2_st_daily';
|
||||
protected $primaryKey = 'id'; // 실제 PK 컬럼명으로 수정하세요 (st_date, cpid, gbn_cd가 복합키인 경우도 있음)
|
||||
protected $allowedFields = ['st_date', 'cpid', 'gbn_cd', 'cnt'];
|
||||
|
||||
public function set_v2_st_daily($st_date, $cpid, $gbn_cd, $cnt, $cnt_type = 'add')
|
||||
{
|
||||
if (empty($cnt)) $cnt = 0;
|
||||
|
||||
$data = [];
|
||||
// 1. 날짜 처리
|
||||
$date_field = empty($st_date) ? "NOW()" : "?";
|
||||
if (!empty($st_date)) $data[] = $st_date;
|
||||
|
||||
// 2. 나머지 필드 바인딩 데이터 준비
|
||||
$data[] = $cpid;
|
||||
$data[] = $gbn_cd;
|
||||
$data[] = $cnt;
|
||||
|
||||
// 3. 중복 처리 로직 분기
|
||||
if (strtolower($cnt_type) === 'add') {
|
||||
// MariaDB에서 가장 안전한 바인딩 방식
|
||||
$sql = "INSERT INTO v2_st_daily (st_date, cpid, gbn_cd, cnt)
|
||||
VALUES ($date_field, ?, ?, ?)
|
||||
ON DUPLICATE KEY UPDATE cnt = cnt + ?";
|
||||
$data[] = $cnt; // UPDATE 절의 더하기 값을 위해 한 번 더 추가
|
||||
} else {
|
||||
// 중복 시 값을 덮어씌움 (VALUES 함수 사용)
|
||||
$sql = "INSERT INTO v2_st_daily (st_date, cpid, gbn_cd, cnt)
|
||||
VALUES ($date_field, ?, ?, ?)
|
||||
ON DUPLICATE KEY UPDATE cnt = VALUES(cnt)";
|
||||
}
|
||||
|
||||
// 쿼리 실행
|
||||
$result = $this->db->query($sql, $data);
|
||||
|
||||
return [
|
||||
'status' => $result ? true : false,
|
||||
'error' => $this->db->error(), // ['code', 'message']
|
||||
'last_query' => (string)$this->db->getLastQuery() // 디버깅용
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
231
app/Models/Entities/V2urlimgsaveModel.php
Normal file
231
app/Models/Entities/V2urlimgsaveModel.php
Normal 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();
|
||||
}
|
||||
}
|
||||
130
app/Models/Entities/VrfcReqModel.php
Normal file
130
app/Models/Entities/VrfcReqModel.php
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
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
|
||||
// {
|
||||
// // Insert data into the database
|
||||
// // This is a placeholder implementation
|
||||
|
||||
|
||||
|
||||
|
||||
// $articleNumber = $articleInfo['articleNumber']; // 매물 번호와 동일
|
||||
// $cpId = $articleInfo['cpId']; // CPID
|
||||
// $cpArticleNumber = $articleInfo['cpArticleNumber']; // CP 매물번호
|
||||
|
||||
// $rcpt_product = $articleInfo['realEstateTypeCode']; // 매물종류(코드)
|
||||
// $rcpt_product_nm = $articleInfo['realEstateType']; // 매물종류(한글명) // 아파트... ......
|
||||
|
||||
// $rcpt_deal_type = $articleInfo['tradeTypeCode']; // 거래구분(코드) A1, B1, B2
|
||||
// $rcpt_product_info1 = $articleInfo['tradeType']; // 거래구분(한글명) 매매, 전세, 월세
|
||||
|
||||
// $statusTypeCode = $articleInfo['statusTypeCode']; // E12 ...매물 상태 코드
|
||||
|
||||
// $vrfc_type_code = $articleInfo['verificationTypeCode']; // 확인유형코드 S, D, N, M, T, O
|
||||
// $owenrTypeCode = $articleInfo['ownerTypeCode'] ?? ''; // 소유자 유형 코드
|
||||
// $isUnregisteredVerificationRequested = $articleInfo['isUnregisteredVerificationRequested'] ?? false; // 미등기 확인요청 여부
|
||||
// $isBuildingRegisterAreaCheckRequested = $articleInfo['isBuildingRegisterAreaCheckRequested'] ?? false; // 건축물대장 면적확인 요청 여부
|
||||
// $isAutoVerificationRequested = $articleInfo['isAutoVerificationRequested'] ?? false; // 자동확인 요청 여부
|
||||
// // $verificationReference = $articleInfo['verificationReference'] ?? ''; // 확인참고사항
|
||||
// $exposureStartDateTime = $articleInfo['exposureStartDateTime'] ?? ''; // 노출시작일시
|
||||
|
||||
// $facilities['roomCount'] = $articleInfo['facilities']['roomCount'] ?? 0;
|
||||
// $facilities['bathroomCount'] = $articleInfo['facilities']['bathroomCount'] ?? 0;
|
||||
|
||||
// $address['legalDivision']['cityNumber'] = $articleInfo['address']['legalDivision']['cityNumber'] ?? '';
|
||||
// $address['legalDivision']['divisionNumber'] = $articleInfo['address']['legalDivision']['divisionNumber'] ?? '';
|
||||
// $address['legalDivision']['sectorNumber'] = $articleInfo['address']['legalDivision']['sectorNumber'] ?? '';
|
||||
// $address['legalDivision']['legalDivisionAddress'] = $articleInfo['address']['legalDivision']['legalDivisionAddress'] ?? '';
|
||||
// $address['complexNumber'] = $articleInfo['address']['complexNumber'] ?? null;
|
||||
// $address['complexName'] = $articleInfo['address']['complexName'] ?? null;
|
||||
// $address['pyeongTypeNumber'] = $articleInfo['address']['pyeongTypeNumber'] ?? null;
|
||||
// $address['hoName'] = $articleInfo['address']['hoName'] ?? null;
|
||||
|
||||
// $address['isVirtualAddress'] = $articleInfo['address']['isVirtualAddress'] ?? false;
|
||||
// $address['correspondenceFloorCount'] = $articleInfo['address']['correspondenceFloorCount'] ?? 0;
|
||||
// $address['longitude'] = $articleInfo['address']['longitude'] ?? 0;
|
||||
// $address['latitude'] = $articleInfo['address']['latitude'] ?? 0;
|
||||
// $address['isDongHoChecked'] = $articleInfo['address']['isDongHoChecked'] ?? null;
|
||||
// $address['inquiryLevel'] = $articleInfo['address']['inquiryLevel'] ?? null;
|
||||
|
||||
// $space['totalSpace'] = $articleInfo['space']['totalSpace'] ?? null;
|
||||
// $space['groundSpace'] = $articleInfo['space']['groundSpace'] ?? null;
|
||||
// $space['buildingSpace'] = $articleInfo['space']['buildingSpace'] ?? null;
|
||||
// $space['supplySpace'] = $articleInfo['space']['supplySpace'] ?? 0;
|
||||
// $space['exclusiveSpace'] = $articleInfo['space']['exclusiveSpace'] ?? 0;
|
||||
|
||||
// $price['dealAmount'] = $articleInfo['price']['dealAmount'] ?? 0;
|
||||
// $price['warrantyAmount'] = $articleInfo['price']['warrantyAmount'] ?? 0;
|
||||
// $price['leaseAmount'] = $articleInfo['price']['leaseAmount'] ?? 0;
|
||||
|
||||
// $floor['correspondenceFloorCount'] = $articleInfo['floor']['correspondenceFloorCount'] ?? 0;
|
||||
// $floor['correspondenceFloorType'] = $articleInfo['floor']['correspondenceFloorType'] ?? null;
|
||||
// $floor['totalFloorCount'] = $articleInfo['floor']['totalFloorCount'] ?? 0;
|
||||
// $floor['undergroundFloorCount'] = $articleInfo['floor']['undergroundFloorCount'] ?? 0;
|
||||
|
||||
// $seller['sellerTelephoneNumber'] = $articleInfo['seller']['sellerTelephoneNumber'] ?? null;
|
||||
// $seller['sellerName'] = $articleInfo['seller']['sellerName'] ?? null;
|
||||
// $seller['ownerTelephoneNumber'] = $articleInfo['seller']['ownerTelephoneNumber'] ?? null;
|
||||
// $seller['ownerName'] = $articleInfo['seller']['ownerName'] ?? null;
|
||||
// $seller['isOwnerCertificationAgree'] = $articleInfo['seller']['isOwnerCertificationAgree'] ?? null;
|
||||
// $seller['isDirectTrade'] = $articleInfo['seller']['isDirectTrade'] ?? null;
|
||||
|
||||
// $realtor['realtorName'] = $articleInfo['realtor']['realtorName'] ?? null;
|
||||
// $realtor['representativeCellphoneNumber'] = $articleInfo['realtor']['representativeCellphoneNumber'] ?? null;
|
||||
// $realtor['representativeTelephoneNumber'] = $articleInfo['realtor']['representativeTelephoneNumber'] ?? null;
|
||||
|
||||
// $files = $articleInfo['files'] ?? [];
|
||||
|
||||
|
||||
|
||||
|
||||
// return true;
|
||||
// }
|
||||
}
|
||||
154
app/Models/Entities/WatermarkModel.php
Normal file
154
app/Models/Entities/WatermarkModel.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Entities;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class WatermarkModel extends Model
|
||||
{
|
||||
protected $table = 'watermark';
|
||||
protected $primaryKey = ['cpid', 'wm_type']; // 복합키
|
||||
|
||||
protected $useAutoIncrement = false;
|
||||
protected $returnType = 'array';
|
||||
protected $useSoftDeletes = false;
|
||||
|
||||
protected $allowedFields = [
|
||||
'cpid',
|
||||
'wm_type',
|
||||
'wm_img_path',
|
||||
'wm_img_height',
|
||||
'wm_img_width',
|
||||
'wm_position',
|
||||
'wm_img_opacity',
|
||||
'wm_space',
|
||||
'text_font',
|
||||
'text_color',
|
||||
'text_opacity',
|
||||
'text_size',
|
||||
'text_pixel',
|
||||
'img_width_min',
|
||||
'img_width_max'
|
||||
];
|
||||
|
||||
protected $useTimestamps = false;
|
||||
|
||||
protected $validationRules = [
|
||||
'cpid' => 'required|max_length[20]',
|
||||
'wm_type' => 'required|integer',
|
||||
'wm_img_path' => 'required|max_length[300]',
|
||||
'wm_img_height' => 'required|integer',
|
||||
'wm_img_width' => 'required|integer',
|
||||
'wm_position' => 'required|max_length[2]',
|
||||
'wm_img_opacity' => 'required|integer',
|
||||
'wm_space' => 'required|integer',
|
||||
'img_width_min' => 'required|integer',
|
||||
'img_width_max' => 'required|integer'
|
||||
];
|
||||
|
||||
protected $validationMessages = [];
|
||||
protected $skipValidation = false;
|
||||
|
||||
/**
|
||||
* 워터마크 정보 조회 (복합키)
|
||||
*
|
||||
* @param string $cpid
|
||||
* @param int $wm_type
|
||||
* @return array|null
|
||||
*/
|
||||
public function getWatermark($cpid, $wm_type)
|
||||
{
|
||||
return $this->where('cpid', $cpid)
|
||||
->where('wm_type', $wm_type)
|
||||
->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* cpid로 워터마크 목록 조회
|
||||
*
|
||||
* @param string $cpid
|
||||
* @return array
|
||||
*/
|
||||
public function getWatermarksByCpid($cpid)
|
||||
{
|
||||
return $this->where('cpid', $cpid)->findAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* 워터마크 타입별 조회
|
||||
*
|
||||
* @param int $wm_type
|
||||
* @return array
|
||||
*/
|
||||
public function getWatermarksByType($wm_type)
|
||||
{
|
||||
return $this->where('wm_type', $wm_type)->findAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* 워터마크 정보 저장/업데이트
|
||||
*
|
||||
* @param array $data
|
||||
* @return bool
|
||||
*/
|
||||
public function saveWatermark($data)
|
||||
{
|
||||
if (!isset($data['cpid']) || !isset($data['wm_type'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 복합키로 기존 데이터 확인
|
||||
$existing = $this->getWatermark($data['cpid'], $data['wm_type']);
|
||||
|
||||
if ($existing) {
|
||||
// 업데이트
|
||||
return $this->where('cpid', $data['cpid'])
|
||||
->where('wm_type', $data['wm_type'])
|
||||
->set($data)
|
||||
->update();
|
||||
} else {
|
||||
// 삽입
|
||||
return $this->insert($data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 워터마크 삭제 (복합키)
|
||||
*
|
||||
* @param string $cpid
|
||||
* @param int $wm_type
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteWatermark($cpid, $wm_type)
|
||||
{
|
||||
return $this->where('cpid', $cpid)
|
||||
->where('wm_type', $wm_type)
|
||||
->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* cpid로 모든 워터마크 삭제
|
||||
*
|
||||
* @param string $cpid
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteAllByCpid($cpid)
|
||||
{
|
||||
return $this->where('cpid', $cpid)->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* 이미지 크기 범위로 워터마크 조회
|
||||
*
|
||||
* @param string $cpid
|
||||
* @param int $img_width
|
||||
* @return array|null
|
||||
*/
|
||||
public function getWatermarkByImageSize($cpid, $img_width)
|
||||
{
|
||||
return $this->where('cpid', $cpid)
|
||||
->where('img_width_min <=', $img_width)
|
||||
->where('img_width_max >=', $img_width)
|
||||
->findAll();
|
||||
}
|
||||
}
|
||||
1321
app/Models/article/DeptModel.php
Normal file
1321
app/Models/article/DeptModel.php
Normal file
File diff suppressed because it is too large
Load Diff
878
app/Models/article/GroundCntModel.php
Normal file
878
app/Models/article/GroundCntModel.php
Normal 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();
|
||||
}
|
||||
}
|
||||
299
app/Models/article/ProcessibleModel.php
Normal file
299
app/Models/article/ProcessibleModel.php
Normal file
@@ -0,0 +1,299 @@
|
||||
<?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)
|
||||
{
|
||||
$usr_sq = session('usr_sq');
|
||||
$now = date('Y-m-d H:i:s');
|
||||
|
||||
$insertData = [
|
||||
'sc_date' => $data['sc_date'],
|
||||
'region_cd' => $data['region_cd'],
|
||||
'am_cnt' => $data['am_cnt'],
|
||||
'pm_cnt' => $data['pm_cnt'],
|
||||
'day_cnt' => (int)$data['am_cnt'] + (int)$data['pm_cnt'],
|
||||
'insert_usr' => $usr_sq,
|
||||
'insert_tm' => $now,
|
||||
'update_usr' => $usr_sq,
|
||||
'update_tm' => $now
|
||||
];
|
||||
|
||||
// CI4 Query Builder upsert (INSERT ... ON DUPLICATE KEY UPDATE)
|
||||
$result = $this->db->table('service_count')->upsert($insertData);
|
||||
|
||||
return [
|
||||
'success' => $result !== false,
|
||||
'msg' => $result !== false ? '성공' : '저장실패'
|
||||
];
|
||||
}
|
||||
|
||||
public function saveCount($data)
|
||||
{
|
||||
$usr_sq = session('usr_sq');
|
||||
$now = date('Y-m-d H:i:s');
|
||||
|
||||
$insertData = [
|
||||
'sc_date' => '0000-00-00',
|
||||
'region_cd' => $data['region_cd'],
|
||||
'am_cnt' => $data['am_cnt'],
|
||||
'pm_cnt' => $data['pm_cnt'],
|
||||
'day_cnt' => (int)$data['am_cnt'] + (int)$data['pm_cnt'],
|
||||
'insert_usr' => $usr_sq,
|
||||
'insert_tm' => $now,
|
||||
'update_usr' => $usr_sq,
|
||||
'update_tm' => $now
|
||||
];
|
||||
|
||||
// CI4 Query Builder upsert
|
||||
$result = $this->db->table('service_count')->upsert($insertData);
|
||||
|
||||
// 실행된 쿼리 로그 출력
|
||||
$lastQuery = $this->db->getLastQuery();
|
||||
log_message('info', '[ProcessibleModel::saveCount] Query: ' . $lastQuery);
|
||||
log_message('info', '[ProcessibleModel::saveCount] Affected Rows: ' . $this->db->affectedRows());
|
||||
|
||||
if ($result === false) {
|
||||
$error = $this->db->error();
|
||||
log_message('error', '[ProcessibleModel::saveCount] Error: ' . json_encode($error));
|
||||
|
||||
return [
|
||||
'success' => false,
|
||||
'msg' => '저장실패: ' . ($error['message'] ?? '알 수 없는 오류'),
|
||||
'query' => (string) $lastQuery,
|
||||
'error' => $error
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'query' => (string) $lastQuery,
|
||||
'affected_rows' => $this->db->affectedRows()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 슬롯 동기화
|
||||
*
|
||||
*/
|
||||
public function getSyncSlotData($baseDate, $region_cd)
|
||||
{
|
||||
|
||||
$sql = "SELECT sc_date, region_cd, am_cnt, pm_cnt, day_cnt FROM service_count WHERE sc_date = ? AND region_cd IN ?";
|
||||
$datas = [
|
||||
$baseDate,
|
||||
$region_cd
|
||||
];
|
||||
$query = $this->db->query($sql, $datas);
|
||||
return $query->getResultArray();
|
||||
|
||||
}
|
||||
}
|
||||
2048
app/Models/article/ReceiptModel.php
Normal file
2048
app/Models/article/ReceiptModel.php
Normal file
File diff suppressed because it is too large
Load Diff
962
app/Models/article/RecordModel.php
Normal file
962
app/Models/article/RecordModel.php
Normal 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();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -8,50 +8,85 @@ class CodeModel extends Model
|
||||
/**
|
||||
* 코드목록 읽어오기(Y만)
|
||||
*/
|
||||
public function getCodeList($category)
|
||||
{
|
||||
$sql = "SELECT category, category_nm, cd, cd_nm FROM codes" .
|
||||
" WHERE category = ?" .
|
||||
" AND use_yn = 'Y'" .
|
||||
" ORDER BY view_odr";
|
||||
$data = [$category];
|
||||
$query = $this->db->query($sql, $data);
|
||||
|
||||
return $query->getResultArray();
|
||||
}
|
||||
|
||||
|
||||
public function getCodeLists($data): array
|
||||
public function getCodeList(string $category): array
|
||||
{
|
||||
return $this->db->table('codes')
|
||||
->select('category, category_nm, cd, cd_nm')
|
||||
->whereIn('category', $data)
|
||||
->where('category', $category)
|
||||
->where('use_yn', 'Y')
|
||||
->orderBy('view_odr')
|
||||
->orderBy('view_odr', 'asc')
|
||||
->get()
|
||||
->getResultArray();
|
||||
}
|
||||
|
||||
public function getCategoryCodeList($category = [], $useYn = '')
|
||||
|
||||
public function getCodeLists(array $categories): array
|
||||
{
|
||||
$this->db->select('category, cd, cd_nm, use_yn');
|
||||
$this->db->from('codes');
|
||||
$this->db->where_in('category', $category);
|
||||
if (!empty($useYn)) {
|
||||
$this->db->where('use_yn', $useYn);
|
||||
if (empty($categories)) {
|
||||
return [];
|
||||
}
|
||||
$this->db->order_by('category', 'asc');
|
||||
$this->db->order_by('view_odr', 'asc');
|
||||
|
||||
$query = $this->db->get();
|
||||
$result = $this->db->table('codes')
|
||||
->select('category, category_nm, cd, cd_nm')
|
||||
->whereIn('category', $categories)
|
||||
->where('use_yn', 'Y')
|
||||
->orderBy('category', 'asc')
|
||||
->orderBy('view_odr', 'asc')
|
||||
->get()
|
||||
->getResultArray();
|
||||
|
||||
//echo $this->db->last_query()."<br>";
|
||||
$groupedData = [];
|
||||
foreach ($result as $item) {
|
||||
$category = $item['category'];
|
||||
|
||||
if (!isset($groupedData[$category])) {
|
||||
$groupedData[$category] = [
|
||||
'name' => $item['category_nm'],
|
||||
'items' => []
|
||||
];
|
||||
}
|
||||
|
||||
$groupedData[$category]['items'][$item['cd']] = $item['cd_nm'];
|
||||
}
|
||||
|
||||
return $groupedData;
|
||||
}
|
||||
|
||||
public function getCategoryCodeList(array $category = [], string $useYn = ''): array
|
||||
{
|
||||
if (empty($category)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$builder = $this->db->table('codes');
|
||||
$builder->select('category, cd, cd_nm, use_yn');
|
||||
$builder->whereIn('category', $category);
|
||||
if (!empty($useYn)) {
|
||||
$builder->where('use_yn', $useYn);
|
||||
}
|
||||
$builder->orderBy('category', 'asc');
|
||||
$builder->orderBy('view_odr', 'asc');
|
||||
|
||||
$query = $builder->get();
|
||||
|
||||
//여기 아래부분을 해줘야 배열을 카테고리로 뽑아쓸수있다 위에는 배열에 배열이담김
|
||||
$codes = [];
|
||||
foreach ($query->getResultArray() as $row) {
|
||||
$codes[$row['category']][] = ['cd' => $row['cd'], 'cd_nm' => $row['cd_nm']];
|
||||
}
|
||||
|
||||
return $codes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 코드 상세
|
||||
*/
|
||||
public function getCodeDetail(string $category, string $code): array
|
||||
{
|
||||
return $this->db->table('codes')
|
||||
->select('category, category_nm, cd, cd_nm')
|
||||
->where('category', $category)
|
||||
->where('cd', $code)
|
||||
->get()
|
||||
->getResultArray();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
44
app/Models/interest/RatesModel.php
Normal file
44
app/Models/interest/RatesModel.php
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
166
app/Models/receipt/ReceiptModel.php
Normal file
166
app/Models/receipt/ReceiptModel.php
Normal file
@@ -0,0 +1,166 @@
|
||||
<?php
|
||||
namespace App\Models\receipt;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class ReceiptModel extends Model
|
||||
{
|
||||
|
||||
/**
|
||||
* 홍보확인서 fax 목록에서 선택할 경우.
|
||||
*/
|
||||
public function saveFaxImage($faxSq, $rcpt_sq, $rsrv_sq, $img_type, $img_path, $img_filenm, $img_nm, $img_size, $img_width, $img_height, $receipt)
|
||||
{
|
||||
$this->db->transStart();
|
||||
|
||||
$usr_sq = session('usr_sq');
|
||||
$usr_id = session('usr_id');
|
||||
|
||||
$sql = "";
|
||||
$data = [];
|
||||
$res = "";
|
||||
$remark = "";
|
||||
|
||||
$result_img = [];
|
||||
|
||||
if ($img_type == 'I8') {
|
||||
$yn_sql = "update receipt " .
|
||||
" set parcel_out_yn = 'Y' " .
|
||||
" where rcpt_sq = ? ";
|
||||
$yn_data = [$rcpt_sq];
|
||||
$this->db->query($yn_sql, $yn_data);
|
||||
|
||||
$sql = "update fax_imgs " .
|
||||
" set bunyang_yn = 'Y' " .
|
||||
" where fax_sq = ? ";
|
||||
$data = [$faxSq];
|
||||
$this->db->query($sql, $data);
|
||||
}
|
||||
|
||||
//홍보확인서, 현장확인 내역서 저장
|
||||
if ($img_type == 'I1' || $img_type == 'I2' || $img_type == 'I10') {
|
||||
//기존에 있던 이미지는 사용유무 N으로 변경
|
||||
$sql = "select img_sq from result_imgs" .
|
||||
" WHERE rsrv_sq = ?" .
|
||||
" AND img_type = ?" .
|
||||
" AND use_yn = 'Y'";
|
||||
$data = [$rsrv_sq, $img_type];
|
||||
$res = $this->db->query($sql, $data);
|
||||
$row = $res->getRowArray();
|
||||
if (!empty($row)) {
|
||||
$this->updateImgSqNullOnFaxImgs($row['img_sq']); // 홍보확인서 재지정일
|
||||
}
|
||||
|
||||
$sql = "UPDATE result_imgs" .
|
||||
" SET use_yn = 'N'" .
|
||||
" WHERE rsrv_sq = ?" .
|
||||
" AND img_type = ?" .
|
||||
" AND use_yn = 'Y'";
|
||||
$data = [$rsrv_sq, $img_type];
|
||||
$res = $this->db->query($sql, $data);
|
||||
|
||||
//새로운 이미지 생성
|
||||
$sql = "INSERT INTO result_imgs(rsrv_sq, use_yn, img_type, view_odr, img_path, img_filenm, img_nm, img_size, img_width, img_height, insert_usr, insert_tm)" .
|
||||
"VALUES (?, 'Y', ?, 1, ?, ?, ?, ?, ?, ?, ?, NOW())";
|
||||
$data = [$rsrv_sq, $img_type, $img_path, $img_filenm, $img_nm, $img_size, $img_width, $img_height, $usr_sq];
|
||||
$res = $this->db->query($sql, $data);
|
||||
|
||||
if ($img_type == 'I1')
|
||||
$remark = "홍보확인서 사진 업로드";
|
||||
else if ($img_type == 'I2')
|
||||
$remark = "현장확인 내역서 사진 업로드";
|
||||
else if ($img_type == 'I10')
|
||||
$remark = "촬영동의서 사진 업로드";
|
||||
else if ($img_type == 'I11')
|
||||
$remark = "체크리스트 사진 업로드";
|
||||
} else {
|
||||
//이미지 순번 검색
|
||||
$odr_sql = "SELECT COALESCE(MAX(view_odr), 0) + 1 as seq FROM result_imgs WHERE rsrv_sq = ? AND img_type = ? AND use_yn = 'Y'";
|
||||
$odr_data = [$rsrv_sq, $img_type];
|
||||
$query = $this->db->query($odr_sql, $odr_data);
|
||||
$row = $query->getRowArray();
|
||||
$view_odr = $row['seq'];
|
||||
|
||||
$sql = "INSERT INTO result_imgs(rsrv_sq, use_yn, img_type, view_odr, img_path, img_filenm, img_nm, img_size, img_width, img_height, insert_usr, insert_tm)" .
|
||||
"VALUES (?, 'Y', ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())";
|
||||
$data = array(
|
||||
$rsrv_sq,
|
||||
$img_type,
|
||||
$view_odr,
|
||||
$img_path,
|
||||
$img_filenm,
|
||||
$img_nm,
|
||||
$img_size,
|
||||
$img_width,
|
||||
$img_height,
|
||||
$usr_sq
|
||||
);
|
||||
|
||||
$res = $this->db->query($sql, $data);
|
||||
|
||||
if ($img_type == 'I3')
|
||||
$remark = "건물외관 사진 업르도";
|
||||
else if ($img_type == 'I4')
|
||||
$remark = "내부 사진 업로드";
|
||||
else if ($img_type == 'I8')
|
||||
$remark = "분양권 사진 업로드";
|
||||
|
||||
}
|
||||
|
||||
|
||||
$imgSq = $this->db->insertID();
|
||||
$this->updateImgSqOnFaxImgs($faxSq, $imgSq);
|
||||
|
||||
if (!$res) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->db->transComplete();
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 홍보확인서를 재지정했을 경우 기존의 홍보확인서는 선택되지 않음으로 ...
|
||||
*/
|
||||
public function updateImgSqNullOnFaxImgs($imgSq)
|
||||
{
|
||||
$sql = "UPDATE fax_imgs" .
|
||||
" SET img_sq = null" .
|
||||
" WHERE img_sq = ?";
|
||||
$data = [$imgSq];
|
||||
$this->db->query($sql, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* FAX이미지를 홍보확인서에서 선택할 경우...
|
||||
*/
|
||||
public function updateImgSqOnFaxImgs($faxSq, $imgSq)
|
||||
{
|
||||
$sql = "UPDATE fax_imgs" .
|
||||
" SET img_sq = ?" .
|
||||
" WHERE fax_sq = ?";
|
||||
|
||||
$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();
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ class AssignModel extends Model
|
||||
public function getTotalCount($data)
|
||||
{
|
||||
$sql = "SELECT
|
||||
COUNT(*) AS cnt
|
||||
COUNT(DISTINCT b.usr_sq) 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
|
||||
@@ -139,13 +139,13 @@ class AssignModel extends Model
|
||||
|
||||
if (!empty($data['srchTxt'])) {
|
||||
if ($data['srchType'] === "1") {
|
||||
$sql .= "AND usr_id like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
$sql .= "AND b.usr_id like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
} else if ($data['srchType'] === "2") {
|
||||
$sql .= "AND usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
$sql .= "AND b.usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
} else {
|
||||
$sql .= "AND (
|
||||
usr_id like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
OR usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
b.usr_id like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
OR b.usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
) ";
|
||||
}
|
||||
}
|
||||
@@ -158,27 +158,31 @@ 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
|
||||
, 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
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '11' THEN 1 ELSE 0 END) AM11
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '12' THEN 1 ELSE 0 END) AM12
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour IN ('00','01','02','03','04','05','06','07','08') THEN 1 ELSE 0 END) AMETC
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('01', '13') THEN 1 ELSE 0 END) PM01
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('02', '14') THEN 1 ELSE 0 END) PM02
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('03', '15') THEN 1 ELSE 0 END) PM03
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('04', '16') THEN 1 ELSE 0 END) PM04
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('05', '17') THEN 1 ELSE 0 END) PM05
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('06', '18') THEN 1 ELSE 0 END) PM06
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('07', '19') THEN 1 ELSE 0 END) PM07
|
||||
, 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
|
||||
sub.*,
|
||||
COUNT(*) OVER() as total_count
|
||||
FROM (
|
||||
SELECT
|
||||
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
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '11' THEN 1 ELSE 0 END) AM11
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour = '12' THEN 1 ELSE 0 END) AM12
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'AM' AND a.rsrv_tm_hour IN ('00','01','02','03','04','05','06','07','08') THEN 1 ELSE 0 END) AMETC
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('01', '13') THEN 1 ELSE 0 END) PM01
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('02', '14') THEN 1 ELSE 0 END) PM02
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('03', '15') THEN 1 ELSE 0 END) PM03
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('04', '16') THEN 1 ELSE 0 END) PM04
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('05', '17') THEN 1 ELSE 0 END) PM05
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('06', '18') THEN 1 ELSE 0 END) PM06
|
||||
, SUM(CASE WHEN a.rsrv_tm_ap = 'PM' AND a.rsrv_tm_hour IN ('07', '19') THEN 1 ELSE 0 END) PM07
|
||||
, 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 ";
|
||||
WHERE 1=1 ";
|
||||
|
||||
if (!empty($data['bonbu'])) {
|
||||
$sql .= "AND c.pdept_sq = {$data['bonbu']} ";
|
||||
@@ -212,20 +216,20 @@ class AssignModel extends Model
|
||||
|
||||
if (!empty($data['srchTxt'])) {
|
||||
if ($data['srchType'] === "1") {
|
||||
$sql .= "AND usr_id like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
$sql .= "AND b.usr_id like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
} else if ($data['srchType'] === "2") {
|
||||
$sql .= "AND usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
$sql .= "AND b.usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' ) ";
|
||||
} else {
|
||||
$sql .= "AND (
|
||||
usr_id like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
OR usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
b.usr_id like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
OR b.usr_nm like CONCAT('%', '{$data['srchTxt']}', '%' )
|
||||
) ";
|
||||
}
|
||||
}
|
||||
|
||||
$sql .= "GROUP BY b.usr_id, b.usr_nm ";
|
||||
|
||||
$sql .= "LIMIT {$start}, {$end}";
|
||||
$sql .= "GROUP BY b.usr_id, b.usr_nm
|
||||
) sub
|
||||
LIMIT {$start}, {$end}";
|
||||
|
||||
$query = $this->db->query($sql);
|
||||
|
||||
|
||||
@@ -155,4 +155,447 @@ class M415Model extends Model
|
||||
|
||||
return $query->getResultArray();
|
||||
}
|
||||
|
||||
|
||||
// 팩스 인입시간
|
||||
public function getFaxSaveTime($vr_sq)
|
||||
{
|
||||
$sql = "SELECT recv_time from fax_imgs" .
|
||||
" WHERE vr_sq = ?" .
|
||||
" ORDER BY fax_sq DESC" .
|
||||
" LIMIT 1";
|
||||
$data = [
|
||||
$vr_sq
|
||||
];
|
||||
$query = $this->db->query($sql, $data);
|
||||
|
||||
$res = $query->getRowArray();
|
||||
return $res;
|
||||
}
|
||||
|
||||
// 서류/전화 불일치 시간
|
||||
public function getFaxFailTimeForHistory($vr_sq)
|
||||
{
|
||||
$sql = "select insert_tm from v2_chg_history" .
|
||||
" where vr_sq = ?" .
|
||||
" and stat_cd = '39'" .
|
||||
" and chg_type= 'C9'" .
|
||||
" order by seq desc" .
|
||||
" limit 1";
|
||||
$data = [
|
||||
$vr_sq
|
||||
];
|
||||
$query = $this->db->query($sql, $data);
|
||||
// echo $this->db->last_query().'<br>';
|
||||
$res = $query->row_array();
|
||||
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)
|
||||
{
|
||||
$sql = "select insert_tm from v2_chg_history" .
|
||||
" where vr_sq = ?" .
|
||||
" and stat_cd = '40'" .
|
||||
" and chg_type= 'C9'" .
|
||||
" order by seq desc" .
|
||||
" limit 1";
|
||||
$data = array(
|
||||
$vr_sq
|
||||
);
|
||||
$query = $this->db->query($sql, $data);
|
||||
// echo $this->db->last_query().'<br>';
|
||||
$res = $query->row_array();
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
//서류전화 (검증실패/검증완료)
|
||||
public function insert_v2_time_required_Conf_Done($atcl_no, $cpid, $vrfc_type, $insert_tm, $tel_doc_conf_dt, $finishTime)
|
||||
{
|
||||
if (substr($insert_tm, 0, 10) == substr($tel_doc_conf_dt, 0, 10)) {
|
||||
switch ($vrfc_type) {
|
||||
case 'D':
|
||||
if (('12:00:00' < substr($insert_tm, -8)) && (substr($insert_tm, -8) < '13:00:00')) {//접수시간이 12~13시 사이면 13시로 해준다
|
||||
if (substr($tel_doc_conf_dt, -8) > '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($tel_doc_conf_dt, -8) < '17:30:00' || substr($tel_doc_conf_dt, -8) < '08:59:59')
|
||||
) {
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:00:00";
|
||||
}
|
||||
;
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
if (('13:00:00' < substr($insert_tm, -8)) && (substr($insert_tm, -8) < '14:00:00')) {//접수시간이 13~14시 사이면 14시로 해준다
|
||||
if (substr($tel_doc_conf_dt, -8) > '14:00:00') { //검증완료가 14시 '이후'에 끝나면 접수시간을 14시로 변경해준다
|
||||
$insert_tm = date("Y-m-d", time()) . " 14:00:00";
|
||||
}
|
||||
} else if (
|
||||
(substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') &&
|
||||
(substr($tel_doc_conf_dt, -8) < '17:30:00' || substr($tel_doc_conf_dt, -8) < '08:59:59')
|
||||
) { //접수와 확인완료시간이 모두 17:30:00 ~ 09:00:00 사이면
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:30:00";
|
||||
}
|
||||
;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if ($vrfc_type == 'D') { //홍보
|
||||
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";
|
||||
}
|
||||
} else { //전화
|
||||
if (substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') {
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:30:00";
|
||||
}
|
||||
}
|
||||
}
|
||||
$stan_date = substr($insert_tm, 0, 10);
|
||||
|
||||
$sql = "INSERT INTO v2_time_required(stan_date, atcl_no, cpid, vrfc_type, insert_tm, tel_doc_conf_dt,conf_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 = [
|
||||
$stan_date,
|
||||
$atcl_no,
|
||||
$cpid,
|
||||
$vrfc_type,
|
||||
$insert_tm,
|
||||
$tel_doc_conf_dt,
|
||||
$tel_doc_conf_dt,
|
||||
$insert_tm,
|
||||
$tel_doc_conf_dt,
|
||||
$insert_tm
|
||||
];
|
||||
$this->db->query($sql, $data);
|
||||
}
|
||||
|
||||
//서류전화 확인완료(일치/불일치)
|
||||
//서류전화 (검증실패/검증완료)
|
||||
public function insert_v2_time_required_Conf($atcl_no, $cpid, $vrfc_type, $insert_tm, $tel_doc_conf_dt, $finishTime)
|
||||
{
|
||||
if (substr($insert_tm, 0, 10) == substr($tel_doc_conf_dt, 0, 10)) {
|
||||
switch ($vrfc_type) {
|
||||
case 'D':
|
||||
if (('12:00:00' < substr($insert_tm, -8)) && (substr($insert_tm, -8) < '13:00:00')) {//접수시간이 12~13시 사이면 13시로 해준다
|
||||
if (substr($tel_doc_conf_dt, -8) > '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($tel_doc_conf_dt, -8) < '17:30:00' || substr($tel_doc_conf_dt, -8) < '08:59:59')
|
||||
) {
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:00:00";
|
||||
}
|
||||
;
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
if (('13:00:00' < substr($insert_tm, -8)) && (substr($insert_tm, -8) < '14:00:00')) {//접수시간이 13~14시 사이면 14시로 해준다
|
||||
if (substr($tel_doc_conf_dt, -8) > '14:00:00') { //검증완료가 14시 '이후'에 끝나면 접수시간을 14시로 변경해준다
|
||||
$insert_tm = date("Y-m-d", time()) . " 14:00:00";
|
||||
}
|
||||
} else if (
|
||||
(substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') &&
|
||||
(substr($tel_doc_conf_dt, -8) < '17:30:00' || substr($tel_doc_conf_dt, -8) < '08:59:59')
|
||||
) { //접수와 확인완료시간이 모두 17:30:00 ~ 09:00:00 사이면
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:30:00";
|
||||
}
|
||||
;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if ($vrfc_type == 'D') { //홍보
|
||||
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";
|
||||
}
|
||||
} else { //전화
|
||||
if (substr($insert_tm, -8) > '17:30:00' || substr($insert_tm, -8) < '08:59:59') {
|
||||
$insert_tm = date("Y-m-d", time()) . " 09:30:00";
|
||||
}
|
||||
}
|
||||
}
|
||||
$stan_date = substr($insert_tm, 0, 10);
|
||||
|
||||
$sql = "INSERT INTO v2_time_required(stan_date, atcl_no, cpid, vrfc_type, insert_tm, tel_doc_conf_dt,conf_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,
|
||||
$tel_doc_conf_dt,
|
||||
$tel_doc_conf_dt,
|
||||
$insert_tm,
|
||||
$tel_doc_conf_dt,
|
||||
$insert_tm
|
||||
);
|
||||
$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;
|
||||
}
|
||||
}
|
||||
119
app/Models/v2/BaseV2Model.php
Normal file
119
app/Models/v2/BaseV2Model.php
Normal file
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\v2;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
/**
|
||||
* BaseV2Model
|
||||
* V2 모듈 공통 메서드: 지역/본부/팀/담당자 조회
|
||||
* 각 모듈 Model은 이 클래스를 상속받아 getTotalCount/getResultList/getExcelList 등 모듈 고유 메서드만 구현합니다.
|
||||
*/
|
||||
abstract class BaseV2Model 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();
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
1440
app/Models/v2/M702Model.php
Normal file
1440
app/Models/v2/M702Model.php
Normal file
File diff suppressed because it is too large
Load Diff
2130
app/Models/v2/M703Model.php
Normal file
2130
app/Models/v2/M703Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1470
app/Models/v2/M704Model.php
Normal file
1470
app/Models/v2/M704Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1462
app/Models/v2/M705Model.php
Normal file
1462
app/Models/v2/M705Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1351
app/Models/v2/M706Model.php
Normal file
1351
app/Models/v2/M706Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1877
app/Models/v2/M708Model.php
Normal file
1877
app/Models/v2/M708Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1013
app/Models/v2/M709Model.php
Normal file
1013
app/Models/v2/M709Model.php
Normal file
File diff suppressed because it is too large
Load Diff
612
app/Models/v2/M710Model.php
Normal file
612
app/Models/v2/M710Model.php
Normal file
@@ -0,0 +1,612 @@
|
||||
<?php
|
||||
namespace App\Models\v2;
|
||||
|
||||
use App\Models\v2\BaseV2Model;
|
||||
|
||||
class M710Model extends BaseV2Model
|
||||
{
|
||||
|
||||
public function getTotalCount($data)
|
||||
{
|
||||
$sql = "SELECT
|
||||
COUNT(*) AS cnt
|
||||
FROM v2_vrfc_req b
|
||||
JOIN v2_article_info a ON a.vr_sq = b.vr_sq
|
||||
JOIN v2_modify_info c ON c.vr_sq = a.vr_sq
|
||||
LEFT JOIN v2_article_info_etc c1 ON c1.vr_sq = a.vr_sq
|
||||
JOIN v2_stop_api_save_info k ON k.atcl_no = a.atcl_no AND k.status IN ('stop','wait','err')
|
||||
LEFT JOIN region_codes f ON f.region_cd = a.address_code
|
||||
LEFT JOIN v2_chg_stat d ON d.vr_sq = a.vr_sq AND d.stat_cd = '35'
|
||||
LEFT JOIN v2_chg_stat d45 ON d45.vr_sq = a.vr_sq AND d45.stat_cd = '45'
|
||||
LEFT JOIN v2_chg_stat d49 ON d49.vr_sq = a.vr_sq AND d49.stat_cd = '49'
|
||||
LEFT JOIN v2_chg_stat e ON e.vr_sq = a.vr_sq AND e.stat_cd = '60'
|
||||
LEFT JOIN codes g ON g.cd = b.stat_cd AND g.category = 'STEP_VERIFICATION'
|
||||
LEFT JOIN codes h ON h.cd = b.vrfc_type AND h.category = 'VRFCREQ_WAY'
|
||||
LEFT JOIN users i ON i.usr_id = a.charger
|
||||
LEFT JOIN users j ON j.usr_id = a.reg_charger
|
||||
LEFT JOIN v2_chg_stat d2 ON d2.vr_sq = a.vr_sq AND d2.stat_cd = '39'
|
||||
WHERE b.insert_tm >= DATE_ADD(CURDATE(), INTERVAL -2 MONTH) ";
|
||||
|
||||
|
||||
// 매물번호
|
||||
if (!empty($data['atcl_no'])) {
|
||||
$sql .= "AND a.atcl = '{$data['atcl_no']}' ";
|
||||
} else {
|
||||
// 현재상태
|
||||
if (!empty($data['stat_cd'])) {
|
||||
$sql .= "AND b.stat_cd = '{$data['stat_cd']}' ";
|
||||
}
|
||||
|
||||
// 중개소
|
||||
if (!empty($data['realtor_nm'])) {
|
||||
$sql .= "AND a.realtor_nm = '{$data['realtor_nm']}' ";
|
||||
}
|
||||
|
||||
// 매물구분
|
||||
if (!empty($data['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
|
||||
// 접수기간
|
||||
if (!empty($data['receipt_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['receipt_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['receipt_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['receipt_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 완료기간
|
||||
if (!empty($data['complete_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['complete_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['complete_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['complete_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 검증방식
|
||||
if (!empty($data['vrfc_type_sub'])) {
|
||||
$sql .= "AND a.vrfc_type_sub = '{$data['vrfc_type_sub']}' ";
|
||||
} else {
|
||||
if (!empty($data['vrfcreq_way'])) {
|
||||
$sql .= "AND b.vrfc_type = '{$data['vrfcreq_way']}' ";
|
||||
}
|
||||
}
|
||||
|
||||
// 매체사
|
||||
if (!empty($data['rcpt_cpid'])) {
|
||||
$sql .= "AND a.cpid = '{$data['rcpt_cpid']}' ";
|
||||
}
|
||||
|
||||
// 지역구분
|
||||
if (!empty($data['srcDong'])) {
|
||||
$sql .= "AND a.address_code = '{$data['srcDong']}' ";
|
||||
} else {
|
||||
if (!empty($data['srcGugun'])) {
|
||||
$str_gugun = substr($data['srcGugun'], '0', '2');
|
||||
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
|
||||
$sql .= "AND a.address_code = '{$data['srcGugun']}' ";
|
||||
} else {
|
||||
$gugunPrefix = substr($data['srcGugun'], '0', '5');
|
||||
$sql .= "AND a.address_code LIKE '{$gugunPrefix}%' ";
|
||||
}
|
||||
} else {
|
||||
if (!empty($data['srcSido'])) {
|
||||
$sidoPrefix = substr($data['srcSido'], '0', '2');
|
||||
$sql .= "AND a.address_code LIKE '{$sidoPrefix}%' ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 담당자
|
||||
if (!empty($data['damdang'])) {
|
||||
|
||||
switch ($data['charger_gbn']) {
|
||||
case "1":
|
||||
$sql .= "a.charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
case "2":
|
||||
$sql .= "a.reg_charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
// 배정여부
|
||||
if ($data['assign_yn'] !== "A") {
|
||||
switch ($data['charger_gbn'] . $data['assign_yn']) {
|
||||
case "1Y": // 전화/서류 담당자
|
||||
$sql .= "a.charger != '' ";
|
||||
break;
|
||||
case "1N": // 전화/서류 담당자
|
||||
$sql .= "a.charger = '' ";
|
||||
break;
|
||||
case "2Y": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger != '' ";
|
||||
break;
|
||||
case "2N": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger IS NULL ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 본부
|
||||
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['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
// 참고파일
|
||||
if (!empty($data['status'])) {
|
||||
$sql .= "AND k.status = '{$data['status']}' ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$query = $this->db->query($sql);
|
||||
|
||||
return $query->getRow()->cnt;
|
||||
}
|
||||
|
||||
public function getResultList($start, $end, $data)
|
||||
{
|
||||
$sql = "SELECT
|
||||
a.vr_sq,
|
||||
j.usr_nm as reg_charger,
|
||||
a.atcl_no,
|
||||
a.cpid,
|
||||
a.cp_atcl_id,
|
||||
a.rlet_type_cd,
|
||||
a.address1,
|
||||
a.sise,
|
||||
a.rdate,
|
||||
a.seller_tel_no,
|
||||
a.seller_nm,
|
||||
a.realtor_nm,
|
||||
a.realtor_tel_no,
|
||||
a.rlet_type_cd,
|
||||
a.charger,
|
||||
b.insert_tm,
|
||||
b.stat_cd,
|
||||
c.bild_nm,
|
||||
b.vrfc_type,
|
||||
c.rm_no,
|
||||
c.floor,
|
||||
c.address_code,
|
||||
c.address2,
|
||||
c1.address2a,
|
||||
c1.address2b,
|
||||
c.address3,
|
||||
c.trade_type,
|
||||
c.deal_amt,
|
||||
c.wrrnt_amt,
|
||||
c.lease_amt,
|
||||
c.isale_amt,
|
||||
c.prem_amt,
|
||||
c.sply_spc,
|
||||
c.excls_spc,
|
||||
c.tot_spc,
|
||||
c.grnd_spc,
|
||||
c.bldg_spc,
|
||||
c.hscp_no,
|
||||
c.ptp_no,
|
||||
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,
|
||||
g.cd_nm as pre_stat,
|
||||
h.cd_nm as vrfc_type,
|
||||
i.usr_nm,
|
||||
d2.insert_tm as stat_39_tm,
|
||||
a.vrfc_type_sub,
|
||||
k.status
|
||||
FROM v2_vrfc_req b
|
||||
JOIN v2_article_info a ON a.vr_sq = b.vr_sq
|
||||
JOIN v2_modify_info c ON c.vr_sq = a.vr_sq
|
||||
LEFT JOIN v2_article_info_etc c1 ON c1.vr_sq = a.vr_sq
|
||||
JOIN v2_stop_api_save_info k ON k.atcl_no = a.atcl_no AND k.status IN ('stop','wait','err')
|
||||
LEFT JOIN region_codes f ON f.region_cd = a.address_code
|
||||
LEFT JOIN v2_chg_stat d ON d.vr_sq = a.vr_sq AND d.stat_cd = '35'
|
||||
LEFT JOIN v2_chg_stat d45 ON d45.vr_sq = a.vr_sq AND d45.stat_cd = '45'
|
||||
LEFT JOIN v2_chg_stat d49 ON d49.vr_sq = a.vr_sq AND d49.stat_cd = '49'
|
||||
LEFT JOIN v2_chg_stat e ON e.vr_sq = a.vr_sq AND e.stat_cd = '60'
|
||||
LEFT JOIN codes g ON g.cd = b.stat_cd AND g.category = 'STEP_VERIFICATION'
|
||||
LEFT JOIN codes h ON h.cd = b.vrfc_type AND h.category = 'VRFCREQ_WAY'
|
||||
LEFT JOIN users i ON i.usr_id = a.charger
|
||||
LEFT JOIN users j ON j.usr_id = a.reg_charger
|
||||
LEFT JOIN v2_chg_stat d2 ON d2.vr_sq = a.vr_sq AND d2.stat_cd = '39'
|
||||
WHERE b.insert_tm >= DATE_ADD(CURDATE(), INTERVAL -2 MONTH) ";
|
||||
|
||||
|
||||
// 매물번호
|
||||
if (!empty($data['atcl_no'])) {
|
||||
$sql .= "AND a.atcl = '{$data['atcl_no']}' ";
|
||||
} else {
|
||||
// 현재상태
|
||||
if (!empty($data['stat_cd'])) {
|
||||
$sql .= "AND b.stat_cd = '{$data['stat_cd']}' ";
|
||||
}
|
||||
|
||||
// 중개소
|
||||
if (!empty($data['realtor_nm'])) {
|
||||
$sql .= "AND a.realtor_nm = '{$data['realtor_nm']}' ";
|
||||
}
|
||||
|
||||
// 매물구분
|
||||
if (!empty($data['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
|
||||
// 접수기간
|
||||
if (!empty($data['receipt_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['receipt_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['receipt_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['receipt_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 완료기간
|
||||
if (!empty($data['complete_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['complete_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['complete_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['complete_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 검증방식
|
||||
if (!empty($data['vrfc_type_sub'])) {
|
||||
$sql .= "AND a.vrfc_type_sub = '{$data['vrfc_type_sub']}' ";
|
||||
} else {
|
||||
if (!empty($data['vrfcreq_way'])) {
|
||||
$sql .= "AND b.vrfc_type = '{$data['vrfcreq_way']}' ";
|
||||
}
|
||||
}
|
||||
|
||||
// 매체사
|
||||
if (!empty($data['rcpt_cpid'])) {
|
||||
$sql .= "AND a.cpid = '{$data['rcpt_cpid']}' ";
|
||||
}
|
||||
|
||||
// 지역구분
|
||||
if (!empty($data['srcDong'])) {
|
||||
$sql .= "AND a.address_code = '{$data['srcDong']}' ";
|
||||
} else {
|
||||
if (!empty($data['srcGugun'])) {
|
||||
$str_gugun = substr($data['srcGugun'], '0', '2');
|
||||
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
|
||||
$sql .= "AND a.address_code = '{$data['srcGugun']}' ";
|
||||
} else {
|
||||
$gugunPrefix = substr($data['srcGugun'], '0', '5');
|
||||
$sql .= "AND a.address_code LIKE '{$gugunPrefix}%' ";
|
||||
}
|
||||
} else {
|
||||
if (!empty($data['srcSido'])) {
|
||||
$sidoPrefix = substr($data['srcSido'], '0', '2');
|
||||
$sql .= "AND a.address_code LIKE '{$sidoPrefix}%' ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 담당자
|
||||
if (!empty($data['damdang'])) {
|
||||
|
||||
switch ($data['charger_gbn']) {
|
||||
case "1":
|
||||
$sql .= "a.charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
case "2":
|
||||
$sql .= "a.reg_charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
// 배정여부
|
||||
if ($data['assign_yn'] !== "A") {
|
||||
switch ($data['charger_gbn'] . $data['assign_yn']) {
|
||||
case "1Y": // 전화/서류 담당자
|
||||
$sql .= "a.charger != '' ";
|
||||
break;
|
||||
case "1N": // 전화/서류 담당자
|
||||
$sql .= "a.charger = '' ";
|
||||
break;
|
||||
case "2Y": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger != '' ";
|
||||
break;
|
||||
case "2N": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger IS NULL ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 본부
|
||||
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['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
// 참고파일
|
||||
if (!empty($data['status'])) {
|
||||
$sql .= "AND k.status = '{$data['status']}' ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$sql .= "ORDER BY b.vr_sq DESC , b.insert_tm DESC ";
|
||||
$sql .= "LIMIT {$start}, {$end}";
|
||||
|
||||
|
||||
$query = $this->db->query($sql);
|
||||
|
||||
return $query->getResultArray();
|
||||
}
|
||||
|
||||
// 엑셀다운로드
|
||||
public function getExcelList($data)
|
||||
{
|
||||
$sql = "SELECT
|
||||
CASE
|
||||
WHEN k.`status` = 'stop' THEN '전송전'
|
||||
WHEN k.`status` = 'wait' THEN '전송중'
|
||||
WHEN k.`status` = 'err' THEN '오류'
|
||||
END AS '전송여부',
|
||||
a.atcl_no AS '매물번호',
|
||||
g.cd_nm AS '진행상태',
|
||||
b.insert_tm AS '접수시간',
|
||||
h.cd_nm AS '검증방식',
|
||||
CONCAT(f.region_nm, ' ', c.rm_no) AS '주소',
|
||||
CONCAT(c.address2, ' ', c.address3) AS '상세주소',
|
||||
a.cpid AS '매체사',
|
||||
a.realtor_nm AS '중개소',
|
||||
i.usr_nm AS '서류/전화 담당자',
|
||||
IFNULL(d.insert_tm, d2.insert_tm) AS '서류/전화 확인완료시간',
|
||||
a.reg_charger AS '등기부등본 담당자',
|
||||
greatest(ifnull(d45.insert_tm, ''), ifnull(d49.insert_tm, '')) AS '등기부등본 확인시간',
|
||||
e.insert_tm AS '검증완료 일시'
|
||||
FROM v2_vrfc_req b
|
||||
JOIN v2_article_info a ON a.vr_sq = b.vr_sq
|
||||
JOIN v2_modify_info c ON c.vr_sq = a.vr_sq
|
||||
LEFT JOIN v2_article_info_etc c1 ON c1.vr_sq = a.vr_sq
|
||||
JOIN v2_stop_api_save_info k ON k.atcl_no = a.atcl_no AND k.status IN ('stop','wait','err')
|
||||
LEFT JOIN region_codes f ON f.region_cd = a.address_code
|
||||
LEFT JOIN v2_chg_stat d ON d.vr_sq = a.vr_sq AND d.stat_cd = '35'
|
||||
LEFT JOIN v2_chg_stat d45 ON d45.vr_sq = a.vr_sq AND d45.stat_cd = '45'
|
||||
LEFT JOIN v2_chg_stat d49 ON d49.vr_sq = a.vr_sq AND d49.stat_cd = '49'
|
||||
LEFT JOIN v2_chg_stat e ON e.vr_sq = a.vr_sq AND e.stat_cd = '60'
|
||||
LEFT JOIN codes g ON g.cd = b.stat_cd AND g.category = 'STEP_VERIFICATION'
|
||||
LEFT JOIN codes h ON h.cd = b.vrfc_type AND h.category = 'VRFCREQ_WAY'
|
||||
LEFT JOIN users i ON i.usr_id = a.charger
|
||||
LEFT JOIN users j ON j.usr_id = a.reg_charger
|
||||
LEFT JOIN v2_chg_stat d2 ON d2.vr_sq = a.vr_sq AND d2.stat_cd = '39'
|
||||
WHERE b.insert_tm >= DATE_ADD(CURDATE(), INTERVAL -2 MONTH) ";
|
||||
|
||||
|
||||
// 매물번호
|
||||
if (!empty($data['atcl_no'])) {
|
||||
$sql .= "AND a.atcl = '{$data['atcl_no']}' ";
|
||||
} else {
|
||||
// 현재상태
|
||||
if (!empty($data['stat_cd'])) {
|
||||
$sql .= "AND b.stat_cd = '{$data['stat_cd']}' ";
|
||||
}
|
||||
|
||||
// 중개소
|
||||
if (!empty($data['realtor_nm'])) {
|
||||
$sql .= "AND a.realtor_nm = '{$data['realtor_nm']}' ";
|
||||
}
|
||||
|
||||
// 매물구분
|
||||
if (!empty($data['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
|
||||
// 접수기간
|
||||
if (!empty($data['receipt_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['receipt_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['receipt_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['receipt_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 완료기간
|
||||
if (!empty($data['complete_sdate'])) {
|
||||
$sql .= "AND b.insert_tm >= '{$data['complete_sdate']} 00:00:00' ";
|
||||
}
|
||||
|
||||
if (!empty($data['complete_edate'])) {
|
||||
$sql .= "AND b.insert_tm <= '{$data['complete_edate']} 23:59:59' ";
|
||||
}
|
||||
|
||||
// 검증방식
|
||||
if (!empty($data['vrfc_type_sub'])) {
|
||||
$sql .= "AND a.vrfc_type_sub = '{$data['vrfc_type_sub']}' ";
|
||||
} else {
|
||||
if (!empty($data['vrfcreq_way'])) {
|
||||
$sql .= "AND b.vrfc_type = '{$data['vrfcreq_way']}' ";
|
||||
}
|
||||
}
|
||||
|
||||
// 매체사
|
||||
if (!empty($data['rcpt_cpid'])) {
|
||||
$sql .= "AND a.cpid = '{$data['rcpt_cpid']}' ";
|
||||
}
|
||||
|
||||
// 지역구분
|
||||
if (!empty($data['srcDong'])) {
|
||||
$sql .= "AND a.address_code = '{$data['srcDong']}' ";
|
||||
} else {
|
||||
if (!empty($data['srcGugun'])) {
|
||||
$str_gugun = substr($data['srcGugun'], '0', '2');
|
||||
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
|
||||
$sql .= "AND a.address_code = '{$data['srcGugun']}' ";
|
||||
} else {
|
||||
$gugunPrefix = substr($data['srcGugun'], '0', '5');
|
||||
$sql .= "AND a.address_code LIKE '{$gugunPrefix}%' ";
|
||||
}
|
||||
} else {
|
||||
if (!empty($data['srcSido'])) {
|
||||
$sidoPrefix = substr($data['srcSido'], '0', '2');
|
||||
$sql .= "AND a.address_code LIKE '{$sidoPrefix}%' ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 담당자
|
||||
if (!empty($data['damdang'])) {
|
||||
|
||||
switch ($data['charger_gbn']) {
|
||||
case "1":
|
||||
$sql .= "a.charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
case "2":
|
||||
$sql .= "a.reg_charger = '{$data['damdang']}' ";
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
// 배정여부
|
||||
if ($data['assign_yn'] !== "A") {
|
||||
switch ($data['charger_gbn'] . $data['assign_yn']) {
|
||||
case "1Y": // 전화/서류 담당자
|
||||
$sql .= "a.charger != '' ";
|
||||
break;
|
||||
case "1N": // 전화/서류 담당자
|
||||
$sql .= "a.charger = '' ";
|
||||
break;
|
||||
case "2Y": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger != '' ";
|
||||
break;
|
||||
case "2N": // 등기부등본 담당자
|
||||
$sql .= "a.reg_charger IS NULL ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 본부
|
||||
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['rlet_type_cd'])) {
|
||||
$sql .= "AND a.rlet_type_cd = '{$data['rlet_type_cd']}' ";
|
||||
}
|
||||
|
||||
// 참고파일
|
||||
if (!empty($data['status'])) {
|
||||
$sql .= "AND k.status = '{$data['status']}' ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$sql .= "ORDER BY b.vr_sq DESC , b.insert_tm DESC ";
|
||||
|
||||
$query = $this->db->query($sql);
|
||||
|
||||
return $query->getResultArray();
|
||||
}
|
||||
|
||||
// 전송요청 api 수정
|
||||
public function updateSendApi($type)
|
||||
{
|
||||
$sql = "UPDATE v2_stop_api_save_info SET status = 'wait'
|
||||
WHERE type like CONCAT(?, '%') AND status = 'stop'
|
||||
";
|
||||
|
||||
if ($this->db->query($sql, [$type]) === false) {
|
||||
return [
|
||||
'success' => false,
|
||||
'msg' => '저장 실패',
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
];
|
||||
}
|
||||
|
||||
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 = [
|
||||
$atcl_no,
|
||||
$vr_sq,
|
||||
$type,
|
||||
$fax_sq
|
||||
];
|
||||
$this->db->query($sql, $date);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
9
app/Models/v2/M711Model.php
Normal file
9
app/Models/v2/M711Model.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
namespace App\Models\v2;
|
||||
|
||||
use App\Models\v2\BaseV2Model;
|
||||
|
||||
class M711Model extends BaseV2Model
|
||||
{
|
||||
|
||||
}
|
||||
1317
app/Models/v2/M712Model.php
Normal file
1317
app/Models/v2/M712Model.php
Normal file
File diff suppressed because it is too large
Load Diff
1372
app/Models/v2/M713Model.php
Normal file
1372
app/Models/v2/M713Model.php
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user