Deli.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  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. // DELIVERY_STATUS 컬럼이 있으면 상태 설정
  128. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  129. if (in_array('DELIVERY_STATUS', $columns)) {
  130. // 배송업체와 송장번호가 모두 있으면 SHIPPING, 없으면 PENDING
  131. if (!empty($delivery['deliComp']) && !empty($delivery['deliNumb'])) {
  132. $data['DELIVERY_STATUS'] = 'SHIPPING';
  133. if (in_array('SHIPPING_DATE', $columns)) {
  134. $data['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  135. }
  136. } else {
  137. $data['DELIVERY_STATUS'] = 'PENDING';
  138. }
  139. }
  140. if ($existingOrder) {
  141. // 기존 주문 업데이트
  142. $db->table('ITEM_ORDER_LIST')
  143. ->where('SEQ', $existingOrder['SEQ'])
  144. ->update($data);
  145. $updateCount++;
  146. } else {
  147. // 신규 주문 삽입
  148. $db->table('ITEM_ORDER_LIST')->insert($data);
  149. $insertCount++;
  150. }
  151. }
  152. } else {
  153. // 기존 방식 (전체 삭제 후 재등록)
  154. $db->table('ITEM_ORDER_LIST')
  155. ->where('ITEM_SEQ', $itemSeq)
  156. ->where('INF_SEQ', $infSeq)
  157. ->delete();
  158. foreach ($deliveryList as $delivery) {
  159. $data = [
  160. 'ITEM_SEQ' => $itemSeq,
  161. 'INF_SEQ' => $infSeq,
  162. 'BUYER_NAME' => $delivery['buyerName'],
  163. 'ADDRESS' => $delivery['address'],
  164. 'PHONE' => $delivery['phone'],
  165. 'EMAIL' => $delivery['email'],
  166. 'QTY' => $delivery['qty'],
  167. 'TOTAL' => $delivery['total'],
  168. 'DELI_COMP' => $delivery['deliComp'] ?? '',
  169. 'DELI_NUMB' => $delivery['deliNumb'] ?? '',
  170. 'ORDER_DATE' => date('Y-m-d H:i:s', strtotime($delivery['orderDate'])),
  171. 'REG_DATE' => date('Y-m-d'),
  172. ];
  173. // DELIVERY_STATUS 컬럼이 있으면 상태 설정
  174. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  175. if (in_array('DELIVERY_STATUS', $columns)) {
  176. // 배송업체와 송장번호가 모두 있으면 SHIPPING, 없으면 PENDING
  177. if (!empty($delivery['deliComp']) && !empty($delivery['deliNumb'])) {
  178. $data['DELIVERY_STATUS'] = 'SHIPPING';
  179. if (in_array('SHIPPING_DATE', $columns)) {
  180. $data['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  181. }
  182. } else {
  183. $data['DELIVERY_STATUS'] = 'PENDING';
  184. }
  185. }
  186. $db->table('ITEM_ORDER_LIST')->insert($data);
  187. $insertCount++;
  188. }
  189. }
  190. $db->transCommit();
  191. if ($useOrderDateMatching) {
  192. return $this->respond([
  193. 'message' => '배송 데이터가 성공적으로 저장되었습니다.',
  194. 'insert_count' => $insertCount,
  195. 'update_count' => $updateCount
  196. ], 200);
  197. } else {
  198. return $this->respond(['message' => '배송 데이터가 성공적으로 저장되었습니다.'], 200);
  199. }
  200. } catch (\Exception $e) {
  201. $db->transRollback();
  202. return $this->fail('배송 데이터 저장 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  203. }
  204. }
  205. //벤더사용 배송정보 업데이트
  206. public function updateDeliveryInfo()
  207. {
  208. $db = \Config\Database::connect();
  209. $request = $this->request->getJSON(true);
  210. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  211. $deliveryUpdates = $request['deliveryUpdates'] ?? [];
  212. if (!$itemSeq || empty($deliveryUpdates)) {
  213. return $this->fail('필수 파라미터가 누락되었습니다.', 400);
  214. }
  215. $db->transBegin();
  216. $updatedCount = 0;
  217. $errors = [];
  218. $debugLogs = []; // 디버깅 로그 수집용
  219. try {
  220. log_message('info', '벤더 배송정보 업데이트 요청: ' . json_encode($request));
  221. $debugLogs[] = '벤더 배송정보 업데이트 요청: ' . json_encode($request);
  222. foreach ($deliveryUpdates as $update) {
  223. $buyerName = $update['buyerName'] ?? '';
  224. $phone = $update['phone'] ?? '';
  225. $deliComp = $update['deliComp'] ?? '';
  226. $deliNumb = $update['deliNumb'] ?? '';
  227. $logMessage = "배송정보 업데이트 시도: {$buyerName}({$phone}) - 배송업체: {$deliComp}, 송장번호: {$deliNumb}";
  228. log_message('info', $logMessage);
  229. $debugLogs[] = $logMessage;
  230. if (!$buyerName || !$phone) {
  231. $errors[] = "구매자명과 연락처는 필수입니다.";
  232. continue;
  233. }
  234. // 업데이트할 데이터 준비
  235. $updateData = [
  236. 'DELI_COMP' => $deliComp,
  237. 'DELI_NUMB' => $deliNumb
  238. ];
  239. // 배송업체와 송장번호가 모두 있을 때만 DELIVERY_STATUS를 SHIPPING으로 변경
  240. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  241. if (in_array('DELIVERY_STATUS', $columns)) {
  242. if (!empty($deliComp) && !empty($deliNumb)) {
  243. $updateData['DELIVERY_STATUS'] = 'SHIPPING';
  244. // 배송 시작일도 함께 업데이트
  245. if (in_array('SHIPPING_DATE', $columns)) {
  246. $updateData['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  247. }
  248. }
  249. }
  250. // 먼저 해당 조건의 데이터가 존재하는지 확인
  251. $existingOrder = $db->table('ITEM_ORDER_LIST')
  252. ->where('ITEM_SEQ', $itemSeq)
  253. ->where('BUYER_NAME', $buyerName)
  254. ->where('PHONE', $phone)
  255. ->get()
  256. ->getRowArray();
  257. $conditionLog = '업데이트 조건: ITEM_SEQ=' . $itemSeq . ', BUYER_NAME=' . $buyerName . ', PHONE=' . $phone;
  258. log_message('info', $conditionLog);
  259. $debugLogs[] = $conditionLog;
  260. $existsLog = '기존 주문 존재 여부: ' . ($existingOrder ? 'YES' : 'NO');
  261. log_message('info', $existsLog);
  262. $debugLogs[] = $existsLog;
  263. if ($existingOrder) {
  264. $existingLog = '기존 주문 데이터: ' . json_encode($existingOrder);
  265. log_message('info', $existingLog);
  266. $debugLogs[] = $existingLog;
  267. }
  268. $updateLog = '업데이트 데이터: ' . json_encode($updateData);
  269. log_message('info', $updateLog);
  270. $debugLogs[] = $updateLog;
  271. // SQL 쿼리 로깅을 위해 쿼리 빌더 분리
  272. $builder = $db->table('ITEM_ORDER_LIST')
  273. ->where('ITEM_SEQ', $itemSeq)
  274. ->where('BUYER_NAME', $buyerName)
  275. ->where('PHONE', $phone);
  276. // 실행될 SQL 쿼리 로그
  277. $sql = $builder->getCompiledUpdate($updateData);
  278. $sqlLog = '실행될 SQL 쿼리: ' . $sql;
  279. log_message('info', $sqlLog);
  280. $debugLogs[] = $sqlLog;
  281. $result = $builder->update($updateData);
  282. $resultLog = '업데이트 결과: ' . ($result ? 'SUCCESS' : 'FAILED') . ' (affected rows: ' . $result . ')';
  283. log_message('info', $resultLog);
  284. $debugLogs[] = $resultLog;
  285. if ($result) {
  286. $updatedCount++;
  287. } else {
  288. $errors[] = "매칭되는 주문을 찾을 수 없습니다: {$buyerName}({$phone})";
  289. }
  290. }
  291. if ($updatedCount > 0) {
  292. $db->transCommit();
  293. return $this->respond([
  294. 'message' => "배송정보가 성공적으로 업데이트되었습니다.",
  295. 'updated_count' => $updatedCount,
  296. 'errors' => $errors
  297. ], 200);
  298. } else {
  299. $db->transRollback();
  300. return $this->fail('업데이트할 수 있는 데이터가 없습니다.', 400);
  301. }
  302. } catch (\Exception $e) {
  303. $db->transRollback();
  304. return $this->fail('배송정보 업데이트 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  305. }
  306. }
  307. //아이템 상세
  308. public function itemDetail($seq)
  309. {
  310. // DB 객체 얻기
  311. $db = \Config\Database::connect();
  312. $builder = $db->table('ITEM_LIST');
  313. $item = $builder->where('seq', $seq)->get()->getRowArray();
  314. if($item){
  315. return $this->respond($item, 200);
  316. } else {
  317. return $this->respond([
  318. 'status' => 'fail',
  319. 'message' => '유효하지 않은 seq입니다.'
  320. ], 404);
  321. }
  322. }
  323. //아이템 삭제
  324. public function itemDelete($seq)
  325. {
  326. $db = \Config\Database::connect();
  327. $db->transBegin();
  328. //아이템 삭제
  329. $deleted = $db->table('ITEM_LIST')
  330. ->where('SEQ', $seq)
  331. ->update(['DEL_YN' => 'Y']);
  332. if ($db->transStatus() === false || !$deleted) {
  333. $db->transRollback();
  334. return $this->respond(['status' => 'fail', 'message' => '이벤트 삭제 중 오류가 발생했습니다.']);
  335. }
  336. $db->transCommit();
  337. return $this->respond(['status' => 'success', 'message' => '이벤트가 삭제되었습니다.'], 200);
  338. }
  339. // 배송중 리스트 조회
  340. public function getShippingList()
  341. {
  342. $db = \Config\Database::connect();
  343. $request = $this->request->getJSON(true);
  344. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  345. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  346. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  347. // 디버깅 로그
  348. log_message('info', '배송중 리스트 조회 파라미터: ' . json_encode($request));
  349. $builder = $db->table('ITEM_ORDER_LIST IOL')
  350. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  351. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  352. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  353. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  354. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  355. log_message('info', 'ITEM_ORDER_LIST 컬럼: ' . json_encode($columns));
  356. if (in_array('DELIVERY_STATUS', $columns)) {
  357. // DELIVERY_STATUS 컬럼이 있는 경우 - 배송업체와 송장번호가 있으면서 SHIPPING 상태인 것
  358. $builder->where('IOL.DELI_COMP !=', '')
  359. ->where('IOL.DELI_NUMB !=', '')
  360. ->where('IOL.DELI_COMP IS NOT NULL')
  361. ->where('IOL.DELI_NUMB IS NOT NULL')
  362. ->where('IOL.DELIVERY_STATUS', 'SHIPPING');
  363. log_message('info', '배송중 조건: 배송정보 있고 DELIVERY_STATUS = SHIPPING');
  364. } else {
  365. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송중으로 간주
  366. $builder->where('IOL.DELI_COMP !=', '')
  367. ->where('IOL.DELI_NUMB !=', '')
  368. ->where('IOL.DELI_COMP IS NOT NULL')
  369. ->where('IOL.DELI_NUMB IS NOT NULL');
  370. // 배송완료된 것은 제외 (DELIVERED_DATE가 없는 것만)
  371. if (in_array('DELIVERED_DATE', $columns)) {
  372. $builder->where('IOL.DELIVERED_DATE IS NULL');
  373. }
  374. log_message('info', '배송중 조건: 배송업체+송장번호 있고 배송완료일 없음');
  375. }
  376. // 사용자 타입에 따른 필터링
  377. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  378. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  379. log_message('info', '벤더 필터링: COMPANY_NUMBER = ' . $companyNumber);
  380. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  381. $builder->where('IOL.INF_SEQ', $infSeq);
  382. log_message('info', '인플루언서 필터링: INF_SEQ = ' . $infSeq);
  383. }
  384. $builder->orderBy('IOL.REG_DATE', 'DESC');
  385. // 실행된 쿼리 로그
  386. $query = $builder->getCompiledSelect(false);
  387. log_message('info', '배송중 리스트 쿼리: ' . $query);
  388. $lists = $builder->get()->getResultArray();
  389. log_message('info', '배송중 리스트 결과 개수: ' . count($lists));
  390. // 첫 번째 결과 로그
  391. if (!empty($lists)) {
  392. log_message('info', '첫 번째 배송중 데이터: ' . json_encode($lists[0]));
  393. }
  394. // 디버깅을 위해 조건 없이 전체 데이터도 확인
  395. $allDataBuilder = $db->table('ITEM_ORDER_LIST IOL')
  396. ->select('IOL.*, IL.NAME as ITEM_NAME')
  397. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner');
  398. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  399. $allDataBuilder->where('IL.COMPANY_NUMBER', $companyNumber);
  400. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  401. $allDataBuilder->where('IOL.INF_SEQ', $infSeq);
  402. }
  403. $allDataBuilder->orderBy('IOL.REG_DATE', 'DESC')->limit(5);
  404. $allData = $allDataBuilder->get()->getResultArray();
  405. log_message('info', '전체 주문 데이터 (최근 5건): ' . json_encode($allData));
  406. return $this->respond($lists, 200);
  407. }
  408. // 배송완료 리스트 조회
  409. public function getDeliveredList()
  410. {
  411. $db = \Config\Database::connect();
  412. $request = $this->request->getJSON(true);
  413. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  414. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  415. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  416. $builder = $db->table('ITEM_ORDER_LIST IOL')
  417. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  418. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  419. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  420. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  421. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  422. if (in_array('DELIVERY_STATUS', $columns)) {
  423. $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
  424. } else {
  425. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 배송완료로 간주
  426. $builder->where('IOL.DELI_COMP !=', '')
  427. ->where('IOL.DELI_NUMB !=', '')
  428. ->where('IOL.DELI_COMP IS NOT NULL')
  429. ->where('IOL.DELI_NUMB IS NOT NULL');
  430. }
  431. // 정산완료되지 않은 주문만 표시 (배송완료 페이지용)
  432. if (in_array('SETTLEMENT_STATUS', $columns)) {
  433. $builder->where('(IOL.SETTLEMENT_STATUS IS NULL OR IOL.SETTLEMENT_STATUS != "COMPLETED")');
  434. }
  435. // 사용자 타입에 따른 필터링
  436. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  437. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  438. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  439. $builder->where('IOL.INF_SEQ', $infSeq);
  440. }
  441. // 정렬을 안전하게 처리
  442. if (in_array('DELIVERED_DATE', $columns)) {
  443. $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
  444. } else {
  445. $builder->orderBy('IOL.REG_DATE', 'DESC');
  446. }
  447. $lists = $builder->get()->getResultArray();
  448. return $this->respond($lists, 200);
  449. }
  450. // 배송완료 처리
  451. public function markAsDelivered()
  452. {
  453. $db = \Config\Database::connect();
  454. $request = $this->request->getJSON(true);
  455. $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
  456. if (empty($orderIds)) {
  457. return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
  458. }
  459. $db->transBegin();
  460. try {
  461. foreach ($orderIds as $orderId) {
  462. $db->table('ITEM_ORDER_LIST')
  463. ->where('SEQ', $orderId)
  464. ->update([
  465. 'DELIVERY_STATUS' => 'DELIVERED',
  466. 'DELIVERED_DATE' => date('Y-m-d H:i:s')
  467. ]);
  468. }
  469. $db->transCommit();
  470. return $this->respond(['message' => '배송완료 처리되었습니다.'], 200);
  471. } catch (\Exception $e) {
  472. $db->transRollback();
  473. return $this->fail('배송완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  474. }
  475. }
  476. // 정산완료 처리
  477. public function markAsSettled()
  478. {
  479. $db = \Config\Database::connect();
  480. $request = $this->request->getJSON(true);
  481. $orderIds = isset($request['order_ids']) ? $request['order_ids'] : [];
  482. if (empty($orderIds)) {
  483. return $this->fail('처리할 주문이 선택되지 않았습니다.', 400);
  484. }
  485. $db->transBegin();
  486. try {
  487. foreach ($orderIds as $orderId) {
  488. $db->table('ITEM_ORDER_LIST')
  489. ->where('SEQ', $orderId)
  490. ->update([
  491. 'SETTLEMENT_STATUS' => 'COMPLETED',
  492. 'SETTLED_DATE' => date('Y-m-d H:i:s')
  493. ]);
  494. }
  495. $db->transCommit();
  496. return $this->respond(['message' => '정산완료 처리되었습니다.'], 200);
  497. } catch (\Exception $e) {
  498. $db->transRollback();
  499. return $this->fail('정산완료 처리 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  500. }
  501. }
  502. // 정산관리 리스트 조회
  503. public function getSettlementList()
  504. {
  505. $db = \Config\Database::connect();
  506. $request = $this->request->getJSON(true);
  507. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  508. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  509. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  510. $settlementStatus = isset($request['SETTLEMENT_STATUS']) ? $request['SETTLEMENT_STATUS'] : null;
  511. $builder = $db->table('ITEM_ORDER_LIST IOL')
  512. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  513. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  514. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  515. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  516. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  517. if (in_array('DELIVERY_STATUS', $columns)) {
  518. $builder->where('IOL.DELIVERY_STATUS', 'DELIVERED');
  519. } else {
  520. // DELIVERY_STATUS 컬럼이 없으면 배송업체와 송장번호가 있는 것을 대상으로 함
  521. $builder->where('IOL.DELI_COMP !=', '')
  522. ->where('IOL.DELI_NUMB !=', '')
  523. ->where('IOL.DELI_COMP IS NOT NULL')
  524. ->where('IOL.DELI_NUMB IS NOT NULL');
  525. }
  526. // 정산 상태 필터링 (SETTLEMENT_STATUS 컬럼이 존재하는 경우만)
  527. if ($settlementStatus && in_array('SETTLEMENT_STATUS', $columns)) {
  528. $builder->where('IOL.SETTLEMENT_STATUS', $settlementStatus);
  529. }
  530. // 사용자 타입에 따른 필터링
  531. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  532. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  533. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  534. $builder->where('IOL.INF_SEQ', $infSeq);
  535. }
  536. $builder->orderBy('IOL.DELIVERED_DATE', 'DESC');
  537. $lists = $builder->get()->getResultArray();
  538. return $this->respond($lists, 200);
  539. }
  540. // 벤더용 대기중 주문 목록 조회
  541. public function getPendingOrdersForVendor()
  542. {
  543. $db = \Config\Database::connect();
  544. $request = $this->request->getJSON(true);
  545. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  546. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  547. if ($memberType !== 'VENDOR' || empty($companyNumber)) {
  548. return $this->respond([], 200);
  549. }
  550. // 벤더의 제품에 대한 대기중 주문만 조회
  551. $builder = $db->table('ITEM_ORDER_LIST IOL')
  552. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.COMPANY_NUMBER, U.NICK_NAME')
  553. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  554. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left')
  555. ->where('IL.COMPANY_NUMBER', $companyNumber);
  556. // DELIVERY_STATUS 컬럼이 존재하는지 확인하고 조건 추가
  557. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  558. if (in_array('DELIVERY_STATUS', $columns)) {
  559. // DELIVERY_STATUS가 PENDING이거나 NULL인 경우 (대기중)
  560. $builder->where('(IOL.DELIVERY_STATUS = "PENDING" OR IOL.DELIVERY_STATUS IS NULL)');
  561. } else {
  562. // DELIVERY_STATUS 컬럼이 없으면 기존 방식으로 배송정보로 판단
  563. $builder->where('(IOL.DELI_COMP IS NULL OR IOL.DELI_COMP = "")')
  564. ->where('(IOL.DELI_NUMB IS NULL OR IOL.DELI_NUMB = "")');
  565. }
  566. $builder->orderBy('IOL.REG_DATE', 'DESC');
  567. $lists = $builder->get()->getResultArray();
  568. return $this->respond($lists, 200);
  569. }
  570. // 배송 상태 업데이트
  571. public function updateStatus()
  572. {
  573. $db = \Config\Database::connect();
  574. $request = $this->request->getJSON(true);
  575. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  576. $status = isset($request['status']) ? $request['status'] : null;
  577. if (!$itemSeq || !$status) {
  578. return $this->fail('필수 파라미터가 누락되었습니다.', 400);
  579. }
  580. // 유효한 상태값인지 확인
  581. $validStatuses = ['PENDING', 'SHIPPING', 'DELIVERED', 'COMPLETE'];
  582. if (!in_array($status, $validStatuses)) {
  583. return $this->fail('유효하지 않은 상태값입니다.', 400);
  584. }
  585. $db->transBegin();
  586. try {
  587. // DELIVERY_STATUS 컬럼이 존재하는지 확인
  588. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  589. if (in_array('DELIVERY_STATUS', $columns)) {
  590. $updateData = ['DELIVERY_STATUS' => $status];
  591. // 상태에 따라 추가 필드 업데이트
  592. if ($status === 'SHIPPING' && in_array('SHIPPING_DATE', $columns)) {
  593. $updateData['SHIPPING_DATE'] = date('Y-m-d H:i:s');
  594. } elseif ($status === 'DELIVERED' && in_array('DELIVERED_DATE', $columns)) {
  595. $updateData['DELIVERED_DATE'] = date('Y-m-d H:i:s');
  596. }
  597. $result = $db->table('ITEM_ORDER_LIST')
  598. ->where('ITEM_SEQ', $itemSeq)
  599. ->update($updateData);
  600. if ($result) {
  601. $db->transCommit();
  602. return $this->respond([
  603. 'message' => '상태가 성공적으로 업데이트되었습니다.',
  604. 'status' => $status
  605. ], 200);
  606. } else {
  607. $db->transRollback();
  608. return $this->fail('상태 업데이트에 실패했습니다.', 500);
  609. }
  610. } else {
  611. $db->transRollback();
  612. return $this->fail('DELIVERY_STATUS 컬럼이 존재하지 않습니다.', 500);
  613. }
  614. } catch (\Exception $e) {
  615. $db->transRollback();
  616. return $this->fail('상태 업데이트 중 오류가 발생했습니다: ' . $e->getMessage(), 500);
  617. }
  618. }
  619. // 디버깅용 주문 데이터 조회
  620. public function debugOrderData()
  621. {
  622. $db = \Config\Database::connect();
  623. $request = $this->request->getJSON(true);
  624. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  625. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  626. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  627. // 전체 주문 데이터 조회
  628. $builder = $db->table('ITEM_ORDER_LIST IOL')
  629. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.COMPANY_NUMBER as ITEM_COMPANY')
  630. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner');
  631. // 사용자 타입에 따른 필터링
  632. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  633. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  634. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  635. $builder->where('IOL.INF_SEQ', $infSeq);
  636. }
  637. $builder->orderBy('IOL.REG_DATE', 'DESC')
  638. ->limit(10); // 최근 10건만
  639. $orders = $builder->get()->getResultArray();
  640. // 컬럼 정보도 함께 반환
  641. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  642. return $this->respond([
  643. 'columns' => $columns,
  644. 'orders' => $orders,
  645. 'count' => count($orders),
  646. 'filter' => [
  647. 'memberType' => $memberType,
  648. 'companyNumber' => $companyNumber,
  649. 'infSeq' => $infSeq
  650. ]
  651. ], 200);
  652. }
  653. // 배송중 데이터 강제 조회 (디버깅용)
  654. public function getShippingListDebug()
  655. {
  656. $db = \Config\Database::connect();
  657. $request = $this->request->getJSON(true);
  658. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  659. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  660. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  661. $builder = $db->table('ITEM_ORDER_LIST IOL')
  662. ->select('IOL.*, IL.NAME as ITEM_NAME, IL.PRICE1, IL.PRICE2, U.NICK_NAME')
  663. ->join('ITEM_LIST IL', 'IOL.ITEM_SEQ = IL.SEQ', 'inner')
  664. ->join('USER_LIST U', 'IOL.INF_SEQ = U.SEQ', 'left');
  665. // 사용자 타입에 따른 필터링만 적용 (배송 조건 제외)
  666. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  667. $builder->where('IL.COMPANY_NUMBER', $companyNumber);
  668. } elseif ($memberType === 'INFLUENCER' && !empty($infSeq)) {
  669. $builder->where('IOL.INF_SEQ', $infSeq);
  670. }
  671. $builder->orderBy('IOL.REG_DATE', 'DESC');
  672. $allData = $builder->get()->getResultArray();
  673. // 각 조건별로 분류
  674. $withDeliveryInfo = [];
  675. $withShippingStatus = [];
  676. $withBoth = [];
  677. $columns = $db->getFieldNames('ITEM_ORDER_LIST');
  678. foreach ($allData as $item) {
  679. $hasDeliveryInfo = !empty($item['DELI_COMP']) && !empty($item['DELI_NUMB']);
  680. $hasShippingStatus = isset($item['DELIVERY_STATUS']) && $item['DELIVERY_STATUS'] === 'SHIPPING';
  681. if ($hasDeliveryInfo) {
  682. $withDeliveryInfo[] = $item;
  683. }
  684. if ($hasShippingStatus) {
  685. $withShippingStatus[] = $item;
  686. }
  687. if ($hasDeliveryInfo && $hasShippingStatus) {
  688. $withBoth[] = $item;
  689. }
  690. }
  691. return $this->respond([
  692. 'columns' => $columns,
  693. 'total_count' => count($allData),
  694. 'with_delivery_info' => [
  695. 'count' => count($withDeliveryInfo),
  696. 'data' => array_slice($withDeliveryInfo, 0, 3)
  697. ],
  698. 'with_shipping_status' => [
  699. 'count' => count($withShippingStatus),
  700. 'data' => array_slice($withShippingStatus, 0, 3)
  701. ],
  702. 'with_both_conditions' => [
  703. 'count' => count($withBoth),
  704. 'data' => array_slice($withBoth, 0, 3)
  705. ],
  706. 'sample_all_data' => array_slice($allData, 0, 3),
  707. 'filter' => [
  708. 'memberType' => $memberType,
  709. 'companyNumber' => $companyNumber,
  710. 'infSeq' => $infSeq
  711. ]
  712. ], 200);
  713. }
  714. }