Deli.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. <?php
  2. namespace App\Controllers;
  3. use CodeIgniter\RESTful\ResourceController;
  4. class Deli extends ResourceController
  5. {
  6. //아이템 리스트
  7. public function itemlist()
  8. {
  9. $db = \Config\Database::connect();
  10. // POST JSON 파라미터 받기
  11. $request = $this->request->getJSON(true);
  12. $itemType = isset($request['TYPE']) ? $request['TYPE'] : null;
  13. $showYn = isset($request['SHOW_YN']) ? $request['SHOW_YN'] : null;
  14. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  15. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  16. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  17. // 서브쿼리: 사용자 타입에 따른 주문 집계
  18. $subQuery = $db->table('ITEM_ORDER_LIST')
  19. ->select('ITEM_SEQ, SUM(QTY) AS sum_qty, SUM(TOTAL) AS sum_total, MAX(REG_DATE) AS latest_reg_date');
  20. // 인플루언서: 본인이 받은 주문만
  21. if ($memberType === 'INFLUENCER') {
  22. if (is_null($infSeq)) {
  23. // INF_SEQ가 없으면 빈 결과 반환
  24. return $this->respond([], 200);
  25. }
  26. $subQuery->where('INF_SEQ', $infSeq);
  27. }
  28. // 배송정보가 등록되지 않은 주문만 (배송관리 페이지용)
  29. // 배송업체와 송장번호가 모두 비어있는 경우만 포함 (AND 조건)
  30. $subQuery->where('(DELI_COMP IS NULL OR DELI_COMP = "")')
  31. ->where('(DELI_NUMB IS NULL OR DELI_NUMB = "")');
  32. $subQuery->groupBy('ITEM_SEQ');
  33. // 메인 쿼리: ITEM_LIST와 위 서브쿼리 조인 (실제 주문이 있는 제품만)
  34. $builder = $db->table('ITEM_LIST I')
  35. ->select('I.*, O.sum_qty, O.sum_total, O.latest_reg_date')
  36. ->join("(" . $subQuery->getCompiledSelect() . ") O", 'I.SEQ = O.ITEM_SEQ', 'inner')
  37. ->where('I.DEL_YN', 'N');
  38. // 벤더: 자사 제품만 필터링
  39. if ($memberType === 'VENDOR') {
  40. if (empty($companyNumber)) {
  41. // COMPANY_NUMBER가 없으면 빈 결과 반환
  42. return $this->respond([], 200);
  43. }
  44. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  45. }
  46. if (!is_null($showYn) && $showYn !== '') {
  47. $builder->where('I.SHOW_YN', $showYn);
  48. }
  49. $builder->where('I.TYPE', $itemType);
  50. $builder->orderBy('I.UDPDATE', 'DESC');
  51. $lists = $builder->get()->getResultArray();
  52. return $this->respond($lists, 200);
  53. }
  54. //구매자 리스트
  55. public function delilist()
  56. {
  57. $db = \Config\Database::connect();
  58. $request = $this->request->getJSON(true);
  59. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  60. $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
  61. // 쿼리 빌더
  62. $builder = $db->table('ITEM_ORDER_LIST I');
  63. $builder->select('I.*, U.NICK_NAME');
  64. $builder->join('USER_LIST U', 'I.INF_SEQ = U.SEQ', 'left');
  65. $builder->where('I.ITEM_SEQ', $itemSeq);
  66. if ($infSeq) {
  67. $builder->where('I.INF_SEQ', $infSeq);
  68. }
  69. // 배송정보가 등록되지 않은 주문만 표시 (송장번호 등록용)
  70. // 배송업체와 송장번호가 모두 비어있는 경우만 포함
  71. $builder->where('(I.DELI_COMP IS NULL OR I.DELI_COMP = "")')
  72. ->where('(I.DELI_NUMB IS NULL OR I.DELI_NUMB = "")');
  73. // 주문일 기준으로 정렬
  74. $builder->orderBy('I.ORDER_DATE', 'DESC');
  75. $lists = $builder->get()->getResultArray();
  76. return $this->respond($lists, 200);
  77. }
  78. //구매자 등록
  79. public function deliRegister()
  80. {
  81. $db = \Config\Database::connect();
  82. $request = $this->request->getJSON(true);
  83. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  84. $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
  85. $deliveryList = $request['deliveryList'] ?? [];
  86. $useOrderDateMatching = isset($request['useOrderDateMatching']) ? $request['useOrderDateMatching'] : false;
  87. // 🔍 먼저 전체 유효성 검사
  88. foreach ($deliveryList as $index => $delivery) {
  89. $requiredFields = ['buyerName', 'address', 'phone', 'qty', 'total', 'orderDate'];
  90. foreach ($requiredFields as $field) {
  91. if (!isset($delivery[$field]) || $delivery[$field] === '') {
  92. return $this->fail("deliveryList[$index] 항목의 '{$field}' 값이 누락되었습니다.", 400);
  93. }
  94. }
  95. }
  96. $db->transBegin();
  97. $insertCount = 0;
  98. $updateCount = 0;
  99. try {
  100. if ($useOrderDateMatching) {
  101. // 주문일 기준 매칭 방식 (신규 로직)
  102. foreach ($deliveryList as $delivery) {
  103. $orderDate = date('Y-m-d', strtotime($delivery['orderDate']));
  104. // 기존 데이터 확인 (구매자명, 연락처, 주문일로 매칭)
  105. $existingOrder = $db->table('ITEM_ORDER_LIST')
  106. ->where('ITEM_SEQ', $itemSeq)
  107. ->where('INF_SEQ', $infSeq)
  108. ->where('BUYER_NAME', $delivery['buyerName'])
  109. ->where('PHONE', $delivery['phone'])
  110. ->where('DATE(ORDER_DATE)', $orderDate)
  111. ->get()
  112. ->getRowArray();
  113. $data = [
  114. 'ITEM_SEQ' => $itemSeq,
  115. 'INF_SEQ' => $infSeq,
  116. 'BUYER_NAME' => $delivery['buyerName'],
  117. 'ADDRESS' => $delivery['address'],
  118. 'PHONE' => $delivery['phone'],
  119. 'EMAIL' => $delivery['email'],
  120. 'QTY' => $delivery['qty'],
  121. 'TOTAL' => $delivery['total'],
  122. 'DELI_COMP' => $delivery['deliComp'] ?? '',
  123. 'DELI_NUMB' => $delivery['deliNumb'] ?? '',
  124. 'ORDER_DATE' => date('Y-m-d H:i:s', strtotime($delivery['orderDate'])),
  125. 'REG_DATE' => date('Y-m-d'),
  126. ];
  127. if ($existingOrder) {
  128. // 기존 주문 업데이트
  129. $db->table('ITEM_ORDER_LIST')
  130. ->where('SEQ', $existingOrder['SEQ'])
  131. ->update($data);
  132. $updateCount++;
  133. } else {
  134. // 신규 주문 삽입
  135. $db->table('ITEM_ORDER_LIST')->insert($data);
  136. $insertCount++;
  137. }
  138. }
  139. } else {
  140. // 기존 방식 (전체 삭제 후 재등록)
  141. $db->table('ITEM_ORDER_LIST')
  142. ->where('ITEM_SEQ', $itemSeq)
  143. ->where('INF_SEQ', $infSeq)
  144. ->delete();
  145. foreach ($deliveryList as $delivery) {
  146. $data = [
  147. 'ITEM_SEQ' => $itemSeq,
  148. 'INF_SEQ' => $infSeq,
  149. 'BUYER_NAME' => $delivery['buyerName'],
  150. 'ADDRESS' => $delivery['address'],
  151. 'PHONE' => $delivery['phone'],
  152. 'EMAIL' => $delivery['email'],
  153. 'QTY' => $delivery['qty'],
  154. 'TOTAL' => $delivery['total'],
  155. 'DELI_COMP' => $delivery['deliComp'] ?? '',
  156. 'DELI_NUMB' => $delivery['deliNumb'] ?? '',
  157. 'ORDER_DATE' => date('Y-m-d H:i:s', strtotime($delivery['orderDate'])),
  158. 'REG_DATE' => date('Y-m-d'),
  159. ];
  160. $db->table('ITEM_ORDER_LIST')->insert($data);
  161. $insertCount++;
  162. }
  163. }
  164. $db->transCommit();
  165. if ($useOrderDateMatching) {
  166. return $this->respond([
  167. 'message' => '배송 데이터가 성공적으로 저장되었습니다.',
  168. 'insert_count' => $insertCount,
  169. 'update_count' => $updateCount
  170. ], 200);
  171. } else {
  172. return $this->respond(['message' => '배송 데이터가 성공적으로 저장되었습니다.'], 200);
  173. }
  174. } catch (\Exception $e) {
  175. $db->transRollback();
  176. return $this->fail('배송 데이터 저장 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  177. }
  178. }
  179. //벤더사용 배송정보 업데이트
  180. public function updateDeliveryInfo()
  181. {
  182. $db = \Config\Database::connect();
  183. $request = $this->request->getJSON(true);
  184. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  185. $deliveryUpdates = $request['deliveryUpdates'] ?? [];
  186. if (!$itemSeq || empty($deliveryUpdates)) {
  187. return $this->fail('필수 파라미터가 누락되었습니다.', 400);
  188. }
  189. $db->transBegin();
  190. $updatedCount = 0;
  191. $errors = [];
  192. try {
  193. foreach ($deliveryUpdates as $update) {
  194. $buyerName = $update['buyerName'] ?? '';
  195. $phone = $update['phone'] ?? '';
  196. $deliComp = $update['deliComp'] ?? '';
  197. $deliNumb = $update['deliNumb'] ?? '';
  198. if (!$buyerName || !$phone) {
  199. $errors[] = "구매자명과 연락처는 필수입니다.";
  200. continue;
  201. }
  202. // 업데이트할 데이터 준비
  203. $updateData = [
  204. 'DELI_COMP' => $deliComp,
  205. 'DELI_NUMB' => $deliNumb
  206. ];
  207. // 배송업체와 송장번호가 모두 있을 때만 DELIVERY_STATUS를 SHIPPING으로 변경
  208. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  209. if (in_array('DELIVERY_STATUS', $columns)) {
  210. if (!empty($deliComp) && !empty($deliNumb)) {
  211. $updateData['DELIVERY_STATUS'] = 'SHIPPING';
  212. // 배송 시작일도 함께 업데이트
  213. if (in_array('SHIPPING_DATE', $columns)) {
  214. $updateData['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  215. }
  216. }
  217. }
  218. // 구매자명과 연락처로 해당 주문 찾기
  219. $result = $db->table('ITEM_ORDER_LIST')
  220. ->where('ITEM_SEQ', $itemSeq)
  221. ->where('BUYER_NAME', $buyerName)
  222. ->where('PHONE', $phone)
  223. ->update($updateData);
  224. if ($result) {
  225. $updatedCount++;
  226. } else {
  227. $errors[] = "매칭되는 주문을 찾을 수 없습니다: {$buyerName}({$phone})";
  228. }
  229. }
  230. if ($updatedCount > 0) {
  231. $db->transCommit();
  232. return $this->respond([
  233. 'message' => "배송정보가 성공적으로 업데이트되었습니다.",
  234. 'updated_count' => $updatedCount,
  235. 'errors' => $errors
  236. ], 200);
  237. } else {
  238. $db->transRollback();
  239. return $this->fail('업데이트할 수 있는 데이터가 없습니다.', 400);
  240. }
  241. } catch (\Exception $e) {
  242. $db->transRollback();
  243. return $this->fail('배송정보 업데이트 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  244. }
  245. }
  246. //아이템 상세
  247. public function itemDetail($seq)
  248. {
  249. // DB 객체 얻기
  250. $db = \Config\Database::connect();
  251. $builder = $db->table('ITEM_LIST');
  252. $item = $builder->where('seq', $seq)->get()->getRowArray();
  253. if($item){
  254. return $this->respond($item, 200);
  255. } else {
  256. return $this->respond([
  257. 'status' => 'fail',
  258. 'message' => '유효하지 않은 seq입니다.'
  259. ], 404);
  260. }
  261. }
  262. //아이템 삭제
  263. public function itemDelete($seq)
  264. {
  265. $db = \Config\Database::connect();
  266. $db->transBegin();
  267. //아이템 삭제
  268. $deleted = $db->table('ITEM_LIST')
  269. ->where('SEQ', $seq)
  270. ->update(['DEL_YN' => 'Y']);
  271. if ($db->transStatus() === false || !$deleted) {
  272. $db->transRollback();
  273. return $this->respond(['status' => 'fail', 'message' => '이벤트 삭제 중 오류가 발생했습니다.']);
  274. }
  275. $db->transCommit();
  276. return $this->respond(['status' => 'success', 'message' => '이벤트가 삭제되었습니다.'], 200);
  277. }
  278. // 배송중 리스트 조회
  279. public function getShippingList()
  280. {
  281. $db = \Config\Database::connect();
  282. $request = $this->request->getJSON(true);
  283. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  284. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  285. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  286. $builder = $db->table('ITEM_ORDER_LIST IOL')
  287. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  288. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  289. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left')
  290. ->where('IOL.DELI_COMP !=', '')
  291. ->where('IOL.DELI_NUMB !=', '')
  292. ->where('IOL.DELI_COMP IS NOT NULL')
  293. ->where('IOL.DELI_NUMB IS NOT NULL');
  294. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  295. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  296. if (in_array('DELIVERY_STATUS', $columns)) {
  297. $builder->where('IOL.DELIVERY_STATUS', 'SHIPPING');
  298. } else {
  299. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송중으로 간주
  300. // 단, 배송완료된 것은 제외 (DELIVERED_DATE가 없는 것만)
  301. if (in_array('DELIVERED_DATE', $columns)) {
  302. $builder->where('IOL.DELIVERED_DATE IS NULL');
  303. }
  304. }
  305. // 사용자 타입에 따른 필터링
  306. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  307. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  308. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  309. $builder->where('IOL.INF_SEQ', $infSeq);
  310. }
  311. $builder->orderBy('IOL.REG_DATE', 'DESC');
  312. $lists = $builder->get()->getResultArray();
  313. return $this->respond($lists, 200);
  314. }
  315. // 배송완료 리스트 조회
  316. public function getDeliveredList()
  317. {
  318. $db = \Config\Database::connect();
  319. $request = $this->request->getJSON(true);
  320. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  321. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  322. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  323. $builder = $db->table('ITEM_ORDER_LIST IOL')
  324. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  325. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  326. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  327. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  328. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  329. if (in_array('DELIVERY_STATUS', $columns)) {
  330. $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
  331. } else {
  332. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송완료로 간주
  333. $builder->where('IOL.DELI_COMP !=', '')
  334. ->where('IOL.DELI_NUMB !=', '')
  335. ->where('IOL.DELI_COMP IS NOT NULL')
  336. ->where('IOL.DELI_NUMB IS NOT NULL');
  337. }
  338. // 정산완료되지 않은 주문만 표시 (배송완료 페이지용)
  339. if (in_array('SETTLEMENT_STATUS', $columns)) {
  340. $builder->where('(IOL.SETTLEMENT_STATUS IS NULL OR IOL.SETTLEMENT_STATUS != "COMPLETED")');
  341. }
  342. // 사용자 타입에 따른 필터링
  343. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  344. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  345. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  346. $builder->where('IOL.INF_SEQ', $infSeq);
  347. }
  348. // 정렬을 안전하게 처리
  349. if (in_array('DELIVERED_DATE', $columns)) {
  350. $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
  351. } else {
  352. $builder->orderBy('IOL.REG_DATE', 'DESC');
  353. }
  354. $lists = $builder->get()->getResultArray();
  355. return $this->respond($lists, 200);
  356. }
  357. // 배송완료 처리
  358. public function markAsDelivered()
  359. {
  360. $db = \Config\Database::connect();
  361. $request = $this->request->getJSON(true);
  362. $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
  363. if (empty($orderIds)) {
  364. return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
  365. }
  366. $db->transBegin();
  367. try {
  368. foreach ($orderIds as $orderId) {
  369. $db->table('ITEM_ORDER_LIST')
  370. ->where('SEQ', $orderId)
  371. ->update([
  372. 'DELIVERY_STATUS' => 'DELIVERED',
  373. 'DELIVERED_DATE' => date('Y-m-d H:i:s')
  374. ]);
  375. }
  376. $db->transCommit();
  377. return $this->respond(['message' => '배송완료 처리되었습니다.'], 200);
  378. } catch (\Exception $e) {
  379. $db->transRollback();
  380. return $this->fail('배송완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  381. }
  382. }
  383. // 정산완료 처리
  384. public function markAsSettled()
  385. {
  386. $db = \Config\Database::connect();
  387. $request = $this->request->getJSON(true);
  388. $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
  389. if (empty($orderIds)) {
  390. return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
  391. }
  392. $db->transBegin();
  393. try {
  394. foreach ($orderIds as $orderId) {
  395. $db->table('ITEM_ORDER_LIST')
  396. ->where('SEQ', $orderId)
  397. ->update([
  398. 'SETTLEMENT_STATUS' => 'COMPLETED',
  399. 'SETTLED_DATE' => date('Y-m-d H:i:s')
  400. ]);
  401. }
  402. $db->transCommit();
  403. return $this->respond(['message' => '정산완료 처리되었습니다.'], 200);
  404. } catch (\Exception $e) {
  405. $db->transRollback();
  406. return $this->fail('정산완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  407. }
  408. }
  409. // 정산관리 리스트 조회
  410. public function getSettlementList()
  411. {
  412. $db = \Config\Database::connect();
  413. $request = $this->request->getJSON(true);
  414. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  415. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  416. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  417. $settlementStatus = isset($request['SETTLEMENT_STATUS']) ? $request['SETTLEMENT_STATUS'] : null;
  418. $builder = $db->table('ITEM_ORDER_LIST IOL')
  419. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  420. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  421. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  422. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  423. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  424. if (in_array('DELIVERY_STATUS', $columns)) {
  425. $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
  426. } else {
  427. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 대상으로 함
  428. $builder->where('IOL.DELI_COMP !=', '')
  429. ->where('IOL.DELI_NUMB !=', '')
  430. ->where('IOL.DELI_COMP IS NOT NULL')
  431. ->where('IOL.DELI_NUMB IS NOT NULL');
  432. }
  433. // 정산 상태 필터링 (SETTLEMENT_STATUS 컬럼이 존재하는 경우만)
  434. if ($settlementStatus && in_array('SETTLEMENT_STATUS', $columns)) {
  435. $builder->where('IOL.SETTLEMENT_STATUS', $settlementStatus);
  436. }
  437. // 사용자 타입에 따른 필터링
  438. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  439. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  440. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  441. $builder->where('IOL.INF_SEQ', $infSeq);
  442. }
  443. $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
  444. $lists = $builder->get()->getResultArray();
  445. return $this->respond($lists, 200);
  446. }
  447. // 벤더용 대기중 주문 목록 조회
  448. public function getPendingOrdersForVendor()
  449. {
  450. $db = \Config\Database::connect();
  451. $request = $this->request->getJSON(true);
  452. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  453. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  454. if ($memberType !== 'VENDOR' || empty($companyNumber)) {
  455. return $this->respond([], 200);
  456. }
  457. // 벤더의 제품에 대한 대기중 주문만 조회
  458. $builder = $db->table('ITEM_ORDER_LIST IOL')
  459. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.COMPANY_NUMBER, U.NICK_NAME')
  460. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  461. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left')
  462. ->where('IL.COMPANY_NUMBER', $companyNumber);
  463. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  464. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  465. if (in_array('DELIVERY_STATUS', $columns)) {
  466. // DELIVERY_STATUS가 PENDING이거나 NULL인 경우 (대기중)
  467. $builder->where('(IOL.DELIVERY_STATUS = "PENDING" OR IOL.DELIVERY_STATUS IS NULL)');
  468. } else {
  469. // DELIVERY_STATUS 컬럼이 없으면 기존 방식으로 배송정보로 판단
  470. $builder->where('(IOL.DELI_COMP IS NULL OR IOL.DELI_COMP = "")')
  471. ->where('(IOL.DELI_NUMB IS NULL OR IOL.DELI_NUMB = "")');
  472. }
  473. $builder->orderBy('IOL.REG_DATE', 'DESC');
  474. $lists = $builder->get()->getResultArray();
  475. return $this->respond($lists, 200);
  476. }
  477. // 배송 상태 업데이트
  478. public function updateStatus()
  479. {
  480. $db = \Config\Database::connect();
  481. $request = $this->request->getJSON(true);
  482. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  483. $status = isset($request['status']) ? $request['status'] : null;
  484. if (!$itemSeq || !$status) {
  485. return $this->fail('필수 파라미터가 누락되었습니다.', 400);
  486. }
  487. // 유효한 상태값인지 확인
  488. $validStatuses = ['PENDING', 'SHIPPING', 'DELIVERED', 'COMPLETE'];
  489. if (!in_array($status, $validStatuses)) {
  490. return $this->fail('유효하지 않은 상태값입니다.', 400);
  491. }
  492. $db->transBegin();
  493. try {
  494. // DELIVERY_STATUS 컬럼이 존재하는지 확인
  495. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  496. if (in_array('DELIVERY_STATUS', $columns)) {
  497. $updateData = ['DELIVERY_STATUS' => $status];
  498. // 상태에 따라 추가 필드 업데이트
  499. if ($status === 'SHIPPING' && in_array('SHIPPING_DATE', $columns)) {
  500. $updateData['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  501. } elseif ($status === 'DELIVERED' && in_array('DELIVERED_DATE', $columns)) {
  502. $updateData['DELIVERED_DATE'] = date('Y-m-d H:i:s');
  503. }
  504. $result = $db->table('ITEM_ORDER_LIST')
  505. ->where('ITEM_SEQ', $itemSeq)
  506. ->update($updateData);
  507. if ($result) {
  508. $db->transCommit();
  509. return $this->respond([
  510. 'message' => '상태가 성공적으로 업데이트되었습니다.',
  511. 'status' => $status
  512. ], 200);
  513. } else {
  514. $db->transRollback();
  515. return $this->fail('상태 업데이트에 실패했습니다.', 500);
  516. }
  517. } else {
  518. $db->transRollback();
  519. return $this->fail('DELIVERY_STATUS 컬럼이 존재하지 않습니다.', 500);
  520. }
  521. } catch (\Exception $e) {
  522. $db->transRollback();
  523. return $this->fail('상태 업데이트 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  524. }
  525. }
  526. }