Files
confirms/app/Services/ParameterMapper/BaseParameterMapper.php
2026-02-03 20:47:56 +09:00

140 lines
4.0 KiB
PHP

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