| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787 |
- <?php
- namespace App\Controllers;
- use CodeIgniter\RESTful\ResourceController;
- use App\Models\VendorInfluencerMappingModel;
- use App\Models\VendorInfluencerStatusHistoryModel;
- use App\Models\VendorPartnershipModel;
- use App\Models\VendorModel;
- use App\Models\InfluencerModel;
- class VendorController extends ResourceController
- {
- protected $modelName = 'App\Models\VendorInfluencerMappingModel';
- protected $format = 'json';
-
- protected $vendorInfluencerModel;
- protected $vendorPartnershipModel;
- protected $statusHistoryModel;
- protected $vendorModel;
- protected $influencerModel;
- public function __construct()
- {
- $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
- $this->vendorPartnershipModel = new VendorPartnershipModel();
- $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
- $this->vendorModel = new VendorModel();
- $this->influencerModel = new InfluencerModel();
- }
- /**
- * 벤더사의 인플루언서 요청 목록 조회 (히스토리 테이블 기반)
- */
- public function getInfluencerRequests()
- {
- try {
- $request = $this->request->getJSON();
-
- $vendorSeq = $request->vendorSeq ?? null;
- $status = $request->status ?? null;
- $page = $request->page ?? 1;
- $size = $request->size ?? 20;
- log_message('debug', 'getInfluencerRequests 호출: ' . json_encode([
- 'vendorSeq' => $vendorSeq,
- 'status' => $status,
- 'page' => $page,
- 'size' => $size
- ]));
- if (!$vendorSeq) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '벤더사 SEQ는 필수입니다.'
- ]);
- }
- $result = $this->vendorPartnershipModel->getVendorRequestsWithPagination($vendorSeq, $page, $size, $status);
- // 통계 계산 (히스토리 테이블이 없을 경우를 대비한 안전장치)
- $statsFormatted = [
- 'pending' => 0,
- 'approved' => 0,
- 'rejected' => 0,
- 'total' => 0
- ];
- try {
- $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
-
- foreach ($stats as $stat) {
- $statsFormatted['total'] += $stat['count'];
- switch ($stat['STATUS']) {
- case 'PENDING':
- $statsFormatted['pending'] = $stat['count'];
- break;
- case 'APPROVED':
- $statsFormatted['approved'] = $stat['count'];
- break;
- case 'REJECTED':
- $statsFormatted['rejected'] = $stat['count'];
- break;
- }
- }
- } catch (\Exception $statsError) {
- log_message('warning', '통계 조회 실패 (히스토리 테이블 없음?): ' . $statsError->getMessage());
-
- // 히스토리 테이블이 없으면 메인 테이블에서 대략적인 통계 계산
- try {
- $mainStats = $this->vendorInfluencerModel
- ->where('VENDOR_SEQ', $vendorSeq)
- ->where('IS_ACT', 'Y')
- ->countAllResults();
- $statsFormatted['total'] = $mainStats;
- $statsFormatted['pending'] = $mainStats; // 히스토리가 없으면 모두 PENDING으로 가정
- } catch (\Exception $mainStatsError) {
- log_message('error', '메인 테이블 통계도 실패: ' . $mainStatsError->getMessage());
- }
- }
- log_message('debug', 'API 응답 데이터: ' . json_encode([
- 'items_count' => count($result['data']),
- 'pagination' => $result['pagination'],
- 'stats' => $statsFormatted
- ]));
- // 프론트엔드에서 기대하는 응답 구조에 맞춤
- return $this->response->setJSON([
- 'success' => true,
- 'data' => [
- 'items' => $result['data'], // 프론트엔드에서 data.items로 접근
- 'total' => $result['pagination']['total'],
- 'page' => $result['pagination']['currentPage'],
- 'totalPages' => $result['pagination']['totalPages'],
- 'size' => $result['pagination']['limit'],
- 'stats' => $statsFormatted
- ]
- ]);
- } catch (\Exception $e) {
- log_message('error', '인플루언서 요청 목록 조회 오류: ' . $e->getMessage());
- log_message('error', '스택 트레이스: ' . $e->getTraceAsString());
-
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '요청 목록 조회 중 오류가 발생했습니다.',
- 'error' => $e->getMessage()
- ]);
- }
- }
- /**
- * 인플루언서 요청 승인/거절 처리 (히스토리 테이블 기반)
- */
- public function processInfluencerRequest()
- {
- try {
- $request = $this->request->getJSON();
-
- $mappingSeq = $request->mappingSeq ?? null;
- $action = $request->action ?? null; // 'approve' or 'reject'
- $processedBy = $request->processedBy ?? null;
- $responseMessage = $request->responseMessage ?? '';
-
- log_message('debug', '승인 처리 요청: ' . json_encode([
- 'mappingSeq' => $mappingSeq,
- 'action' => $action,
- 'processedBy' => $processedBy,
- 'responseMessage' => $responseMessage
- ]));
- if (!$mappingSeq || !$action || !$processedBy) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, action, processedBy 필요)'
- ]);
- }
- // action 검증
- if (!in_array($action, ['approve', 'reject'])) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => 'action은 approve 또는 reject만 가능합니다.'
- ]);
- }
- // 매핑 정보와 현재 상태 확인
- $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
-
- if (!$mapping) {
- return $this->response->setStatusCode(404)->setJSON([
- 'success' => false,
- 'message' => '요청을 찾을 수 없습니다.'
- ]);
- }
- // 현재 상태가 PENDING인지 확인
- if ($mapping['CURRENT_STATUS'] !== 'PENDING') {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '이미 처리된 요청입니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
- ]);
- }
- // 처리자 확인
- $processingUser = $this->validateProcessor($processedBy);
- if (!$processingUser['success']) {
- return $this->response->setStatusCode(400)->setJSON($processingUser);
- }
- // 상태 변경
- $newStatus = ($action === 'approve') ? 'APPROVED' : 'REJECTED';
- $statusMessage = $responseMessage ?: ($action === 'approve' ? '승인 처리됨' : '거부 처리됨');
-
- log_message('debug', "상태 변경: {$mapping['CURRENT_STATUS']} → {$newStatus}");
- // 히스토리 테이블에 상태 변경 기록
- $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $processedBy);
- // 메인 테이블 업데이트 (응답 관련 정보)
- $this->vendorInfluencerModel->update($mappingSeq, [
- 'RESPONSE_MESSAGE' => $responseMessage,
- 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
- 'APPROVED_BY' => $processedBy
- ]);
- // 승인인 경우 파트너십 시작일 설정
- if ($action === 'approve') {
- $this->vendorInfluencerModel->update($mappingSeq, [
- 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
- ]);
- }
- log_message('debug', "승인 처리 완료: action={$action}, newStatus={$newStatus}");
- return $this->response->setJSON([
- 'success' => true,
- 'message' => $action === 'approve' ? '요청이 승인되었습니다.' : '요청이 거부되었습니다.',
- 'data' => [
- 'mappingSeq' => $mappingSeq,
- 'action' => $action,
- 'status' => $newStatus,
- 'processedBy' => $processingUser['data']['name'],
- 'responseMessage' => $responseMessage
- ]
- ]);
- } catch (\Exception $e) {
- log_message('error', '승인 처리 중 예외 발생: ' . $e->getMessage());
- log_message('error', '승인 처리 스택 트레이스: ' . $e->getTraceAsString());
-
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '요청 처리 중 오류가 발생했습니다.',
- 'error' => $e->getMessage()
- ]);
- }
- }
- /**
- * 처리자 검증 (벤더사 또는 사용자)
- */
- private function validateProcessor($processedBy)
- {
- // 1. 먼저 USER_LIST에서 확인 (인플루언서)
- $user = $this->influencerModel
- ->where('SEQ', $processedBy)
- ->where('IS_ACT', 'Y')
- ->first();
- if ($user) {
- return [
- 'success' => true,
- 'data' => [
- 'type' => 'user',
- 'seq' => $user['SEQ'],
- 'name' => $user['NICK_NAME'] ?: $user['NAME']
- ]
- ];
- }
- // 2. VENDOR_LIST에서 확인 (벤더사)
- $vendor = $this->vendorModel
- ->where('SEQ', $processedBy)
- ->where('IS_ACT', 'Y')
- ->first();
- if ($vendor) {
- return [
- 'success' => true,
- 'data' => [
- 'type' => 'vendor',
- 'seq' => $vendor['SEQ'],
- 'name' => $vendor['COMPANY_NAME'] . ' (벤더사)'
- ]
- ];
- }
- return [
- 'success' => false,
- 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
- ];
- }
- /**
- * 벤더사 파트너십 해지 - 단순화된 방식
- */
- public function terminatePartnership()
- {
- try {
- $request = $this->request->getJSON();
-
- $mappingSeq = $request->mappingSeq ?? null;
- $terminatedBy = $request->terminatedBy ?? null;
- $terminateReason = $request->terminateReason ?? '';
- log_message('info', '파트너십 해지 요청: ' . json_encode([
- 'mappingSeq' => $mappingSeq,
- 'terminatedBy' => $terminatedBy,
- 'terminateReason' => $terminateReason
- ]));
- if (!$mappingSeq || !$terminatedBy) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '필수 파라미터가 누락되었습니다.'
- ]);
- }
- // 매핑 정보 확인 (메인 테이블만 사용)
- $mapping = $this->vendorInfluencerModel->where('SEQ', $mappingSeq)
- ->where('IS_ACT', 'Y')
- ->first();
-
- if (!$mapping) {
- return $this->response->setStatusCode(404)->setJSON([
- 'success' => false,
- 'message' => '파트너십을 찾을 수 없습니다.'
- ]);
- }
- // 현재 상태 확인 (히스토리 테이블 기준)
- $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
- $actualStatus = $currentStatus ? $currentStatus['STATUS'] : $mapping['STATUS'];
- log_message('info', '현재 매핑 정보: ' . json_encode($mapping));
- log_message('info', '히스토리 테이블 현재 상태: ' . json_encode($currentStatus));
- log_message('info', '실제 확인할 상태: ' . $actualStatus);
- // 현재 상태가 APPROVED인지 확인
- if ($actualStatus !== 'APPROVED') {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '승인된 파트너십만 해지할 수 있습니다. 현재 상태: ' . $actualStatus
- ]);
- }
- // 처리자 확인
- $processingUser = $this->validateProcessor($terminatedBy);
- if (!$processingUser['success']) {
- return $this->response->setStatusCode(400)->setJSON($processingUser);
- }
- log_message('info', '처리자 검증 완료: ' . json_encode($processingUser['data']));
- // 메인 테이블 직접 업데이트 (단순하고 확실한 방법)
- $statusMessage = '파트너십 해지: ' . $terminateReason;
- $actualChangedBy = $processingUser['data']['seq'] ?? $terminatedBy ?: 1;
-
- $updateData = [
- 'STATUS' => 'TERMINATED',
- 'RESPONSE_MESSAGE' => $statusMessage,
- 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
- 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'),
- 'APPROVED_BY' => $actualChangedBy,
- 'MOD_DATE' => date('Y-m-d H:i:s')
- ];
- log_message('info', "메인 테이블 업데이트 데이터: " . json_encode($updateData));
-
- // 업데이트 전 데이터 저장
- $beforeUpdate = $this->vendorInfluencerModel->find($mappingSeq);
- log_message('info', "업데이트 전 데이터: " . json_encode($beforeUpdate));
-
- // UNIQUE 제약조건 우회를 위해 직접 SQL 사용
- $db = \Config\Database::connect();
-
- try {
- // 1. 먼저 기존 TERMINATED 레코드가 있는지 확인
- $existingTerminated = $db->query(
- "SELECT SEQ FROM VENDOR_INFLUENCER_MAPPING
- WHERE VENDOR_SEQ = ? AND INFLUENCER_SEQ = ? AND STATUS = 'TERMINATED' AND SEQ != ?",
- [$beforeUpdate['VENDOR_SEQ'], $beforeUpdate['INFLUENCER_SEQ'], $mappingSeq]
- )->getRowArray();
-
- if ($existingTerminated) {
- log_message('warning', '기존 TERMINATED 레코드 존재 - 비활성화: ' . json_encode($existingTerminated));
-
- // 기존 TERMINATED 레코드를 비활성화
- $db->query(
- "UPDATE VENDOR_INFLUENCER_MAPPING SET IS_ACT = 'N' WHERE SEQ = ?",
- [$existingTerminated['SEQ']]
- );
- }
-
- // 2. 직접 SQL로 현재 레코드 업데이트
- $updateSql = "UPDATE VENDOR_INFLUENCER_MAPPING SET
- STATUS = 'TERMINATED',
- RESPONSE_MESSAGE = ?,
- RESPONSE_DATE = ?,
- PARTNERSHIP_END_DATE = ?,
- APPROVED_BY = ?,
- MOD_DATE = ?
- WHERE SEQ = ?";
-
- $updateParams = [
- $statusMessage,
- date('Y-m-d H:i:s'),
- date('Y-m-d H:i:s'),
- $actualChangedBy,
- date('Y-m-d H:i:s'),
- $mappingSeq
- ];
-
- log_message('info', "직접 SQL 실행: " . $updateSql);
- log_message('info', "SQL 파라미터: " . json_encode($updateParams));
-
- $updateResult = $db->query($updateSql, $updateParams);
- $affectedRows = $db->affectedRows();
-
- log_message('info', "직접 SQL 업데이트 결과: 영향받은 행 수={$affectedRows}");
-
- if ($affectedRows === 0) {
- throw new \Exception('직접 SQL 업데이트 실패 - 영향받은 행이 0개');
- }
-
- } catch (\Exception $sqlError) {
- log_message('error', '직접 SQL 업데이트 실패: ' . $sqlError->getMessage());
-
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '파트너십 해지 처리 중 SQL 오류가 발생했습니다.',
- 'error' => '직접 SQL 업데이트 실패',
- 'debug' => $sqlError->getMessage()
- ]);
- }
-
- // 업데이트 후 데이터 확인
- $afterUpdate = $this->vendorInfluencerModel->find($mappingSeq);
- log_message('info', "업데이트 후 데이터: " . json_encode($afterUpdate));
-
- // 실제 상태 변경 확인
- if ($afterUpdate['STATUS'] !== 'TERMINATED') {
- log_message('error', '상태 변경 검증 실패: ' . $afterUpdate['STATUS']);
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '파트너십 해지 처리 중 오류가 발생했습니다.',
- 'error' => '상태 변경 검증 실패',
- 'debug' => [
- 'expected' => 'TERMINATED',
- 'actual' => $afterUpdate['STATUS']
- ]
- ]);
- }
- log_message('info', '파트너십 해지 완료: mappingSeq=' . $mappingSeq);
- return $this->response->setJSON([
- 'success' => true,
- 'message' => '파트너십이 해지되었습니다.',
- 'data' => [
- 'mappingSeq' => $mappingSeq,
- 'status' => 'TERMINATED',
- 'terminatedBy' => $processingUser['data']['name'],
- 'terminateReason' => $terminateReason,
- 'terminateDate' => date('Y-m-d H:i:s'),
- 'verifiedStatus' => $afterUpdate['STATUS'] // 검증된 상태
- ]
- ]);
-
- } catch (\Exception $e) {
- log_message('error', '파트너십 해지 오류: ' . $e->getMessage());
-
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '파트너십 해지 중 오류가 발생했습니다.',
- 'error' => '시스템 오류',
- 'debug' => ENVIRONMENT === 'development' ? $e->getMessage() : null
- ]);
- }
- }
- /**
- * 벤더사 상태 통계 조회
- */
- public function getStatusStats()
- {
- try {
- $request = $this->request->getJSON();
- $vendorSeq = $request->vendorSeq ?? null;
- if (!$vendorSeq) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '벤더사 SEQ는 필수입니다.'
- ]);
- }
- $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
- return $this->response->setJSON([
- 'success' => true,
- 'data' => $stats
- ]);
- } catch (\Exception $e) {
- log_message('error', '상태 통계 조회 오류: ' . $e->getMessage());
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '상태 통계 조회 중 오류가 발생했습니다.',
- 'error' => $e->getMessage()
- ]);
- }
- }
- /**
- * 인플루언서 요청 승인/거절 (프론트엔드 호환용)
- * 프론트엔드에서 /api/vendor-influencer/approve 호출에 대응
- */
- public function approveInfluencerRequest()
- {
- try {
- $request = $this->request->getJSON();
-
- $mappingSeq = $request->mappingSeq ?? null;
- $action = $request->action ?? null; // 'APPROVE' or 'REJECT'
- $processedBy = $request->processedBy ?? null;
- $responseMessage = $request->responseMessage ?? '';
-
- log_message('debug', '프론트엔드 승인 처리 요청: ' . json_encode([
- 'mappingSeq' => $mappingSeq,
- 'action' => $action,
- 'processedBy' => $processedBy,
- 'responseMessage' => $responseMessage
- ]));
- if (!$mappingSeq || !$action || !$processedBy) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, action, processedBy 필요)'
- ]);
- }
- // action 값 정규화 (프론트엔드에서는 대문자로 전송)
- $normalizedAction = strtolower($action);
- if (!in_array($normalizedAction, ['approve', 'reject'])) {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => 'action은 APPROVE 또는 REJECT만 가능합니다.'
- ]);
- }
- // 매핑 정보와 현재 상태 확인
- $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
-
- if (!$mapping) {
- return $this->response->setStatusCode(404)->setJSON([
- 'success' => false,
- 'message' => '요청을 찾을 수 없습니다.'
- ]);
- }
- // 현재 상태가 PENDING인지 확인
- if ($mapping['CURRENT_STATUS'] !== 'PENDING') {
- return $this->response->setStatusCode(400)->setJSON([
- 'success' => false,
- 'message' => '이미 처리된 요청입니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
- ]);
- }
- // 처리자 확인
- $processingUser = $this->validateProcessor($processedBy);
- if (!$processingUser['success']) {
- return $this->response->setStatusCode(400)->setJSON($processingUser);
- }
- // 상태 변경
- $newStatus = ($normalizedAction === 'approve') ? 'APPROVED' : 'REJECTED';
- $statusMessage = $responseMessage ?: ($normalizedAction === 'approve' ? '승인 처리됨' : '거부 처리됨');
-
- log_message('debug', "프론트엔드 상태 변경: {$mapping['CURRENT_STATUS']} → {$newStatus}");
- // 히스토리 테이블에 상태 변경 기록
- $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $processedBy);
- // 메인 테이블 업데이트 (응답 관련 정보)
- $this->vendorInfluencerModel->update($mappingSeq, [
- 'RESPONSE_MESSAGE' => $responseMessage,
- 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
- 'APPROVED_BY' => $processedBy
- ]);
- // 승인인 경우 파트너십 시작일 설정
- if ($normalizedAction === 'approve') {
- $this->vendorInfluencerModel->update($mappingSeq, [
- 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
- ]);
- }
- log_message('debug', "프론트엔드 승인 처리 완료: action={$normalizedAction}, newStatus={$newStatus}");
- return $this->response->setJSON([
- 'success' => true,
- 'message' => $normalizedAction === 'approve' ? '요청이 승인되었습니다.' : '요청이 거부되었습니다.',
- 'data' => [
- 'mappingSeq' => $mappingSeq,
- 'action' => $action,
- 'status' => $newStatus,
- 'processedBy' => $processingUser['data']['name'],
- 'responseMessage' => $responseMessage
- ]
- ]);
- } catch (\Exception $e) {
- log_message('error', '프론트엔드 승인 처리 중 예외 발생: ' . $e->getMessage());
- log_message('error', '프론트엔드 승인 처리 스택 트레이스: ' . $e->getTraceAsString());
-
- return $this->response->setStatusCode(500)->setJSON([
- 'success' => false,
- 'message' => '요청 처리 중 오류가 발생했습니다.',
- 'error' => $e->getMessage()
- ]);
- }
- }
- /**
- * 데이터베이스 상태 디버깅 (임시)
- */
- public function debugMappingStatus($mappingSeq = null)
- {
- try {
- if (!$mappingSeq) {
- $mappingSeq = $this->request->getGet('seq') ?? 1;
- }
- // 메인 테이블 상태
- $mainData = $this->vendorInfluencerModel->where('SEQ', $mappingSeq)->first();
-
- // 히스토리 테이블 전체
- $historyData = $this->statusHistoryModel->where('MAPPING_SEQ', $mappingSeq)
- ->orderBy('CHANGED_DATE', 'DESC')
- ->findAll();
-
- // 현재 상태 (IS_CURRENT='Y')
- $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
- return $this->response->setJSON([
- 'success' => true,
- 'mappingSeq' => $mappingSeq,
- 'mainTable' => $mainData,
- 'historyTable' => $historyData,
- 'currentStatus' => $currentStatus,
- 'timestamp' => date('Y-m-d H:i:s')
- ]);
- } catch (\Exception $e) {
- return $this->response->setJSON([
- 'success' => false,
- 'error' => $e->getMessage()
- ]);
- }
- }
- /**
- * 디버깅용: 히스토리 테이블 insert 테스트
- */
- public function debugHistoryInsert()
- {
- try {
- $request = $this->request->getJSON();
- $mappingSeq = $request->mappingSeq ?? 1;
-
- // 최소한의 데이터로 테스트 insert
- $testData = [
- 'MAPPING_SEQ' => (int)$mappingSeq,
- 'STATUS' => 'PENDING',
- 'PREVIOUS_STATUS' => null,
- 'STATUS_MESSAGE' => 'Test insert',
- 'CHANGED_BY' => 1,
- 'IS_CURRENT' => 'N', // 테스트용이므로 N으로 설정
- 'CHANGED_DATE' => date('Y-m-d H:i:s')
- ];
- log_message('debug', '테스트 insert 데이터: ' . json_encode($testData));
- // validation 체크
- if (!$this->statusHistoryModel->validate($testData)) {
- $validationErrors = $this->statusHistoryModel->errors();
- return $this->response->setJSON([
- 'success' => false,
- 'message' => 'Validation 실패',
- 'errors' => $validationErrors,
- 'data' => $testData
- ]);
- }
- $result = $this->statusHistoryModel->insert($testData, false);
-
- if (!$result) {
- $dbError = $this->statusHistoryModel->db->error();
- return $this->response->setJSON([
- 'success' => false,
- 'message' => 'DB Insert 실패',
- 'dbError' => $dbError,
- 'data' => $testData
- ]);
- }
- return $this->response->setJSON([
- 'success' => true,
- 'message' => '테스트 insert 성공',
- 'insertId' => $result,
- 'data' => $testData
- ]);
- } catch (\Exception $e) {
- return $this->response->setJSON([
- 'success' => false,
- 'message' => '테스트 insert 중 오류',
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- }
- }
- /**
- * 메인 테이블과 히스토리 테이블 상태 동기화
- */
- public function syncMappingStatus()
- {
- try {
- $request = $this->request->getJSON();
- $mappingSeq = $request->mappingSeq ?? $this->request->getGet('seq');
- if (!$mappingSeq) {
- return $this->response->setJSON([
- 'success' => false,
- 'message' => 'mappingSeq가 필요합니다.'
- ]);
- }
- // 현재 히스토리 테이블 상태 조회
- $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
-
- if (!$currentStatus) {
- return $this->response->setJSON([
- 'success' => false,
- 'message' => '히스토리 테이블에서 현재 상태를 찾을 수 없습니다.'
- ]);
- }
- // 메인 테이블 업데이트
- $updateData = [
- 'STATUS' => $currentStatus['STATUS'],
- 'MOD_DATE' => date('Y-m-d H:i:s')
- ];
- // TERMINATED 상태인 경우 추가 필드 업데이트
- if ($currentStatus['STATUS'] === 'TERMINATED') {
- $updateData['RESPONSE_MESSAGE'] = $currentStatus['STATUS_MESSAGE'] ?? '파트너십 해지';
- $updateData['RESPONSE_DATE'] = $currentStatus['CHANGED_DATE'];
- $updateData['PARTNERSHIP_END_DATE'] = $currentStatus['CHANGED_DATE'];
- $updateData['APPROVED_BY'] = $currentStatus['CHANGED_BY'];
- }
- $result = $this->vendorInfluencerModel->update($mappingSeq, $updateData);
- if ($result) {
- // 동기화 후 상태 확인
- $updatedMain = $this->vendorInfluencerModel->find($mappingSeq);
-
- return $this->response->setJSON([
- 'success' => true,
- 'message' => '상태 동기화 완료',
- 'data' => [
- 'mappingSeq' => $mappingSeq,
- 'syncedStatus' => $currentStatus['STATUS'],
- 'updatedMainTable' => $updatedMain
- ]
- ]);
- } else {
- return $this->response->setJSON([
- 'success' => false,
- 'message' => '메인 테이블 업데이트 실패'
- ]);
- }
- } catch (\Exception $e) {
- return $this->response->setJSON([
- 'success' => false,
- 'message' => '동기화 중 오류 발생',
- 'error' => $e->getMessage()
- ]);
- }
- }
- }
|