<?php
use Psr\Container\ContainerInterface;
use Psr\Http\Message\RequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

class ManagementPlatformController
{
     protected $container;
     
     public function __construct(ContainerInterface $container) {
          $this->container = $container;
     }

     // ==================================================
     // 아트웍 관리
     // ==================================================
     public function artworkList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/artwork/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          $pageSize = isset($_COOKIE['pageSize']) ? $_COOKIE['pageSize'] : 10;
          $resData['pageSize'] = $pageSize;

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/artwork/list.phtml', $resData);
     }

     public function postArtworkList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/artwork/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['PageID'] = (int)$reqData['PageID'];
          $dbParams['PageSize'] = (int)$reqData['PageSize'];
          $data = $AccountDB->USPT_GetList_Artworks($dbParams);
          
          if ($data['Code'] == 1) {
               $resData['list'] = $data['Data']['List'];

               foreach ($data['Data']['List'] as $key => $value) {
                    $data['Data']['List'][$key]['Thumbnail'] = str_replace('origin','thumb', $value['FilePath']);
               }

               $result['List'] = $data['Data']['List'];
               $result['TotalCount'] = $data['Data']['TotalCount'];
          }
          $result['Code'] = $data['Code'];
         
          return $response->withJson($result);
     }
     
     public function artworkInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/artwork/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/artwork/input.phtml', $resData);
     }

     public function postArtworkInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/artwork/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['ArtworkName'] = $reqData['ArtworkName'];
          $dbParams['CharacterName'] = $reqData['CharacterName'];
          $dbParams['FilePath'] = $reqData['FilePath'];
          $dbParams['CustomProperties'] = $reqData['CustomProperties'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Add_Artworks($dbParams);
          
          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          return $response->withJson($result);
     }
     

     // ==================================================
     //    플랫폼 점검 관리
     // ==================================================
     public function innoMaintenanceList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/innoMaintenance/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $server = 'statusserver';
          $portType = 'ex';
          $url = '/status/main';
          $result = $common->getApi($this->container, $server, $portType, $url, null);
          
          if ($result['return'] == 0) {
               foreach ($result['value'] as $key => $value) {
                    if ($key == 'state') {
                         $result['value']['statename'] = enum::MAINTENANCE_STATUS[$value];
                         
                         // 점검 중
                         if ($value == 1) {
                              foreach ($result['value']['info'] as $infoKey => $infoValue) {
                                   if ($infoKey == 'start_date') {
                                        $result['value']['info']['startdatetime'] = date('Y-m-d H:i:s', ($infoValue/1000));
                                   }

                                   if ($infoKey == 'end_date') {
                                        $result['value']['info']['enddatetime'] = date('Y-m-d H:i:s', ($infoValue/1000));
                                   }
                              }
                              
                              
                         }
                    }
               }
          }
          $resData['list'] = $result;

          $resData['status'] = enum::MAINTENANCE_STATUS;
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/innoMaintenance/list.phtml', $resData);
     }
     
     public function postInnoMaintenanceInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/innoMaintenance/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          $params = [];
          $params['state'] = (int)$reqData['Status'];
          if ($reqData['Status'] == 1) {
               $params['info']['start_date'] = (string)$reqData['StartDatetime'];
               $params['info']['end_date'] = (string)$reqData['EndDatetime'];
               $params['info']['content'] = $reqData['Content'];
          }

          $server = 'statusserver';
          $portType = 'in';
          $url = '/status/main';
          $result = $common->putApi($this->container, $server, $portType, $url, $params);
          
          // USER ACTION 로그 생성 - API 호출
          $log = array();
          $log = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_PUT, $server, $portType, $url, $params, $result, $result['return']);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          return $response->withJson($result);
     }
     
     
     // ==================================================
     //    브릿지 점검 관리
     // ==================================================
     public function bridgeMaintenanceList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/bridgeMaintenance/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $server = 'bridgeserver';
          $portType = 'in';
          $url = '/system/maintenance';
          $result = $common->getApi($this->container, $server, $portType, $url, null);
          
          if ($result['return'] == 0) {
               foreach ($result['value'] as $key => $value) {
                    if ($key == 'state') {
                         $result['value']['statename'] = enum::BRIDGE_MAINTENANCE_STATUS[$value];
                    }
               }
          }
          $resData['list'] = $result;

          $resData['status'] = enum::BRIDGE_MAINTENANCE_STATUS;
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/bridgeMaintenance/list.phtml', $resData);
     }
     
     public function postBridgeMaintenanceInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/bridgeMaintenance/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          $params = [];
          $params['state'] = (bool)$reqData['Status'];

          $server = 'bridgeserver';
          $portType = 'in';
          $url = '/system/maintenance';
          $result = $common->putApi($this->container, $server, $portType, $url, $params);
          
          // USER ACTION 로그 생성 - API 호출
          $log = array();
          $log = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_PUT, $server, $portType, $url, $params, $result, $result['return']);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          return $response->withJson($result);
     }


     // ==================================================
     //    뉴스 관리
     // ==================================================
     public function newsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          $pageSize = isset($_COOKIE['pageSize']) ? $_COOKIE['pageSize'] : 10;
          $resData['pageSize'] = $pageSize;
          
          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/news/list.phtml', $resData);
     }

     public function postNewsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['Title'] = $reqData['Title'];
          $dbParams['PageID'] = (int)$reqData['PageID'];
          $dbParams['PageSize'] = (int)$reqData['PageSize'];
          $result = $AccountDB->USPT_Srch_News($dbParams);
          
          return $response->withJson($result);
     }
     
     public function newsInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          
          // 시작일자, 종료일자 셋팅
          $resData['StartSDT'] = date('Y-m-d H:i');
          $resData['EndSDT'] = date("2034-12-31 23:59");

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/news/input.phtml', $resData);
     }

     public function postNewsInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $cdn = new cdn($this->container);
          $storageURL = $this->container->storage['url'];
          $commonUploadPath = '/' . getServerType() . '/news/';
          $uploadedFiles = $request->getUploadedFiles();
          $dbParams = [];
          $result = [];
          
          if (isset($uploadedFiles['filePath'])) {
               foreach ($uploadedFiles as $key => $value) {
                    if (!empty($value -> file)) {
                         $ext = explode(".", $value->getClientFilename());
                         $extReplace = str_replace(' ', '', $ext);
                         $image_ext[$key] = $ext[sizeof($ext)-1];

                         $current_timestamp = time();
                         $uploadFullPath = $commonUploadPath . $extReplace[0] . '_'  . $current_timestamp. '.' . $image_ext[$key];
                    }
                    
                    if ($cdn->uploadFile($value->file, $uploadFullPath)) {
                         $cdn->purge($uploadFullPath);
                    }
                    else {
                         die('BLOB UPLOAD FAILED - ' . $uploadFullPath);
                    }
               }

               $dbParams['Title'] = $reqData['title'];
               $dbParams['StartSDT'] = str_replace("T", " ", $reqData['startDatetime']) . ':00';
               $dbParams['EndSDT'] = str_replace("T", " ", $reqData['endDatetime']) . ':59';
               $dbParams['BannerURL'] = $storageURL . $uploadFullPath;
               $dbParams['NewsURL'] = $reqData['newsUrl'];
               $dbParams['IsAlwaysVisibled'] = (int)$reqData['isAlwaysVisibled'];
               $dbParams['IsVisibled'] = (int)$reqData['isVisibled'];

               $common = new common();
               $AccountDB = new AccountDB($this->container);
               $result = $AccountDB->USPT_Add_News($dbParams);
               
               // 서버에 뉴스 캐시 삭제
               $apiParams = [];
               $server = 'dashserver';
               $portType = 'in';
               $url = '/news/cache';
               $apiResult = $common->deleteApi($this->container, $server, $portType, $url, $apiParams);

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_DELETE, $server, $portType, $url, $apiParams, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }
          else {
               $result['Code'] = -99;
               die("News Banner Insert Failed.");
               echo '<script>alert("뉴스 등록에 실패하였습니다.");</script>';
          }

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          return $response->withRedirect("./list?page=" . $reqData['page']);
     }
     
     public function newsDetail($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          
          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['NewsID'] = (int)$reqData['newsID'];
          $result = $AccountDB->USPT_Get_News($dbParams);
          
          $resData['Code'] = $result['Code'];
          
          if ($result['Code'] = 1) {
               $resData['list'] = $result['Data']['List'][0];
               $resData['list']['original_path'] = $result['Data']['List'][0]['BannerURL'];
               $ext = explode(".", $result['Data']['List'][0]['BannerURL']);
               $image_ext = $ext[sizeof($ext)-1];
               $resData['list']['original_extension'] = $image_ext;
          }

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/news/detail.phtml', $resData);
     }

     public function postNewsUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          $cdn = new cdn($this->container);
          $storageURL = $this->container->storage['url'];
          $commonUploadPath = '/' . getServerType() . '/news/';
          $uploadedFiles = $request->getUploadedFiles();
          $nomalDbParams = [];
          $visibledDbParams = [];
          $nomalResult = [];
          $visibledResult = [];
          $apiResult = [];

          // 배너 이미지 변경되면 cdn에 업로드
          if ($reqData['fileChange'] == "true") {
               foreach ($uploadedFiles as $key => $value) {
                    if (!empty($value -> file)) {
                         $ext = explode(".", $value->getClientFilename());
                         $extReplace = str_replace(' ', '', $ext);
                         $image_ext[$key] = $ext[sizeof($ext)-1];
                         
                         $current_timestamp = time();
                         $uploadFullPath = $commonUploadPath . $extReplace[0] . '_'  . $current_timestamp. '.' . $image_ext[$key];
                         $bannerImagePath = $storageURL . $uploadFullPath;

                         if ($cdn->uploadFile($value->file, $uploadFullPath)) {
                              $cdn->purge($uploadFullPath);
                         }
                         else {
                              die('BLOB UPLOAD FAILED - ' . $uploadFullPath);
                         }
                    }
               }
          }
          // 변경 안되면 그냥 기존 cdn url로 입력
          else {
               $bannerImagePath = $reqData['bannerImageOrigin'];
          }
          
          $AccountDB = new AccountDB($this->container);

          // 뉴스 정보 수정
          $nomalDbParams['NewsID'] = (int)$reqData['newsID'];
          $nomalDbParams['Title'] = $reqData['title'];
          $nomalDbParams['StartSDT'] = str_replace("T", " ", $reqData['startDatetime']) . ':00';
          $nomalDbParams['EndSDT'] = str_replace("T", " ", $reqData['endDatetime']) . ':59';
          $nomalDbParams['BannerURL'] = $bannerImagePath;
          $nomalDbParams['NewsURL'] = $reqData['newsUrl'];
          $nomalDbParams['IsAlwaysVisibled'] = (int)$reqData['isAlwaysVisibled'];
          $nomalResult = $AccountDB->USPT_Mod_News($nomalDbParams);

          // USER ACTION 로그 생성 - 뉴스 정보 수정
          $nomalLog = array();
          $nomalLog = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $nomalDbParams, $nomalResult, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $nomalLog);

          // 뉴스 활성화 여부 수정
          $visibledDbParams['NewsID'] = (int)$reqData['newsID'];
          $visibledDbParams['IsVisibled'] = (int)$reqData['isVisibled'];
          $visibledResult = $AccountDB->USPT_Mod_News_IsVisibled($visibledDbParams);

          // USER ACTION 로그 생성 - 뉴스 활성화 여부 수정
          $visibledLog = array();
          $visibledLog = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $visibledDbParams, $visibledResult, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $visibledLog);

          // 서버에 뉴스 캐시 삭제
          $apiParams = [];
          $server = 'dashserver';
          $portType = 'in';
          $url = '/news/cache';
          $apiResult = $common->deleteApi($this->container, $server, $portType, $url, $apiParams);

          // USER ACTION 로그 생성 - API 호출
          $apiLog = array();
          $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_DELETE, $server, $portType, $url, $apiParams, $apiResult, $apiResult['return']);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);

          // 뉴스 정보 수정, 뉴스 활성화 여부 수정, API 다 성공 했을때
          if ($nomalResult['Code'] == 1 && $visibledResult['Code'] == 1 && $apiResult['return'] == 0) {
               echo '<script>alert("수정이 완료되었습니다.");location.href="./detail?newsID=' . $reqData['newsID'] . '&page=' . $reqData['page']  . '";</script>';
          }
          else {
               echo '<script>alert("수정을 실패했습니다. (Code1: '.$nomalResult['Code'].', Code2:' .$visibledResult['Code'].', Code3:' .$apiResult['return'].')");location.href="./detail?newsID=' . $reqData['newsID'] . '&page=' . $reqData['page']  . '";</script>';
          }

          // return $response->withRedirect("./detail?newsID=" . $reqData['newsID'] . "&page=" . $reqData['page']);
     }

     public function postNewsVisible($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container);
          
          if ($reqData['NewsIDS']) {
               foreach ($reqData['NewsIDS'] as $key => $value) {
                    $dbParams['NewsID'] = (int)$value;
                    $dbParams['IsVisibled'] = (int)$reqData['IsVisibled'];
                    $result = $AccountDB->USPT_Mod_News_IsVisibled($dbParams);
                    
                    // USER ACTION 로그 생성
                    $log = array();
                    $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
                    
                    // 서버에 뉴스 캐시 삭제
                    $apiParams = [];
                    $server = 'dashserver';
                    $portType = 'in';
                    $url = '/news/cache';
                    $apiResult = $common->deleteApi($this->container, $server, $portType, $url, $apiParams);

                    // USER ACTION 로그 생성 - API 호출
                    $log = array();
                    $log = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_DELETE, $server, $portType, $url, $apiParams, $apiResult, $apiResult['return']);
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
               }
          }

          return $response->withJson($result);
     }

     public function postNewsTransfer($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/news/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $params = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $targetServer = $reqData['TargetServer'];
          $newsIds = $reqData['NewsIDS'];
          
          foreach ($newsIds as $value) {
               $dbParams['NewsID'] = (int)$value;
               $newsInfo = $AccountDB->USPT_Get_News($dbParams);
               $params[] = $newsInfo['Data']['List'][0];
          }
          
          // $json = json_encode($params);
          $port = $_SERVER["SERVER_PORT"];
          $targetServer = enum::LINK_TYPE_BY_SERVER[$targetServer] . ':' . $port;
          $url = $targetServer . '/management/platform/news/recieve';
          
          $result = $common->httpcall('post', $url, $params);

          return $response->withJson($result);
     }
     
     public function postNewsRecieve($request, $response, $args) {
          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $cdn = new cdn($this->container);
          $storageURL = $this->container->storage['url'];
          $commonUploadPath = '/' . getServerType() . '/news/';
          $uploadedFiles = $request->getUploadedFiles();
          $dbParams = [];
          $dbResult = [];
          $cdnResult = [];
          $AccountDB = new AccountDB($this->container);

          foreach ($reqData as $value) {
               // 배너 이미지 CDN 등록
               $filename = basename($value['BannerURL']);   // CDN 이미지 파일명 분리
               $fileInfo = pathinfo($filename);  // 파일명에서 제목과 확장자를 분리
               $title = $fileInfo['filename']; // 확장자를 제외한 파일명
               $extension = $fileInfo['extension']; // 확장자
               $current_timestamp = time();  // 현재 시간 타임스탬프
               
               // 파일명에서 타임스탬프 값 변경
               $underbar = strrpos($title, '_');
               if ($underbar !== false) {
                    // 기존의 타임스탬프 대신 현재 타임스탬프로 변경
                    $title = substr($title, 0, $underbar) . '_' . $current_timestamp;
               }

               $uploadFullPath = $commonUploadPath . $title . '.' . $extension;

               if ($cdn->uploadFile($value['BannerURL'], $uploadFullPath)) {
                    $cdn->purge($uploadFullPath);
               }
               else {
                    die('BLOB UPLOAD FAILED - ' . $uploadFullPath);
               }

               // 뉴스 게시글 등록
               $dbParams['NewsID'] = (int)$value['NewsID'];
               $dbParams['Title'] = $value['Title'];
               $dbParams['StartSDT'] = $value['StartSDT'];
               $dbParams['EndSDT'] = $value['EndSDT'];
               $dbParams['BannerURL'] = $storageURL . $uploadFullPath;
               $dbParams['NewsURL'] = $value['NewsURL'];
               $dbParams['IsVisibled'] = (int)$value['IsVisibled'];
               $dbParams['IsAlwaysVisibled'] = (int)$value['IsAlwaysVisibled'];
               $dbResult = $AccountDB->USPT_Add_News($dbParams);

               if ($dbResult['Code'] != 1) {
                    die("Nes Data Insert Failed");
               }

               // USER ACTION 로그 생성 - 뉴스 게시글 등록
               $log = array();
               $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $dbResult, enum::COMMON_SUCCESS);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
               
               // 서버에 뉴스 캐시 삭제
               $apiParams = [];
               $server = 'dashserver';
               $portType = 'in';
               $url = '/news/cache';
               $apiResult = $common->deleteApi($this->container, $server, $portType, $url, $apiParams);

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_DELETE, $server, $portType, $url, $apiParams, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }

          $result['return'] = 1;
          
          return $response->withJson($result);
     }


     // ==================================================
     //    업적 관리
     // ==================================================
     public function achievementsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $resData['seasonID'] = 0;
          if (isset($reqData['seasonID'])) {
               $resData['seasonID'] = $reqData['seasonID'];
          }

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          // 시즌 정보 가져오기
          $seasonResult = $this->getSeasons();
          $resData['season'] = $seasonResult;
          
          // 메타
          // 미션 리스트
          $resData['mission'] = $this->getMeta()['mission'];

          // 조건 종류 리스트
          $resData['condition'] = $this->getMeta()['condition'];

          // 조건 리스트
          $resData['coin'] = $this->getMeta()['coin'];
          $resData['baseCoin'] = $this->getMeta()['baseCoin'];
          
          // 보상 리스트
          $resData['reward'] = $this->getMeta()['reward'];

          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/achievements/list.phtml', $resData);
     }
     
     // 시즌 리스트     
     public function postSeasonsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // 시즌 정보 가져오기
          $seasonResult = $this->getSeasons();
          $result = $seasonResult;

          return $response->withJson($result);
     }

     // 업적 리스트
     public function postAchievementsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];

          $AccountDB = new AccountDB($this->container, true);
          $data = $AccountDB->USPT_GetList_Achievements($dbParams);
          
          // 메타
          // 미션 리스트
          $result['mission'] = $this->getMeta()['mission'];

          // 조건 종류 리스트
          $result['condition'] = $this->getMeta()['condition'];

          // 조건 리스트
          $result['coin'] = $this->getMeta()['coin'];
          $result['baseCoin'] = $this->getMeta()['baseCoin'];
          
          // 보상 리스트
          $result['reward'] = $this->getMeta()['reward'];

          // 업적 리스트
          if ($data['Code'] == 1) {
               // 미션 리스트
               $missionResult = $this->getMissions();
               $missionMeta = [];
               if ($missionResult['Code'] == 1) {
                    foreach ($missionResult['Data']['List'] as $missionValue) {
                         $missionMeta[(int)$missionValue['MissionID']] = $missionValue['MissionName'];
                    }
               }

               // 조건 종류 리스트
               $conditionResult = $this->getConditions();
               $conditionMeta = [];
               if ($conditionResult['Code'] == 1) {
                    foreach ($conditionResult['Data']['List'] as $conditionValue) {
                         $conditionMeta[(int)$conditionValue['ConditionType']] = $conditionValue['ConditionName'];
                    }
               }

               // 조건 리스트 - ConditionType에 따라 CoinID or BaseCoinID로 값 가져와야 함 (조건 종류 추가되면.... 추가해줘야함)
               // ConditionType이 1(CoinID)일때
               // 대시보드서버 메타데이터
               // $dashMetaArray = $common->getDashMeta($this->container);
               // $coinMeta = [];
               // if (count($dashMetaArray) > 0 && isset($dashMetaArray['coins'])) {
               //      foreach ($dashMetaArray['coins'] as $coinValue) {
               //           $coinMeta[$coinValue['coin_id']] = $coinValue;
               //      }
               // }
               $coinMeta = $this->getMeta()['coin'];
               // ConditionType이 2(BaseCoinID)일때
               // $baseCoinMeta = [];
               // if (count($dashMetaArray) > 0 && isset($dashMetaArray['base_coins'])) {
               //      foreach ($dashMetaArray['base_coins'] as $basecoinValue) {
               //           $baseCoinMeta[$basecoinValue['base_coin_id']] = $basecoinValue;
               //      }
               // }
               $baseCoinMeta = $this->getMeta()['baseCoin'];


               foreach ($data['Data']['List'] as $key => $value) {
                    // 미션 내용
                    if (count($missionMeta) > 0) {
                         $data['Data']['List'][$key]['MissionName'] = $missionMeta[(int)$value['MissionID']];
                    }

                    // 조건 이름
                    if (count($conditionMeta) > 0) {
                         if (isset($conditionMeta[(int)$value['ConditionType']])) {
                              $data['Data']['List'][$key]['ConditionTypeName'] = $conditionMeta[(int)$value['ConditionType']];
                         }
                         else {
                              $data['Data']['List'][$key]['ConditionTypeName'] = '';
                         }
                    }

                    // 조건
                    if ((int)$value['ConditionType'] == 1) {
                         // CoinID
                         if (count($coinMeta) > 0) {
                              if (isset($coinMeta[(int)$value['ConditionID']])) {
                                   $data['Data']['List'][$key]['ConditionName'] = $coinMeta[(int)$value['ConditionID']]['CoinName'];
                              }
                              else {
                                   $data['Data']['List'][$key]['ConditionName'] = '';
                              }
                         }
                    }
                    else if ((int)$value['ConditionType'] == 2) {
                         // BaseCoinID
                         if (count($baseCoinMeta) > 0) {
                              if (isset($baseCoinMeta[(int)$value['ConditionID']])) {
                                   $data['Data']['List'][$key]['ConditionName'] = $baseCoinMeta[(int)$value['ConditionID']]['BaseCoinName'];
                              }
                              else {
                                   $data['Data']['List'][$key]['ConditionName'] = '';
                              }
                         }
                    }
                    else {
                         $data['Data']['List'][$key]['ConditionName'] = '';
                    }
               }

               $result['List'] = $data['Data']['List'];
          }
          $result['Code'] = $data['Code'];

          return $response->withJson($result);
     }

     // 업적 상세 데이터
     public function postAchievements($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['AchievementID'] = (int)$reqData['AchievementID'];

          $AccountDB = new AccountDB($this->container, true);
          $data = $AccountDB->USPT_Get_Achievements($dbParams);
          
          // 메타
          // 미션 리스트
          $result['mission'] = $this->getMeta()['mission'];

          // 조건 종류 리스트
          $result['condition'] = $this->getMeta()['condition'];

          // 조건 리스트
          $result['coin'] = $this->getMeta()['coin'];
          $result['baseCoin'] = $this->getMeta()['baseCoin'];

          // 보상 리스트
          $result['reward'] = $this->getMeta()['reward'];

          // 업적
          if ($data['Code'] == 1) {
               // 미션 리스트
               $missionResult = $this->getMissions();
               $missionMeta = [];
               if ($missionResult['Code'] == 1) {
                    foreach ($missionResult['Data']['List'] as $missionValue) {
                         $missionMeta[(int)$missionValue['MissionID']] = $missionValue['MissionName'];
                    }
               }

               // 조건 종류 리스트
               $conditionResult = $this->getConditions();
               $conditionMeta = [];
               if ($conditionResult['Code'] == 1) {
                    foreach ($conditionResult['Data']['List'] as $conditionValue) {
                         $conditionMeta[(int)$conditionValue['ConditionType']] = $conditionValue['ConditionName'];
                    }
               }

               // 조건 리스트 - ConditionType에 따라 CoinID or BaseCoinID로 값 가져와야 함 (조건 종류 추가되면.... 추가해줘야함)
               // ConditionType이 1(CoinID)일때
               // 대시보드서버 메타데이터
               // $dashMetaArray = $common->getDashMeta($this->container);
               // $coinMeta = [];
               // if (count($dashMetaArray) > 0 && isset($dashMetaArray['coins'])) {
               //      foreach ($dashMetaArray['coins'] as $coinValue) {
               //           $coinMeta[$coinValue['coin_id']] = $coinValue;
               //      }
               // }
               $coinMeta = $this->getMeta()['coin'];
               // ConditionType이 2(BaseCoinID)일때
               // $baseCoinMeta = [];
               // if (count($dashMetaArray) > 0 && isset($dashMetaArray['base_coins'])) {
               //      foreach ($dashMetaArray['base_coins'] as $basecoinValue) {
               //           $baseCoinMeta[$basecoinValue['base_coin_id']] = $basecoinValue;
               //      }
               // }
               $baseCoinMeta = $this->getMeta()['baseCoin'];

               // 등록된 보상 리스트
               $AccountDB = new AccountDB($this->container, true);
               $rewardData = $AccountDB->USPT_GetList_AchievementRewards($dbParams);
               
               foreach ($data['Data'] as $key => $value) {
                    // 미션 내용
                    if (count($missionMeta) > 0) {
                         $data['Data'][$key]['MissionName'] = $missionMeta[(int)$value['MissionID']];
                    }

                    // 조건 이름
                    if (count($conditionMeta) > 0) {
                         if (isset($conditionMeta[(int)$value['ConditionType']])) {
                              $data['Data'][$key]['ConditionTypeName'] = $conditionMeta[(int)$value['ConditionType']];
                         }
                         else {
                              $data['Data'][$key]['ConditionTypeName'] = '';
                         }
                    }

                    // 조건
                    if ((int)$value['ConditionType'] == 1) {
                         // CoinID
                         if (count($coinMeta) > 0) {
                              if (isset($coinMeta[(int)$value['ConditionID']])) {
                                   $data['Data'][$key]['ConditionName'] = $coinMeta[(int)$value['ConditionID']];
                              }
                              else {
                                   $data['Data'][$key]['ConditionName'] = '';
                              }
                         }
                    }
                    else if ((int)$value['ConditionType'] == 2) {
                         // BaseCoinID
                         if (count($baseCoinMeta) > 0) {
                              if (isset($baseCoinMeta[(int)$value['ConditionID']])) {
                                   $data['Data'][$key]['ConditionName'] = $baseCoinMeta[(int)$value['ConditionID']];
                              }
                              else {
                                   $data['Data'][$key]['ConditionName'] = '';
                              }
                         }
                    }
                    else {
                         $data['Data'][$key]['ConditionName'] = '';
                    }

                    // 보상 리스트
                    $finalRewardList = [];
                    if(isset($rewardData)) {
                         if ($rewardData['Code'] == 1 && $rewardData['Data']['List']) {
                              foreach ($rewardData['Data']['List'] as $rewardKey => $rewardValue) {
                                   $strRewardValue = explode('.', $rewardValue['RewardValue']);
                                   $rewardValueCleaned = ($strRewardValue[0] === '') ? '0.' . $strRewardValue[1] : $rewardValue['RewardValue'];

                                   // 보상 기본값 준비
                                   $baseReward = [
                                        'RewardType' => (int)$rewardValue['RewardType'],
                                        'RewardID' => (int)$rewardValue['RewardID'],
                                        'RewardValue' => $rewardValueCleaned,
                                        'StakeCoinID' => (int)$rewardValue['StakeCoinID']
                                   ];

                                   // 스테이킹 보상 조회
                                   $dbParams['RewardType'] = $baseReward['RewardType'];
                                   $dbParams['RewardID'] = $baseReward['RewardID'];
                                   $rewardStakeData = $AccountDB->USPT_GetList_AchievementStakeRewards($dbParams);

                                   if (isset($rewardStakeData) && $rewardStakeData['Code'] == 1 && $rewardStakeData['Data']['List']) {
                                        foreach ($rewardStakeData['Data']['List'] as $stakeValue) {
                                             $stakeQuantity = explode('.', $stakeValue['StakeQuantity']);
                                             $stakeRewardQuantity = explode('.', $stakeValue['StakeRewardQuantity']);

                                             $finalRewardList[] = [
                                                  'RewardType' => $baseReward['RewardType'],
                                                  'RewardID' => $baseReward['RewardID'],
                                                  'RewardValue' => $baseReward['RewardValue'],
                                                  'StakeCoinID' =>  $baseReward['StakeCoinID'],
                                                  'StakeQuantity' => ($stakeQuantity[0] === '') ? '0.' . $stakeQuantity[1] : $stakeValue['StakeQuantity'],
                                                  'StakeRewardQuantity' => ($stakeRewardQuantity[0] === '') ? '0.' . $stakeRewardQuantity[1] : $stakeValue['StakeRewardQuantity'],
                                                  'IsDeleted' => (int)$stakeValue['IsDeleted']
                                             ];
                                        }
                                   } else {
                                        // 스테이킹 보상이 없는 경우, 보상만 넣기
                                        $finalRewardList[] = [
                                             'RewardType' => $baseReward['RewardType'],
                                             'RewardID' => $baseReward['RewardID'],
                                             'RewardValue' => $baseReward['RewardValue'],
                                             'StakeCoinID' =>  $baseReward['StakeCoinID'],
                                             'StakeQuantity' => '',
                                             'StakeRewardQuantity' => '',
                                             'IsDeleted' => ''
                                        ];
                                   }
                              }
                         }
                         $data['Data'][$key]['Reward'] = $finalRewardList;
                    }
               }

               $result['List'] = $data['Data'];
          }
          $result['Code'] = $data['Code'];

          return $response->withJson($result);
     }
     
     // 업적 시즌 등록
     public function postSeasonInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SeasonName'] = $reqData['SeasonName'];
          $dbParams['StartSDT'] = $reqData['StartSDT'];
          $dbParams['EndSDT'] = $reqData['EndSDT'];
          
          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Add_Seasons($dbParams);
          
          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }
     
     // 업적 시즌 수정
     public function postSeasonUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['SeasonName'] = $reqData['SeasonName'];
          $dbParams['StartSDT'] = $reqData['StartSDT'];
          $dbParams['EndSDT'] = $reqData['EndSDT'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_Seasons($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }
     
     // 업적 등록 get
     public function achievementInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // 리스트 페이지에서 선택한 SeasonID
          $resData['seasonID'] = $reqData['seasonID'];

          // 시즌 리스트
          $seasonResult = $this->getSeasons();
          $seasonMeta = [];
          if ($seasonResult['Code'] == 1) {
               foreach ($seasonResult['Data']['List'] as $seasonValue) {
                    $seasonMeta[(int)$seasonValue['SeasonID']] = $seasonValue['SeasonName'];
               }
          }
          $resData['season'] = $seasonMeta;

          // 미션 리스트
          $resData['mission'] = $this->getMeta()['mission'];

          // 조건 종류 리스트
          $resData['condition'] = $this->getMeta()['condition'];

          // 조건 리스트
          $resData['coin'] = $this->getMeta()['coin'];
          $resData['baseCoin'] = $this->getMeta()['baseCoin'];

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/achievements/input.phtml', $resData);
     }

     // 업적 등록 post
     public function postAchievementInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['MissionDesc'] = $reqData['MissionDesc'];
          $dbParams['MissionID'] = (int)$reqData['MissionID'];
          $dbParams['ConditionType'] = (int)$reqData['ConditionType'];
          $dbParams['ConditionID'] = (int)$reqData['ConditionID'];
          $dbParams['ClaimValue'] = (int)$reqData['ClaimValue'];
          $dbParams['RetentionPeriod'] = (int)$reqData['RetentionPeriod'];
          $dbParams['ClaimLimit'] = (int)$reqData['ClaimLimit'];
          $dbParams['InitPeriod'] = (int)$reqData['InitPeriod'];
          $dbParams['Memo'] = $reqData['Memo'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Add_Achievements($dbParams);
          
          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          return $response->withJson($result);
     }

     // 업적 수정 get
     public function achievementUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // 리스트 페이지에서 선택한 SeasonID
          $resData['seasonID'] = $reqData['seasonID'];

          // 시즌 리스트
          $seasonResult = $this->getSeasons();
          $seasonMeta = [];
          if ($seasonResult['Code'] == 1) {
               foreach ($seasonResult['Data']['List'] as $seasonValue) {
                    $seasonMeta[(int)$seasonValue['SeasonID']] = $seasonValue['SeasonName'];
               }
          }
          $resData['season'] = $seasonMeta;

          // 미션 리스트
          $missionResult = $this->getMissions();
          $missionMeta = [];
          if ($missionResult['Code'] == 1) {
               foreach ($missionResult['Data']['List'] as $missionValue) {
                    $missionMeta[(int)$missionValue['MissionID']] = $missionValue['MissionName'];
               }
          }
          $resData['mission'] = $missionMeta;

          // 조건 종류 리스트
          $conditionResult = $this->getConditions();
          $conditionMeta = [];
          if ($conditionResult['Code'] == 1) {
               foreach ($conditionResult['Data']['List'] as $conditionValue) {
                    $conditionMeta[(int)$conditionValue['ConditionType']] = $conditionValue['ConditionName'];
               }
          }
          $resData['condition'] = $conditionMeta;

          // 조건 리스트
          // $dashMetaArray = $common->getDashMeta($this->container);
          // $coinMeta = [];
          // if (count($dashMetaArray) > 0 && isset($dashMetaArray['coins'])) {
          //      foreach ($dashMetaArray['coins'] as $coinValue) {
          //           $coinMeta[$coinValue['coin_id']] = $coinValue;
          //      }
          // }
          // $resData['coin'] = $coinMeta;
          $resData['coin'] = $common->getCoinsName($this->container);
          
          // $baseCoinMeta = [];
          // if (count($dashMetaArray) > 0 && isset($dashMetaArray['base_coins'])) {
          //      foreach ($dashMetaArray['base_coins'] as $basecoinValue) {
          //           $baseCoinMeta[$basecoinValue['base_coin_id']] = $basecoinValue;
          //      }
          // }
          // $resData['baseCoin'] = $baseCoinMeta;
          $resData['baseCoin'] = $common->getBaseCoinInfo($this->container);

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/achievements/input.phtml', $resData);
     }
     
     // 업적 수정 post
     public function postAchievementUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          // 업적 상세 내용 수정
          $dbParams = [];
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['AchievementID'] = (int)$reqData['AchievementID'];
          $dbParams['MissionDesc'] = $reqData['MissionDesc'];
          $dbParams['MissionID'] = (int)$reqData['MissionID'];
          $dbParams['ConditionType'] = (int)$reqData['ConditionType'];
          $dbParams['ConditionID'] = (int)$reqData['ConditionID'];
          $dbParams['ClaimValue'] = (int)$reqData['ClaimValue'];
          $dbParams['RetentionPeriod'] = (int)$reqData['RetentionPeriod'];
          $dbParams['ClaimLimit'] = (int)$reqData['ClaimLimit'];
          $dbParams['InitPeriod'] = (int)$reqData['InitPeriod'];
          $dbParams['Memo'] = $reqData['Memo'];

          $log = array();
          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_Achievements($dbParams);

          // 업적 보상 데이터 등록 및 수정
          $rewards = $reqData['Rewards'];
          $isSuccessRewards = true;
          $isSuccessStakeRewards = true;

          if (isset($rewards)) {
               foreach ($rewards as $key => $value) {
                    $rewardLog = array();
                    $rewardResult = [];
                    $dbRewardParams = [];
                    $dbRewardParams['SeasonID'] = (int)$reqData['SeasonID'];
                    $dbRewardParams['AchievementID'] = (int)$reqData['AchievementID'];
                    $dbRewardParams['RewardType'] = (int)$value['RewardType'];
                    $dbRewardParams['RewardID'] = (int)$value['RewardID'];
                    $dbRewardParams['RewardValue'] = (int)$value['RewardValue'];
                    $dbRewardParams['StakeCoinID'] = (int)$value['StakeCoinID'];

                    if ($value['RewardStatus'] == 'insert') {
                         // 보상 정보 등록
                         $rewardResult = $AccountDB->USPT_Add_AchievementRewards($dbRewardParams);
                         // USER ACTION 로그 생성 - 보상 정보 등록
                         $rewardLog = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbRewardParams, $rewardResult, enum::COMMON_SUCCESS);
                    }
                    else if ($value['RewardStatus'] == 'update') {
                         // 보상 정보
                         $rewardResult = $AccountDB->USPT_Mod_AchievementRewards($dbRewardParams);
                         // USER ACTION 로그 생성 - 보상 정보 수정
                         $rewardLog = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbRewardParams, $rewardResult, enum::COMMON_SUCCESS);
                    }
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $rewardLog);

                    if ($rewardResult['Code'] != 1) {
                         $isSuccessRewards = false;
                    }
               }
          }

          // 업적 스테이킹 보상 데이터 등록 및 수정
          $stakeRewards = $reqData['StakeRewards'];
          $isSuccessStakeRewards = true;
          // 보상 데이터 등록 및 수정이 성공했을때
          if (isset($stakeRewards) && $isSuccessRewards) {
               foreach ($stakeRewards as $key => $value) {
                    $rewardStakeLog = array();
                    $rewardStakeResult = [];
                    $dbRewardStakeParams = [];
                    $dbRewardStakeParams['SeasonID'] = (int)$reqData['SeasonID'];
                    $dbRewardStakeParams['AchievementID'] = (int)$reqData['AchievementID'];
                    $dbRewardStakeParams['RewardType'] = (int)$value['RewardType'];
                    $dbRewardStakeParams['RewardID'] = (int)$value['RewardID'];
                    $dbRewardStakeParams['StakeQuantity'] = $value['StakeQuantity'];
                    $dbRewardStakeParams['StakeRewardQuantity'] = $value['StakeRewardQuantity'];

                    if ($value['RewardStatus'] == 'insert') {
                         // 보상 스테이킹 정보 등록
                         $rewardStakeResult = $AccountDB->USPT_Add_AchievementStakeRewards($dbRewardStakeParams);
                         // USER ACTION 로그 생성 - 보상 스테이킹 정보 등록
                         $rewardStakeLog = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbRewardStakeParams, $rewardStakeResult, enum::COMMON_SUCCESS);
                    }
                    else if ($value['RewardStatus'] == 'update') {
                         // 삭제 여부
                         $dbRewardStakeParams['IsDeleted'] = (int)$value['IsDeleted'];
                         // 보상 스테이킹 정보
                         $rewardStakeResult = $AccountDB->USPT_Mod_AchievementStakeRewards($dbRewardStakeParams);
                         // USER ACTION 로그 생성 - 보상 스테이킹 정보 수정
                         $rewardStakeLog = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbRewardStakeParams, $rewardStakeResult, enum::COMMON_SUCCESS);
                    }
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $rewardStakeLog);

                    if ($rewardStakeResult['Code'] != 1) {
                         $isSuccessStakeRewards = false;
                    }
               }
          }

          $result['Rewards'] = $isSuccessRewards;
          $result['StakeRewards'] = $isSuccessStakeRewards;

          // USER ACTION 로그 생성 - 업적 정보 수정
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }
     
     // 업적 활성여부 수정 put
     public function putEnableUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['AchievementID'] = (int)$reqData['AchievementID'];
          $dbParams['IsEnabled'] = $reqData['IsEnabled'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_Achievements_IsEnabled($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }
     
     // 시즌 활성여부 수정 put
     public function putSeasonEnableUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SeasonID'] = (int)$reqData['SeasonID'];
          $dbParams['IsEnabled'] = $reqData['IsEnabled'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_Seasons_IsEnabled($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }

     // 시즌 데이터 리스트
     public function getSeasons() {
          $result = array();
          
          $AccountDB = new AccountDB($this->container, true);
          $result = $AccountDB->USPT_Scan_Seasons();
          
          return $result;
     }

     // 미션 데이터 리스트
     public function getMissions() {
          $result = array();
          
          $AccountDB = new AccountDB($this->container, true);
          $result = $AccountDB->USPT_Scan_Missions();
          
          return $result;
     }
     
     // 조건 데이터 리스트
     public function getConditions() {
          $result = array();
          
          $AccountDB = new AccountDB($this->container, true);
          $result = $AccountDB->USPT_Scan_Conditions();
          
          return $result;
     }

     // 조건 확인 서버 데이터 리스트
     public function getConditionCheckers() {
          $result = array();
          
          $AccountDB = new AccountDB($this->container, true);
          $result = $AccountDB->USPT_Scan_ConditionCheckers();
          
          return $result;
     }

     // 보상 ID 데이터 리스트
     public function postRewardsList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/achievements/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          
          $metaArray = $common->getDashMeta($this->container);
          
          // point 리스트
          // $point = [];
          // if (count($metaArray) > 0 && isset($metaArray['points'])) {
          //      foreach ($metaArray['points'] as $pointValue) {
          //           $point[$pointValue['point_id']] = $pointValue['point_name'];
          //      }
          // }
          // $result['point'] = $point;
          $result['point'] = $common->getPointsInfo($this->container);

          // coin 리스트
          // $coin = [];
          // if (count($metaArray) > 0 && isset($metaArray['coins'])) {
          //      foreach ($metaArray['coins'] as $coinValue) {
          //           $coin[$coinValue['coin_id']] = $coinValue['coin_name'];
          //      }
          // }
          // $result['coin'] = $coin;
          $result['coin'] = $common->getCoinsName($this->container);

          // nftpack 리스트
          $nftPacks = $common->getNftPackList($this->container, 1, 10000000)['nft_pack_list'];
          $nftPack = [];
          foreach ($nftPacks as $nftPacksValue) {
               $nftPack[$nftPacksValue['pack_id']] = $nftPacksValue['pack_name'];
          }
          $result['nftPack'] = $nftPack;
          
          return $response->withJson($result);
     }

     // 보상 데이터 리스트
     public function getRewards() {
          $result = array();
          
          $AccountDB = new AccountDB($this->container, true);
          $result = $AccountDB->USPT_Scan_Rewards();
          
          return $result;
     }
     
     // 메타
     public function getMeta() {
          $result = array();

          // 미션 리스트
          $missionResult = $this->getMissions();
          $missionMeta = [];
          if ($missionResult['Code'] == 1) {
               foreach ($missionResult['Data']['List'] as $missionValue) {
                    $missionMeta[(int)$missionValue['MissionID']] = $missionValue['MissionName'];
               }
          }
          $result['mission'] = $missionMeta;

          // 조건 종류 리스트
          $conditionResult = $this->getConditions();
          $conditionMeta = [];
          if ($conditionResult['Code'] == 1) {
               foreach ($conditionResult['Data']['List'] as $conditionValue) {
                    $conditionMeta[(int)$conditionValue['ConditionType']] = $conditionValue['ConditionName'];
               }
          }
          $result['condition'] = $conditionMeta;

          // 조건 리스트
          $common = new common();
          // 대시보드서버 메타데이터
          // $dashMetaArray = $common->getDashMeta($this->container);
          // $coinMeta = [];
          // if (count($dashMetaArray) > 0 && isset($dashMetaArray['coins'])) {
          //      foreach ($dashMetaArray['coins'] as $coinValue) {
          //           $coinMeta[$coinValue['coin_id']] = $coinValue;
          //      }
          // }
          // $result['coin'] = $coinMeta;
          $result['coin'] = $common->getCoins($this->container);
          
          // $baseCoinMeta = [];
          // if (count($dashMetaArray) > 0 && isset($dashMetaArray['base_coins'])) {
          //      foreach ($dashMetaArray['base_coins'] as $basecoinValue) {
          //           $baseCoinMeta[$basecoinValue['base_coin_id']] = $basecoinValue;
          //      }
          // }
          // $result['baseCoin'] = $baseCoinMeta;
          $result['baseCoin'] = $common->getBaseCoins($this->container);
          
          
          // 조건 확인 서버 리스트
          $conditionCheckerResult = $this->getConditionCheckers();
          $conditionCheckerMeta = [];
          if ($conditionCheckerResult['Code'] == 1) {
               foreach ($conditionCheckerResult['Data']['List'] as $conditionCheckerValue) {
                    $conditionCheckerMeta[(int)$conditionCheckerValue['ConditionCheckerID']] = $conditionCheckerValue['ConditionCheckerName'];
               }
          }
          $result['conditionChecker'] = $conditionCheckerMeta;

          // 보상 리스트
          $rewardResult = $this->getRewards();
          $rewardMeta = [];
          if ($rewardResult['Code'] == 1) {
               foreach ($rewardResult['Data']['List'] as $rewardValue) {
                    $rewardMeta[(int)$rewardValue['RewardType']] = $rewardValue['RewardName'];
               }
          }
          $result['reward'] = $rewardMeta;

          return $result;
     }

     
     // ==================================================
     //    NFT 사전 판매 관리
     // ==================================================
     // 정보(이벤트) 리스트 get
     public function preSalesList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          $pageSize = isset($_COOKIE['pageSize']) ? $_COOKIE['pageSize'] : 10;
          $resData['pageSize'] = $pageSize;

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/list.phtml', $resData);
     }

     // 정보(이벤트) 리스트 post
     public function postPreSalesList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          // Application 목록
          $appList = $common->getApplicationsInfo($this->container);

          // Point 목록
          $pointList = $common->getPointsInfo($this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['SalesName'] = $reqData['SalesName'];
          $dbParams['ProgressStatus'] = (int)$reqData['ProgressStatus'];
          $dbParams['PageID'] = (int)$reqData['PageID'];
          $dbParams['PageSize'] = (int)$reqData['PageSize'];
          $result = $AccountDB->USPT_Srch_PreSales($dbParams);

          if ($result['Code'] == 1) {
               foreach ($result['Data']['List'] as $key => $value) {
                    $result['Data']['List'][$key]['IsEnabledStr'] = enum::IS_ENABLED[(int)$value['IsEnabled']];
                    $appID = (int)$value['ReferralRewardAppID'];
                    $result['Data']['List'][$key]['ReferralRewardAppName'] = isset($appList[$appID]) ? $appList[$appID] : '';
                    $pointID = (int)$value['ReferralRewardPointID'];
                    $result['Data']['List'][$key]['ReferralRewardPointName'] = isset($pointList[$pointID]) ? $pointList[$pointID] : '';
               }
          }
          
          return $response->withJson($result);
     }
     
     // 정보(이벤트) 등록 get
     public function preSalesInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }

          // 사전 판매 기간 셋팅
          $resData['OpenStartSDT'] = date('Y-m-d 00:00');
          $resData['OpenEndSDT'] = date("Y-m-d 00:00", strtotime('+7 days'));

          // 추천인 등록 기간 셋팅
          $resData['ReferralStartSDT'] = date('Y-m-d 00:00');
          $resData['ReferralEndSDT'] = date("Y-m-d 00:00", strtotime('+7 days'));
          
          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          // Application 목록
          $resData['appList'] = $common->getApplicationsInfo($this->container);

          // Point 목록
          $resData['pointList'] = $common->getPointsInfo($this->container);
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/input.phtml', $resData);
     }

     // 정보(이벤트) 등록 post
     public function postPreSalesInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SalesName'] = $reqData['SalesName'];
          $dbParams['IsEnabled'] = (int)$reqData['IsEnabled'];
          $dbParams['OpenStartSDT'] = $reqData['OpenStartSDT'];
          $dbParams['OpenEndSDT'] = $reqData['OpenEndSDT'];
          $dbParams['TotalExchangePointQuantity'] = (int)$reqData['TotalExchangePointQuantity'];
          $dbParams['ReferralStartSDT'] = $reqData['ReferralStartSDT'];
          $dbParams['ReferralEndSDT'] = $reqData['ReferralEndSDT'];
          $dbParams['ReferralLimitCount'] = (int)$reqData['ReferralLimitCount'];
          $dbParams['ReferralRewardAppID'] = (int)$reqData['ReferralRewardAppID'];
          $dbParams['ReferralRewardPointID'] = (int)$reqData['ReferralRewardPointID'];
          $dbParams['ReferrerPointQuantity'] = (int)$reqData['ReferrerPointQuantity'];
          $dbParams['RefereePointQuantity'] = (int)$reqData['RefereePointQuantity'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Add_PreSales($dbParams);
          
          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          // 마켓 서버 refresh api 호출
          if ($result['Code'] == 1) {
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;

               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }
          
          return $response->withJson($result);
     }
     
     // 정보(이벤트) 상세 get
     public function preSalesDetail($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $resData['page'] = 1;
          if (isset($reqData['page'])) {
               $resData['page'] = $reqData['page'];
          }
          $resData['salesID'] = $reqData['salesID'];
          
          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // Application 목록
          $resData['appList'] = $common->getApplicationsInfo($this->container);

          // Point 목록
          $resData['pointList'] = $common->getPointsInfo($this->container);

          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['SalesID'] = (int)$reqData['salesID'];
          $result = $AccountDB->USPT_Get_PreSales($dbParams);
          
          $resData['list'] = array();
          if ($result['Code'] == 1) {
               $resData['list'] = $result['Data']['List'][0];
          }
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/detail.phtml', $resData);
     }
     
     // 정보(이벤트) 수정 post
     public function postPreSalesUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          $dbParams = [];
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $dbParams['SalesName'] = $reqData['SalesName'];
          $dbParams['IsEnabled'] = (int)$reqData['IsEnabled'];
          $dbParams['OpenStartSDT'] = $reqData['OpenStartSDT'];
          $dbParams['OpenEndSDT'] = $reqData['OpenEndSDT'];
          $dbParams['TotalExchangePointQuantity'] = (int)$reqData['TotalExchangePointQuantity'];
          $dbParams['ReferralStartSDT'] = $reqData['ReferralStartSDT'];
          $dbParams['ReferralEndSDT'] = $reqData['ReferralEndSDT'];
          $dbParams['ReferralLimitCount'] = (int)$reqData['ReferralLimitCount'];
          $dbParams['ReferralRewardAppID'] = (int)$reqData['ReferralRewardAppID'];
          $dbParams['ReferralRewardPointID'] = (int)$reqData['ReferralRewardPointID'];
          $dbParams['ReferrerPointQuantity'] = (int)$reqData['ReferrerPointQuantity'];
          $dbParams['RefereePointQuantity'] = (int)$reqData['RefereePointQuantity'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_PreSales($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);

          // 마켓 서버 refresh api 호출
          if ($result['Code'] == 1) {
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;

               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }
          
          return $response->withJson($result);    
     }
     
     // 상품(Claim) 리스트 get
     public function preSalesClaimList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $resData['salesID'] = '';
          if (isset($reqData['salesID']) && (int)$reqData['salesID'] > 0) {
               $resData['salesID'] = $reqData['salesID'];
          }
          
          // SalesID, SalesName
          $resData['list'] = $this->getPreSalesInfo();

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/claimList.phtml', $resData);
     }

     // 상품(Claim) 리스트 post
     public function postPreSalesClaimList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $result = $AccountDB->USPT_GetList_PreSalesClaims($dbParams);

          // 보상 메타
          $reward = $this->getRewardForNFTPreSales();

          if ($result['Code'] == 1) {
               foreach ($result['Data']['List'] as $key => $value) {
                    $result['Data']['List'][$key]['DisplayAreaStr'] = enum::PRESALES_CLAIM_DISPLAYAREA[(int)$value['DisplayArea']];
                    $result['Data']['List'][$key]['IsEnabledStr'] = enum::IS_ENABLED[(int)$value['IsEnabled']];
                    $result['Data']['List'][$key]['RewardTypeStr'] = $reward[(int)$value['RewardType']];
               }
          }

          return $response->withJson($result);
     }
     
     // 상품(Claim) 등록 get
     public function preSalesClaimInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // 리스트에서 선택된 SalesID 값
          if (isset($reqData['salesID']) && (int)$reqData['salesID'] > 0) {
               $resData['salesID'] = $reqData['salesID'];
          }
          else {
               echo '<script>location.href="./claimList";</script>';
          }
          
          // SalesID, SalesName
          $resData['salesInfo'] = $this->getPreSalesInfo();

          // 구매 기간 셋팅
          $resData['ClaimStartSDT'] = date('Y-m-d 00:00');
          $resData['ClaimEndSDT'] = date("Y-m-d 00:00", strtotime('+7 days'));

          // 보상
          $resData['reward'] = $this->getRewardForNFTPreSales();

          // NFTPackID
          $nftPacks = $this->getNftPack();
          $resData['nftPacks'] = array();
          $resData['nftPacks'] = $nftPacks;

          // DynamicNFT 제외
          // if (isset($nftPacks)) {
          //      foreach ($nftPacks as $key => $value) {
          //           if (!$value['is_dynamic']) {
          //                $resData['nftPacks'][] = $value;
          //           }
          //      }
          // }

          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/claimInput.phtml', $resData);
     }

     // 상품(Claim) 등록 post
     public function postPreSalesClaimInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          // CDN - 이미지 업로드
          $uploadedFiles = $request->getUploadedFiles();
          $cdn = new cdn($this->container);
          // $storageURL = $this->container->storage['url'];
          $commonUploadPath = '/' . getServerType() . '/presales/' . (int)$reqData['SalesID'] . '/';
          if ($uploadedFiles) {
               foreach ($uploadedFiles as $key => $value) {
                    if (!empty($value->file)) {
                         $ext = explode(".", $value->getClientFilename());
                         $image_ext[$key] = $ext[sizeof($ext)-1];
                         
                         $uploadFullPath = $commonUploadPath . (int)$reqData['ClaimID'] . '.' . $image_ext[$key];
                    }
                    
                    // 업로드 성공
                    if ($cdn->uploadFile($value->file, $uploadFullPath)) {
                         $cdn->purge($uploadFullPath);
                         $result['ImageUpload'] = 1;
                    }
                    // 업로드 실패
                    else {
                         die('BLOB UPLOAD FAILED - ' . $uploadFullPath);
                         $result['ImageUpload'] = 0;
                    }
               }
          }

          // 이미지 업로드 성공하면 데이터 등록
          if ($result['ImageUpload'] == 1) {
               $storageURL = $this->container->storage['url'];
               $imageUrl = $storageURL . $uploadFullPath;
               $dbParams = [];
               $dbParams['SalesID'] = (int)$reqData['SalesID'];
               $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
               $dbParams['ClaimName'] = $reqData['ClaimName'];
               $dbParams['IsEnabled'] = (int)$reqData['IsEnabled'];
               $dbParams['ClaimStartSDT'] = $reqData['ClaimStartSDT'];
               $dbParams['ClaimEndSDT'] = $reqData['ClaimEndSDT'];
               $dbParams['DisplayArea'] = (int)$reqData['DisplayArea'];
               $dbParams['DisplaySortOrder'] = (int)$reqData['DisplaySortOrder'];
               $dbParams['ImageURL'] = $imageUrl;
               $dbParams['RewardImageID'] = (int)$reqData['RewardImageID'];
               $dbParams['RewardType'] = (int)$reqData['RewardType'];
               $dbParams['NFTPackID'] = (int)$reqData['NFTPackID'];
     
               $common = new common();
               $AccountDB = new AccountDB($this->container);
               $result = $AccountDB->USPT_Add_PreSalesClaims($dbParams);
     
               // Claim 데이터 등록 성공 && 보상 종류가 사전 판매 NFT 가챠일때 가차 데이터 등록
               if ($result['Code'] == 1 && (int)$reqData['RewardType'] == 11) {
                    $gachaInfo = json_decode($reqData['GachaInfo'], true);
                    $isGachaSuccess = false;
                    $isGachaSuccessCnt = 0;
                    $isGachaFail = false;
                    $isGachaFailCnt = 0;
                    $gachaInfoResult = array();
     
                    if (is_array($gachaInfo)) {
                         foreach ($gachaInfo as $key => $value) {
                              $gachaLog = array();
                              $gachaResult = [];
                              $dbGachaParams = [];
                              $dbGachaParams['SalesID'] = (int)$reqData['SalesID'];
                              $dbGachaParams['ClaimID'] = (int)$reqData['ClaimID'];
                              $dbGachaParams['NFTPackID'] = (int)$value['NFTPackID'];
                              // $dbGachaParams['PurchasePointQuantity'] = (int)$value['PurchasePointQuantity'];
                              $dbGachaParams['RangeSize'] = (int)$value['RangeSize'];
     
                              $gachaResult = $AccountDB->USPT_Add_PreSalesClaimGachas($dbGachaParams);
                                                       
                              // USER ACTION 로그 생성 - 랜덤 보상 정보 등록
                              $gachaLog = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbGachaParams, $gachaResult, enum::COMMON_SUCCESS);
                              $common->sendLog($this->container, $this->container->menu->getMenuKey(), $gachaLog);
                         }
     
                         if ($gachaResult['Code'] == 1) {
                              $gachaInfoResult['Code'] = 1;
                              $isGachaSuccess = true;
                              $isGachaSuccessCnt++;
                         }
                         else {
                              $gachaInfoResult['Code'] = $gachaResult['Code'];
                              $isGachaFail = true;
                              $isGachaFailCnt++;
                         }
                    }
                    $result['GachaInfo'] = $gachaInfoResult;
               }
          }
          
          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          // 마켓 서버 refresh api 호출 - CDN 이미지 등록 성공 && Claim 데이터 등록 성공
          if ($result['ImageUpload'] == 1 && $result['Code'] == 1) {
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;

               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }
          
          return $response->withJson($result);
     }
     
     // 상품(Claim) 상세 get
     public function preSalesClaimDetail($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getQueryParams();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);

          // 매개변수로 전달받은 SalesID, ClaimID
          $resData['salesID'] = (int)$reqData['salesID'];
          $resData['claimID'] = (int)$reqData['claimID'];

          // SalesID, SalesName 정보
          $resData['salesInfo'] = $this->getPreSalesInfo();

          // 보상 메타
          $resData['reward'] = $this->getRewardForNFTPreSales();

          // 상품 상세정보
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['SalesID'] = (int)$reqData['salesID'];
          $dbParams['ClaimID'] = (int)$reqData['claimID'];
          $result = $AccountDB->USPT_Get_PreSalesClaims($dbParams);
          $isEditable = false;
          
          $resData['list'] = array();
          if ($result['Code'] == 1) {
               $resData['list'] = $result['Data']['List'][0];

               // 구매 시작 일시가 현재보다 이후여야 수정 가능
               $claimStartSDT = $result['Data']['List'][0]['ClaimStartSDT'];
               // ClaimStartSDT를 UTC 기준 Unix Timestamp로 변환
               $claimStartTimestamp = strtotime($claimStartSDT);
               // 현재 UTC 시간의 Unix Timestamp 가져오기
               $currentUTCTimestamp = time();
               
               if ($claimStartTimestamp > $currentUTCTimestamp) {
                   $isEditable = true;
               }
          }
          $resData['isEditable'] = $isEditable;

          // NFTPackID
          $nftPacks = $this->getNftPack();
          $resData['nftPacks'] = array();
          $resData['nftPacks'] = $nftPacks;

          // DynamicNFT 제외
          // if (isset($nftPacks)) {
          //      foreach ($nftPacks as $key => $value) {
          //           if (!$value['is_dynamic']) {
          //                $resData['nftPacks'][] = $value;
          //           }
          //      }
          // }

          // 보상 정보
          $rewardResult = array();
          $rewardDbParams = [];
          $resData['rewardNfts'] = array();
          $rewardType = (int)$result['Data']['List'][0]['RewardType'];
          $resData['gachas'] = array();

          if ($rewardType == 3) {  // NFT
               $rewardDbParams['SalesID'] = (int)$reqData['salesID'];
               $rewardDbParams['ClaimID'] = (int)$reqData['claimID'];
               $rewardResult = $AccountDB->USPT_GetList_PreSalesClaimNFTs($rewardDbParams);
          }
          else if ($rewardType == 11) { // 사전 판매 NFT 가챠
               // 랜덤 보상 정보
               $gachaResult = array();
               $gachaDbParams = [];
               $gachaDbParams['SalesID'] = (int)$reqData['salesID'];
               $gachaDbParams['ClaimID'] = (int)$reqData['claimID'];
               $gachaResult = $AccountDB->USPT_GetList_PreSalesClaimGachas($gachaDbParams);
               $packList = $this->getNftPackIDName();
               if ($gachaResult['Code'] == 1) {
                    foreach ($gachaResult['Data']['List'] as $key => $value) {
                         $packName = $packList[(int)$value['NFTPackID']];
                         $gachaResult['Data']['List'][$key]['NFTPackName'] = $packName;
                         $gachaResult['Data']['List'][$key]['IsDeletedStr'] =   $value['IsDeleted'] == 0 ? '데이터 활성' : '데이터 삭제';
                    }
                    $resData['gachas'] = $gachaResult['Data']['List'];
                    
                    // 등록된 PreSalesClaimGachas 데이터가 있으면 랜덤 보상 NFT 정보 가져오기
                    // $rewardDbParams['SalesID'] = (int)$reqData['salesID'];
                    // $rewardDbParams['ClaimID'] = (int)$reqData['claimID'];
                    // $rewardDbParams['NFTPackID'] = (int)$reqData['NFTPackID'];
                    // $rewardResult = $AccountDB->USPT_GetList_PreSalesClaimGachaNFTs($rewardDbParams);
                    $rewardResult['Code'] = 0;
               }
          }

          if ($rewardResult && $rewardResult['Code'] == 1) {
               $resData['rewardNfts'] = $rewardResult['Data']['List'];
               
               foreach ($rewardResult['Data']['List'] as $key => $value) {
                    $resData['rewardNfts'][$key]['ClaimStatusStr'] = enum::PRESALES_CLAIM_STATUS[(int)$value['ClaimStatus']];
               }
          }

          // Coin
          $resData['coins'] = array();
          $coinResult = $AccountDB->USPT_Scan_Coins();
          if ($coinResult['Code'] == 1) {
               foreach ($coinResult['Data']['List'] as $coinKey => $coinValue) {
                    if ($coinValue['CoinSymbol'] == 'SSR' || $coinValue['CoinSymbol'] == 'SUI' || $coinValue['CoinSymbol'] == 'LWA') {
                         $resData['coins'][] = $coinResult['Data']['List'][$coinKey];
                    }
               }
          }

          $coinArr = array();
          foreach ($resData['coins'] as $coinArrValue) {
               $coinArr[(int)$coinArrValue['CoinID']] = $coinArrValue['CoinSymbol'];
          }

          // 가격 정보
          $resData['price'] = array();
          $priceResult = $AccountDB->USPT_GetList_PreSalesClaimPrice($dbParams);
          if ($result['Code'] == 1) {
               $resData['price'] = $priceResult['Data']['List'];

               foreach ($priceResult['Data']['List'] as $key => $value) {
                    $price = $value['Price'];
                    $resData['price'][$key]['PriceStr'] = $value['Price'];
                    $resData['price'][$key]['PriceComma'] = $common->getFloatCommaFormat($value['Price']);
                    $resData['price'][$key]['CoinStr'] = $coinArr[(int)$value['CoinID']] ?? 'Unknown';
                    
                    $discountRatio = explode('.', $value['DiscountRatio']);
                    if ($discountRatio[0] === '') {
                         $resData['price'][$key]['DiscountRatioStr'] = '0'. $value['DiscountRatio'];
                         $resData['price'][$key]['DiscountRatioComma'] = $common->getFloatCommaFormat('0'. $value['DiscountRatio']);
                    }
                    else {
                         $resData['price'][$key]['DiscountRatioStr'] = $value['DiscountRatio'];
                         $resData['price'][$key]['DiscountRatioComma'] = $common->getFloatCommaFormat($value['DiscountRatio']);
                    }
                    
                    $discountedPrice = explode('.', $value['DiscountedPrice']);
                    if ($discountedPrice[0] === '') {
                         $resData['price'][$key]['DiscountedPriceStr'] = '0'. $value['DiscountedPrice'];
                         $resData['price'][$key]['DiscountedPriceComma'] = $common->getFloatCommaFormat('0'. $value['DiscountedPrice']);
                    }
                    else {
                         $resData['price'][$key]['DiscountedPriceStr'] = $value['DiscountedPrice'];
                         $resData['price'][$key]['DiscountedPriceComma'] = $common->getFloatCommaFormat($value['DiscountedPrice']);
                    }
               }
          }
          
          //기본페이지 셋팅
          $this->container->renderer->setLayout("layout.phtml");
          return $this->container->renderer->render($response, 'management/platform/preSales/claimDetail.phtml', $resData);
     }
     
     // 상품(Claim) 수정 post
     public function postPreSalesClaimUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // PreSalesCliam 상세 정보
          $dbParamsDetail = [];
          $resultDetail = array();
          $AccountDBReadOnly = new AccountDB($this->container, true);
          $dbParamsDetail['SalesID'] = (int)$reqData['SalesID'];
          $dbParamsDetail['ClaimID'] = (int)$reqData['ClaimID'];
          $resultDetail = $AccountDBReadOnly->USPT_Get_PreSalesClaims($dbParamsDetail);

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          
          // 사전 판매 상품 수정 - 구매 시작 일시가 경과한 경우 수정 불가
          $isEditable = false;
          // 구매 시작 일시가 현재보다 이후여야 수정 가능
          $claimStartSDT = $resultDetail['Data']['List'][0]['ClaimStartSDT'];
          // ClaimStartSDT를 UTC 기준 Unix Timestamp로 변환
          $claimStartTimestamp = strtotime($claimStartSDT);
          // 현재 UTC 시간의 Unix Timestamp 가져오기
          $currentUTCTimestamp = time();
          
          if ($claimStartTimestamp > $currentUTCTimestamp) {
               $isEditable = true;
          }

          if ($isEditable) {
               $dbParams = [];
               $dbParams['SalesID'] = (int)$reqData['SalesID'];
               $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
               $dbParams['ClaimName'] = $reqData['ClaimName'];
               $dbParams['ClaimStartSDT'] = $reqData['ClaimStartSDT'];
               $dbParams['ClaimEndSDT'] = $reqData['ClaimEndSDT'];
               $dbParams['DisplayArea'] = (int)$reqData['DisplayArea'];
               $dbParams['DisplaySortOrder'] = (int)$reqData['DisplaySortOrder'];
               $dbParams['RewardImageID'] = (int)$reqData['RewardImageID'];
               $dbParams['RewardType'] = (int)$reqData['RewardType'];
               $dbParams['NFTPackID'] = (int)$reqData['NFTPackID'];
               $result = $AccountDB->USPT_Mod_PreSalesClaims($dbParams);
     
               if ($result['Code'] == 1) {
                    // 상품 수정 성공시 활성 여부 수정 (원래 등록된 값이랑 다를 경우에만 수정)
                    if ($reqData['IsEnabledChanged']) {
                         $isEnabledSuccess = false;
                         $enabledDbParams = [];
                         $enabledDbParams['SalesID'] = (int)$reqData['SalesID'];
                         $enabledDbParams['ClaimID'] = (int)$reqData['ClaimID'];
                         $enabledDbParams['IsEnabled'] = (int)$reqData['IsEnabled'];
                         $enabledResult = $AccountDB->USPT_Mod_PreSalesClaims_IsEnabled($enabledDbParams);
                         
                         // USER ACTION 로그 생성 - 활성 여부 수정
                         $visibledLog = array();
                         $visibledLog = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $enabledDbParams, $enabledResult, enum::COMMON_SUCCESS);
                         $common->sendLog($this->container, $this->container->menu->getMenuKey(), $visibledLog);
     
                         if ($enabledResult['Code'] == 1) {
                              $isEnabledSuccess = true;
                         }
                         $result['EnabledUpdate'] = $isEnabledSuccess;
                    }
                    
                    // USER ACTION 로그 생성 - 사전 판매 상품 수정
                    $log = array();
                    $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
                    // 마켓 서버 refresh api 호출
                    $server = 'marketserver';
                    $portType = 'in';
                    $url = '/pubsub/metarefresh';
                    $refresh_target = 11;
                    $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
                    $result['Refresh'] = $apiResult;
     
                    $input = [];
                    $input['refresh'] = true;
                    $input['refresh_target'] = $refresh_target;
     
                    // USER ACTION 로그 생성 - API 호출
                    $apiLog = array();
                    $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
               }
          }
          // 구매 시작 일시 경과
          else {
               $result['Code'] = -1;
          }
          
          return $response->withJson($result);
     }
     
     // 상품(Claim) 활성 여부 수정 put
     public function putPreSalesClaimEnableUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
          $dbParams['IsEnabled'] = (int)$reqData['IsEnabled'];

          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Mod_PreSalesClaims_IsEnabled($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          // 마켓 서버 refresh api 호출
          if ($result['Code'] == 1) {
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;

               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;

               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }
          
          return $response->withJson($result);
     }
     
     // 상품(Claim) 이미지 수정 post
     public function postPreSalesClaimImageUpdate($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $common = new common();
          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $uploadedFiles = $request->getUploadedFiles();
          $cdn = new cdn($this->container);
          $commonUploadPath = '/' . getServerType() . '/presales/' . (int)$reqData['SalesID'] . '/';
          if ($uploadedFiles) {
               foreach ($uploadedFiles as $key => $value) {
                    if (!empty($value->file)) {
                         $ext = explode(".", $value->getClientFilename());
                         $image_ext[$key] = $ext[sizeof($ext)-1];
                         
                         $uploadFullPath = $commonUploadPath . (int)$reqData['ClaimID'] . '.' . $image_ext[$key];
                    }
                    
                    // 업로드 성공
                    if ($cdn->uploadFile($value->file, $uploadFullPath)) {
                         $cdn->purge($uploadFullPath);
                         
                         $storageURL = $this->container->storage['url'];
                         $imageUrl = $storageURL . $uploadFullPath;

                         $dbParams = [];
                         $dbParams['SalesID'] = (int)$reqData['SalesID'];
                         $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
                         $dbParams['ImageURL'] = $imageUrl;

                         $common = new common();
                         $AccountDB = new AccountDB($this->container);
                         $result = $AccountDB->USPT_Mod_PreSalesClaims_ImageURL($dbParams);

                         // USER ACTION 로그 생성
                         $log = array();
                         $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
                         $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
                         
                         // 마켓 서버 refresh api 호출
                         if ($result['Code'] == 1) {
                              $server = 'marketserver';
                              $portType = 'in';
                              $url = '/pubsub/metarefresh';
                              $refresh_target = 11;
                              $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
                              $result['Refresh'] = $apiResult;

                              $input = [];
                              $input['refresh'] = true;
                              $input['refresh_target'] = $refresh_target;

                              // USER ACTION 로그 생성 - API 호출
                              $apiLog = array();
                              $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
                              $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
                         }
                         
                         $result['ImageUpload'] = 1;
                    }
                    // 업로드 실패
                    else {
                         die('BLOB UPLOAD FAILED - ' . $uploadFullPath);
                         $result['ImageUpload'] = 0;
                    }
               }
          }

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, null, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }

     // 상품(Claim) RewardType이 3일때 보상 등록 post
     public function postPreSalesClaimRewardInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $common = new common();
          $AccountDB = new AccountDB($this->container);

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $log = array();
          $result = [];
          $dbParams = [];
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $dbParams['ClaimID'] = (int)$reqData['ClaimID'];

          // TVP는 2차원 배열로 전달해야함!
          $nftList = [];
          foreach ($reqData['NFTList'] as $value) {
               $nftList[] = [$value];
          }
          $dbParams['NFTList'] = $nftList;

          $result = $AccountDB->USPT_Add_PreSalesClaimNFTs($dbParams);
          
          // USER ACTION 로그 생성 - 보상 정보 등록
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          if ($result['Code'] == 1) {
               // 마켓 서버 refresh api 호출
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;
     
               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;
     
               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }

          return $response->withJson($result);
     }

     // 상품(Claim) RewardType이 11일때 보상 등록 post
     public function postPreSalesClaimGachasInsert($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $common = new common();
          $AccountDB = new AccountDB($this->container);

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $gachaInfo = $reqData['GachaInfo'];
          $isFail = false;

          if (isset($gachaInfo)) {
               foreach ($gachaInfo as $key => $value) {
                    $log = array();
                    $result = [];
                    $dbParams = [];
                    $dbParams['SalesID'] = (int)$reqData['SalesID'];
                    $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
                    $dbParams['NFTPackID'] = (int)$value['NFTPackID'];
                    $dbParams['RangeSize'] = (int)$value['RangeSize'];
                    
                    if ($value['GachaStatus'] == 'insert') {
                         $result = $AccountDB->USPT_Add_PreSalesClaimGachas($dbParams);
                         
                         // USER ACTION 로그 생성 - 랜덤 보상 정보 등록
                         $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
                    }
                    else if ($value['GachaStatus'] == 'update') {
                         $dbParams['IsDeleted'] = (int)$value['IsDeleted'];
                         $result = $AccountDB->USPT_Mod_PreSalesClaimGachas($dbParams);

                         // USER ACTION 로그 생성 - 랜덤 보상 정보 수정
                         $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
                    }
                    
                    // 실패한적이 있으면 isFail을 true로 변경
                    if ($isFail == false && $result['Code'] != 1) {
                         $isFail = true;
                    }
                    $result['IsFail'] = $isFail;
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
               }
          }
          
          // 등록, 수정이 실패한적이 없을때만 마켓 서버 api 호출
          if ($isFail == false && $result['Code'] == 1) {
               // 마켓 서버 refresh api 호출
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;
     
               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;
     
               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }

          return $response->withJson($result);
     }

     // 상품(Claim) 가격 등록, 수정 post
     public function postPreSalesClaimPrice($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $common = new common();
          $AccountDB = new AccountDB($this->container);

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();
          
          $priceInfo = $reqData['PriceInfo'];
          $isFail = false;
          
          if (isset($priceInfo)) {
               foreach ($priceInfo as $key => $value) {
                    $log = array();
                    $result = [];
                    $dbParams = [];
                    $dbParams['SalesID'] = (int)$reqData['SalesID'];
                    $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
                    $dbParams['CoinID'] = (int)$value['CoinID'];
                    $dbParams['Price'] = $value['Price'];
                    $dbParams['DiscountRatio'] = $value['DiscountRatio'];
                    $dbParams['DiscountedPrice'] = $value['DiscountedPrice'];
                    $dbParams['IsDeleted'] = (int)$value['IsDeleted'];
                    
                    if ($value['PriceStatus'] == 'insert') {
                         $result = $AccountDB->USPT_Add_PreSalesClaimPrice($dbParams);
                         
                         // USER ACTION 로그 생성 - 가격 정보 등록
                         $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
                    }
                    else if ($value['PriceStatus'] == 'update') {
                         $result = $AccountDB->USPT_Mod_PreSalesClaimPrice($dbParams);

                         // USER ACTION 로그 생성 - 가격 정보 수정
                         $log = $common->setLog($resData, enum::EVENT_TYPE_UPDATE, $dbParams, $result, enum::COMMON_SUCCESS);
                    }

                    // 실패한적이 있으면 isFail을 true로 변경
                    if ($isFail == false && $result['Code'] != 1) {
                         $isFail = true;
                    }
                    $result['IsFail'] = $isFail;
                    $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
               }
          }

          // 등록, 수정이 실패한적이 없을때만 마켓 서버 api 호출
          if ($isFail == false && $result['Code'] == 1) {
               // 마켓 서버 refresh api 호출
               $server = 'marketserver';
               $portType = 'in';
               $url = '/pubsub/metarefresh';
               $refresh_target = 11;
               $apiResult = $common->postApi($this->container, $server, $portType, $url, $refresh_target, null);
               $result['Refresh'] = $apiResult;
     
               $input = [];
               $input['refresh'] = true;
               $input['refresh_target'] = $refresh_target;
     
               // USER ACTION 로그 생성 - API 호출
               $apiLog = array();
               $apiLog = $common->setApiCallLog($resData, enum::EVENT_TYPE_API_POST, $server, $portType, $url, $input, $apiResult, $apiResult['return']);
               $common->sendLog($this->container, $this->container->menu->getMenuKey(), $apiLog);
          }

          return $response->withJson($result);
     }

     // 상품(Claim) 상세페이지 - 보상 NFTPackList
     public function postNftPackList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          // nftPackList
          $url = '/nft/free/list';
          $params = [];
          $params['pack_id'] = (int)$reqData['NFTPackID'];
          
          $result['nftPackList'] = $this->getApi($url, $params, true);
          
          return $response->withJson($result);
     }

     // 상품(Claim) 상세페이지 - 랜덤 보상 NFT 목록 post
     public function postGachaNftList($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));

          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_READ);
          if($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          //로그인 여부 체크 로직...
          $common = new common();
          $common->getProfile($resData);
          $common->setCommonData($resData, $request, $this->container);
          
          $dbParams = [];
          $result = array();
          $AccountDB = new AccountDB($this->container, true);
          
          // 등록된 랜덤 보상 NFT
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
          $dbParams['NFTPackID'] = (int)$reqData['NFTPackID'];
          $result = $AccountDB->USPT_GetList_PreSalesClaimGachaNFTs($dbParams);
          
          if ($result['Code'] == 1) {
               foreach ($result['Data']['List'] as $key => $value) {
                    $result['Data']['List'][$key]['ClaimStatusStr'] = enum::PRESALES_CLAIM_STATUS[(int)$value['ClaimStatus']];
               }
          }

          // 등록할 NFTPackList
          $url = '/nft/free/list';
          $params = [];
          $params['pack_id'] = (int)$reqData['NFTPackID'];
          $result['nftPackList'] = $this->getApi($url, $params, true);
          
          return $response->withJson($result);
     }
     
     // 상품(Claim) 랜덤 보상 NFT 등록
     public function postPreSalesClaimGachaNftInput($request, $response, $args) {
          // 메뉴 지정
          $this->container->menu->setMenuKey($this->container->menu->getMenuKeyByPath('/management/platform/preSales/list'));
          
          // check permission
          $checkPermission = $this->container->menu->checkPermission(enum::AUTH_MENU_PERMISSION_WRITE);
          if ($checkPermission !== TRUE) return $checkPermission;

          $reqData = $request->getParsedBody();

          $resData = array();
          $resData['BasePath'] = $request->getUri()->getBasePath();
          $resData['Path'] = $request->getUri()->getPath();

          $dbParams = [];
          $dbParams['SalesID'] = (int)$reqData['SalesID'];
          $dbParams['ClaimID'] = (int)$reqData['ClaimID'];
          $dbParams['NFTPackID'] = (int)$reqData['NFTPackID'];

          // TVP는 2차원 배열로 전달해야함!
          $nftList = [];
          foreach ($reqData['NFTList'] as $value) {
               $nftList[] = [$value];
          }
          $dbParams['NFTList'] = $nftList;
          
          $common = new common();
          $AccountDB = new AccountDB($this->container);
          $result = $AccountDB->USPT_Add_PreSalesClaimGachaNFTs($dbParams);

          // USER ACTION 로그 생성
          $log = array();
          $log = $common->setLog($resData, enum::EVENT_TYPE_INSERT, $dbParams, $result, enum::COMMON_SUCCESS);
          $common->sendLog($this->container, $this->container->menu->getMenuKey(), $log);
          
          return $response->withJson($result);
     }
     
     
     // ==================================================
     //    공통 함수
     // ==================================================
     // 보상 메타 - NFT 사전 판매용
     public function getRewardForNFTPreSales() {
          $result = array();
          $rewardMeta = $this->getRewards();
          if ($rewardMeta['Code'] == 1) {
               foreach ($rewardMeta['Data']['List'] as $key => $value) {
                    // 3: NFT, 11: 사전 판매 NFT 가챠만 추출
                    if ((int)$value['RewardType'] == 3 || (int)$value['RewardType'] == 11) {
                         $result[(int)$value['RewardType']] = $value['RewardName'];
                    }
               }
          }

          return $result;
     }

     // 사전 판매 정보 리스트(SalesID, SalesName만)
     public function getPreSalesInfo() {
          $result = array();
          $data = array();
          $dbParams = [];
          $AccountDB = new AccountDB($this->container, true);
          
          $dbParams['SalesName'] = "";
          $dbParams['ProgressStatus'] = 0;
          $dbParams['PageID'] = 1;
          $dbParams['PageSize'] = 255;
          $data = $AccountDB->USPT_Srch_PreSales($dbParams);
          
          if ($data['Code'] == 1) {
               foreach ($data['Data']['List'] as $key => $value) {
                    $result[$value['SalesID']] = $value['SalesName'];
               }
          }

          return $result;
     }

     // NFTPack API Call
     public function getNftPack() {
          $result = array();

          $url = '/nft/pack/list';
          $params = [];
          $params['page_offset'] = 1;
          $params['page_size'] = 10000000;
          $result = $this->getApi($url, $params, true)['nft_pack_list'];

          return $result;
     }

     // NFTPack API Call - ID랑 Name만
     public function getNftPackIDName() {
          $result = array();

          $url = '/nft/pack/list';
          $params = [];
          $params['page_offset'] = 1;
          $params['page_size'] = 10000000;
          $data = $this->getApi($url, $params, true)['nft_pack_list'];

          foreach ($data as $key => $value) {
               $result[(int)$value['pack_id']] = $value['pack_name'];
          }

          return $result;
     }

     // Market Server API Call
     public function getApi($url, $params, $value) {
          $server = 'marketserver';
          $portType = 'in';
          $common = new common();

          if ($value) {
               $result = $common->getApi($this->container, $server, $portType, $url, $params)['value'];
          }
          else {
               $result = $common->getApi($this->container, $server, $portType, $url, $params);
          }
          
          return $result;
     }

}