Deli.php 26 KB

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