VendorInfluencerReapply.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /**
  3. * 벤더-인플루언서 재승인요청 API 예제
  4. *
  5. * 기능: 해지된 파트너십에 대한 재계약 요청 처리
  6. * 경로: POST /api/vendor-influencer/reapply-request
  7. */
  8. namespace App\Controllers;
  9. use App\Controllers\BaseController;
  10. use App\Models\VendorModel;
  11. use App\Models\UserModel;
  12. use App\Models\VendorInfluencerMappingModel;
  13. use CodeIgniter\HTTP\ResponseInterface;
  14. class VendorInfluencerController extends BaseController
  15. {
  16. protected $vendorModel;
  17. protected $userModel;
  18. protected $vendorInfluencerModel;
  19. public function __construct()
  20. {
  21. $this->vendorModel = new VendorModel();
  22. $this->userModel = new UserModel();
  23. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  24. }
  25. /**
  26. * 재승인 요청 (해지된 파트너십에 대한 재계약 요청)
  27. *
  28. * @route POST /api/vendor-influencer/reapply-request
  29. * @param int vendorSeq 벤더사 SEQ
  30. * @param int influencerSeq 인플루언서 SEQ
  31. * @param string requestMessage 요청 메시지
  32. * @param int requestedBy 요청자 SEQ (인플루언서)
  33. *
  34. * @return JSON
  35. */
  36. public function reapplyRequest()
  37. {
  38. try {
  39. $request = $this->request->getJSON();
  40. $vendorSeq = $request->vendorSeq ?? null;
  41. $influencerSeq = $request->influencerSeq ?? null;
  42. $requestMessage = $request->requestMessage ?? '';
  43. $requestedBy = $request->requestedBy ?? null;
  44. // 필수 파라미터 검증
  45. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  46. return $this->response->setStatusCode(400)->setJSON([
  47. 'success' => false,
  48. 'message' => '필수 파라미터가 누락되었습니다.'
  49. ]);
  50. }
  51. // 기존 해지된 파트너십 확인
  52. $terminatedPartnership = $this->vendorInfluencerModel
  53. ->where('VENDOR_SEQ', $vendorSeq)
  54. ->where('INFLUENCER_SEQ', $influencerSeq)
  55. ->where('STATUS', 'TERMINATED')
  56. ->where('IS_ACT', 'Y')
  57. ->orderBy('REG_DATE', 'DESC')
  58. ->first();
  59. if (!$terminatedPartnership) {
  60. return $this->response->setStatusCode(404)->setJSON([
  61. 'success' => false,
  62. 'message' => '해지된 파트너십 기록을 찾을 수 없습니다.'
  63. ]);
  64. }
  65. // 현재 처리 중인 요청이 있는지 확인
  66. $existingPendingRequest = $this->vendorInfluencerModel
  67. ->where('VENDOR_SEQ', $vendorSeq)
  68. ->where('INFLUENCER_SEQ', $influencerSeq)
  69. ->where('STATUS', 'PENDING')
  70. ->where('IS_ACT', 'Y')
  71. ->first();
  72. if ($existingPendingRequest) {
  73. return $this->response->setStatusCode(409)->setJSON([
  74. 'success' => false,
  75. 'message' => '이미 처리 중인 승인 요청이 있습니다.'
  76. ]);
  77. }
  78. // 재승인 요청 생성
  79. $reapplyData = [
  80. 'VENDOR_SEQ' => $vendorSeq,
  81. 'INFLUENCER_SEQ' => $influencerSeq,
  82. 'REQUEST_TYPE' => 'INFLUENCER_REQUEST',
  83. 'STATUS' => 'PENDING',
  84. 'REQUEST_MESSAGE' => '[재계약 요청] ' . $requestMessage,
  85. 'REQUESTED_BY' => $requestedBy,
  86. 'COMMISSION_RATE' => $terminatedPartnership['COMMISSION_RATE'], // 이전 수수료율 유지
  87. 'SPECIAL_CONDITIONS' => $terminatedPartnership['SPECIAL_CONDITIONS'], // 이전 특별조건 유지
  88. 'EXPIRED_DATE' => date('Y-m-d H:i:s', strtotime('+7 days')),
  89. 'ADD_INFO1' => 'REAPPLY', // 재신청 구분자
  90. 'ADD_INFO2' => $terminatedPartnership['SEQ'], // 이전 파트너십 SEQ 참조
  91. 'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시
  92. ];
  93. $insertId = $this->vendorInfluencerModel->insert($reapplyData);
  94. // 생성된 재승인 요청 정보 조회
  95. $createdReapply = $this->vendorInfluencerModel
  96. ->select('vim.*, v.COMPANY_NAME as vendorName, u.NICK_NAME as influencerName, req_user.NICK_NAME as requestedByName')
  97. ->from('VENDOR_INFLUENCER_MAPPING vim')
  98. ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left')
  99. ->join('USER_LIST u', 'vim.INFLUENCER_SEQ = u.SEQ', 'left')
  100. ->join('USER_LIST req_user', 'vim.REQUESTED_BY = req_user.SEQ', 'left')
  101. ->where('vim.SEQ', $insertId)
  102. ->get()
  103. ->getRowArray();
  104. return $this->response->setJSON([
  105. 'success' => true,
  106. 'message' => '재승인 요청이 성공적으로 생성되었습니다.',
  107. 'data' => [
  108. 'reapplyRequest' => $createdReapply,
  109. 'previousPartnership' => $terminatedPartnership
  110. ]
  111. ]);
  112. } catch (\Exception $e) {
  113. return $this->response->setStatusCode(500)->setJSON([
  114. 'success' => false,
  115. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  116. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  117. ]);
  118. }
  119. }
  120. }
  121. /*
  122. 사용 예시:
  123. POST /api/vendor-influencer/reapply-request
  124. Content-Type: application/json
  125. {
  126. "vendorSeq": 8,
  127. "influencerSeq": 15,
  128. "requestMessage": "이전 계약이 만료되어 재계약을 요청드립니다. 새로운 프로모션 진행을 위해 파트너십을 재개하고 싶습니다.",
  129. "requestedBy": 15
  130. }
  131. 응답 예시:
  132. {
  133. "success": true,
  134. "message": "재승인 요청이 성공적으로 생성되었습니다.",
  135. "data": {
  136. "reapplyRequest": {
  137. "SEQ": 25,
  138. "VENDOR_SEQ": 8,
  139. "INFLUENCER_SEQ": 15,
  140. "REQUEST_TYPE": "INFLUENCER_REQUEST",
  141. "STATUS": "PENDING",
  142. "REQUEST_MESSAGE": "[재계약 요청] 이전 계약이 만료되어 재계약을 요청드립니다...",
  143. "REQUESTED_BY": 15,
  144. "COMMISSION_RATE": 10.5,
  145. "SPECIAL_CONDITIONS": "월 2회 포스팅",
  146. "EXPIRED_DATE": "2024-01-20 10:30:00",
  147. "ADD_INFO1": "REAPPLY",
  148. "ADD_INFO2": "23",
  149. "ADD_INFO3": "2024-01-13 10:30:00",
  150. "vendorName": "뷰티코리아",
  151. "influencerName": "뷰티블로거",
  152. "requestedByName": "뷰티블로거"
  153. },
  154. "previousPartnership": {
  155. "SEQ": 23,
  156. "STATUS": "TERMINATED",
  157. "PARTNERSHIP_END_DATE": "2024-01-10 15:20:00"
  158. }
  159. }
  160. }
  161. */