97 lines
3.6 KiB
PHP
97 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use CodeIgniter\Model;
|
|
|
|
class ReceiptModel extends Model
|
|
{
|
|
protected $table = 'receipt';
|
|
protected $primaryKey = 'rcpt_sq';
|
|
|
|
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
|
|
];
|
|
}
|
|
} |