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 ]; } }