| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?php
-
- /**
- * 벤더-인플루언서 재승인요청 API 예제
- *
- * 기능: 해지된 파트너십에 대한 재계약 요청 처리
- * 경로: POST /api/vendor-influencer/reapply-request
- */
-
- namespace App\Controllers;
-
- use App\Controllers\BaseController;
- use App\Models\VendorModel;
- use App\Models\UserModel;
- use App\Models\VendorInfluencerMappingModel;
- use CodeIgniter\HTTP\ResponseInterface;
-
- class VendorInfluencerController extends BaseController
- {
- protected $vendorModel;
- protected $userModel;
- protected $vendorInfluencerModel;
-
- public function __construct()
- {
- $this->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"
- }
- }
- }
- */
|