vendorModel = new VendorModel(); $this->userModel = new UserModel(); $this->vendorInfluencerModel = new VendorInfluencerMappingModel(); } /** * 재승인 요청 (해지된 파트너십에 대한 재계약 요청) * * @route POST /api/vendor-influencer/reapply-request * @param int vendorSeq 벤더사 SEQ * @param int influencerSeq 인플루언서 SEQ * @param string requestMessage 요청 메시지 * @param int requestedBy 요청자 SEQ (인플루언서) * * @return JSON */ public function reapplyRequest() { try { $request = $this->request->getJSON(); $vendorSeq = $request->vendorSeq ?? null; $influencerSeq = $request->influencerSeq ?? null; $requestMessage = $request->requestMessage ?? ''; $requestedBy = $request->requestedBy ?? null; // 필수 파라미터 검증 if (!$vendorSeq || !$influencerSeq || !$requestedBy) { return $this->response->setStatusCode(400)->setJSON([ 'success' => false, 'message' => '필수 파라미터가 누락되었습니다.' ]); } // 기존 해지된 파트너십 확인 $terminatedPartnership = $this->vendorInfluencerModel ->where('VENDOR_SEQ', $vendorSeq) ->where('INFLUENCER_SEQ', $influencerSeq) ->where('STATUS', 'TERMINATED') ->where('IS_ACT', 'Y') ->orderBy('REG_DATE', 'DESC') ->first(); if (!$terminatedPartnership) { return $this->response->setStatusCode(404)->setJSON([ 'success' => false, 'message' => '해지된 파트너십 기록을 찾을 수 없습니다.' ]); } // 현재 처리 중인 요청이 있는지 확인 $existingPendingRequest = $this->vendorInfluencerModel ->where('VENDOR_SEQ', $vendorSeq) ->where('INFLUENCER_SEQ', $influencerSeq) ->where('STATUS', 'PENDING') ->where('IS_ACT', 'Y') ->first(); if ($existingPendingRequest) { return $this->response->setStatusCode(409)->setJSON([ 'success' => false, 'message' => '이미 처리 중인 승인 요청이 있습니다.' ]); } // 재승인 요청 생성 $reapplyData = [ 'VENDOR_SEQ' => $vendorSeq, 'INFLUENCER_SEQ' => $influencerSeq, 'REQUEST_TYPE' => 'INFLUENCER_REQUEST', 'STATUS' => 'PENDING', 'REQUEST_MESSAGE' => '[재계약 요청] ' . $requestMessage, 'REQUESTED_BY' => $requestedBy, 'COMMISSION_RATE' => $terminatedPartnership['COMMISSION_RATE'], // 이전 수수료율 유지 'SPECIAL_CONDITIONS' => $terminatedPartnership['SPECIAL_CONDITIONS'], // 이전 특별조건 유지 'EXPIRED_DATE' => date('Y-m-d H:i:s', strtotime('+7 days')), 'ADD_INFO1' => 'REAPPLY', // 재신청 구분자 'ADD_INFO2' => $terminatedPartnership['SEQ'], // 이전 파트너십 SEQ 참조 'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시 ]; $insertId = $this->vendorInfluencerModel->insert($reapplyData); // 생성된 재승인 요청 정보 조회 $createdReapply = $this->vendorInfluencerModel ->select('vim.*, v.COMPANY_NAME as vendorName, u.NICK_NAME as influencerName, req_user.NICK_NAME as requestedByName') ->from('VENDOR_INFLUENCER_MAPPING vim') ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left') ->join('USER_LIST u', 'vim.INFLUENCER_SEQ = u.SEQ', 'left') ->join('USER_LIST req_user', 'vim.REQUESTED_BY = req_user.SEQ', 'left') ->where('vim.SEQ', $insertId) ->get() ->getRowArray(); return $this->response->setJSON([ 'success' => true, 'message' => '재승인 요청이 성공적으로 생성되었습니다.', 'data' => [ 'reapplyRequest' => $createdReapply, 'previousPartnership' => $terminatedPartnership ] ]); } catch (\Exception $e) { return $this->response->setStatusCode(500)->setJSON([ 'success' => false, 'message' => '재승인 요청 생성 중 오류가 발생했습니다.', 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null ]); } } } /* 사용 예시: POST /api/vendor-influencer/reapply-request Content-Type: application/json { "vendorSeq": 8, "influencerSeq": 15, "requestMessage": "이전 계약이 만료되어 재계약을 요청드립니다. 새로운 프로모션 진행을 위해 파트너십을 재개하고 싶습니다.", "requestedBy": 15 } 응답 예시: { "success": true, "message": "재승인 요청이 성공적으로 생성되었습니다.", "data": { "reapplyRequest": { "SEQ": 25, "VENDOR_SEQ": 8, "INFLUENCER_SEQ": 15, "REQUEST_TYPE": "INFLUENCER_REQUEST", "STATUS": "PENDING", "REQUEST_MESSAGE": "[재계약 요청] 이전 계약이 만료되어 재계약을 요청드립니다...", "REQUESTED_BY": 15, "COMMISSION_RATE": 10.5, "SPECIAL_CONDITIONS": "월 2회 포스팅", "EXPIRED_DATE": "2024-01-20 10:30:00", "ADD_INFO1": "REAPPLY", "ADD_INFO2": "23", "ADD_INFO3": "2024-01-13 10:30:00", "vendorName": "뷰티코리아", "influencerName": "뷰티블로거", "requestedByName": "뷰티블로거" }, "previousPartnership": { "SEQ": 23, "STATUS": "TERMINATED", "PARTNERSHIP_END_DATE": "2024-01-10 15:20:00" } } } */