From 6c05919c8fdaeca34a81bf0a84e5ae12dc99d1e0 Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 월, 07 2월 2022 17:58:13 +0900
Subject: [PATCH] - 임포트 로직 수정중 - 인터넷진흥원 설정파일 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  329 ++++++++++++++++++++++------------------------
 src/main/resources/system_prod.properties                         |    1 
 src/main/java/kr/wisestone/owl/util/CommonUtil.java               |    3 
 src/main/resources/system_test.properties                         |   65 +++++---
 src/main/java/kr/wisestone/owl/util/DateUtil.java                 |    4 
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java         |    1 
 src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties            |    1 
 7 files changed, 205 insertions(+), 199 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index 5db2622..ba87674 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -160,6 +160,7 @@
     public static final String USER_RETURN_PASSWORD_NOT_PROVIDER_SOCIAL_JOIN_USER = "USER_RETURN_PASSWORD_NOT_PROVIDER_SOCIAL_JOIN_USER";   //  鍮꾨�踰덊샇 李얘린 湲곕뒫�쓣 �냼�뀥 怨꾩젙 媛��엯 �궗�슜�옄�뒗 �궗�슜�븷 �닔 �뾾�뒿�땲�떎.
     public static final String USER_NOT_USE_ACTIVE_STATUS = "USER_NOT_USE_ACTIVE_STATUS";   //  �궗�슜�옄�뒗 �솢�꽦 �긽�깭媛� �븘�땲硫� 濡쒓렇�씤�븷 �닔 �뾾�뒿�땲�떎.
 
+    public static final String EXCEL_IMPORT_ERROR = "EXCEL_IMPORT_ERROR"; //  �뿊�� �엫�룷�듃 �삤瑜섏엯�땲�떎.
     public static final String EXCEL_NOT_EXTENSION = "EXCEL_NOT_EXTENSION"; //  �뿊�� �뙆�씪 �솗�옣�옄 (xlsx)留� �뾽濡쒕뱶媛� 媛��뒫�빀�땲�떎.
     public static final String EXCEL_DOWNLOAD_MAX_ROWS_OVER = "EXCEL_DOWNLOAD_MAX_ROWS_OVER";   //  寃��깋�맂 �뿊�� �뻾�씠 1,000嫄댁쓣 珥덇낵�븯�뿬 �떎�슫濡쒕뱶 �븷 �닔 �뾾�뒿�땲�떎. 寃��깋 議곌굔�쓣 �궗�슜�븯�뿬 1,000 嫄� �씠�븯濡� �떎�슫濡쒕뱶瑜� 吏꾪뻾�빐�빞 �빀�땲�떎.
     public static final String EXCEL_IMPORT_MAX_ROWS_OVER = "EXCEL_IMPORT_MAX_ROWS_OVER";   //  �뿊�� �뾽濡쒕뱶濡� �씠�뒋 �벑濡앹� 理쒕� 1,000 嫄닿퉴吏�留� 媛��뒫�빀�땲�떎.
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
index 8e87053..45418f0 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -46,6 +46,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -867,15 +868,28 @@
         }
     }
 
-    //  �궇吏� �쑀�슚�꽦 泥댄겕
+    /**
+     * �궇吏� �쑀�슚�꽦 泥댄겕
+     * @param startDate �떆�옉 �씪�옄(臾몄옄)
+     * @param completeDate 醫낅즺 �씪�옄(臾몄옄)
+     */
     private void checkStartCompleteDate(String startDate, String completeDate) {
         if (!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(completeDate)) {
             Date start = DateUtil.convertStrToDate(startDate, "yy-MM-dd");
             Date end = DateUtil.convertStrToDate(completeDate, "yy-MM-dd");
-            if (start.getTime() > end.getTime()) {
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.DATE_PICKER_NOT_AVAILABLE));
-            }
+            checkStartCompleteDate(start, end);
+        }
+    }
+
+    /**
+     * �궇吏� �쑀�슚�꽦 泥댄겕
+     * @param start �떆�옉 �씪�옄
+     * @param end 醫낅즺 �씪�옄
+     */
+    private void checkStartCompleteDate(Date start, Date end) {
+        if (start.getTime() > end.getTime()) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.DATE_PICKER_NOT_AVAILABLE));
         }
     }
 
@@ -3451,36 +3465,30 @@
 
     /**
      * cell NULL 泥댄겕 �븿�닔
+     * 臾몄옄�삎�떇 cell 泥댄겕
      * @param cell Cell
      * @return boolean
      */
-    private Boolean cellNullCheck (Cell cell, int rowIndex) {
-        boolean result = false;
-
-        //  臾몄옄�삎�떇�씤吏� 泥댄겕
-        if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && cell.getCellType() != Cell.CELL_TYPE_STRING) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_NOT_STRING_TYPE, rowIndex));
+    private Boolean cellNullCheck (Cell cell) {
+        if (cell != null ) {
+            if (cell.getCellType() != Cell.CELL_TYPE_BLANK) {
+                if (cell.getCellType() == Cell.CELL_TYPE_STRING && cell.getStringCellValue() != null) {
+                    return false;
+                }
+            }
         }
-        //  怨듬갚 �젣嫄�
-        if (cell != null && cell.getStringCellValue() != null) {
-            cell.setCellValue(cell.getStringCellValue().trim());
-        }
-
-        if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && cell.getCellType() == cell.CELL_TYPE_STRING
-                && cell.getStringCellValue() != null && !cell.getStringCellValue().equals("")) {
-            result = true;
-        }
-
-        return result;
+        return true;
     }
+
+
+
 
     //  �뿊�� �븘�뱶�뿉 �엳�뒗 �젙蹂대�� �씠�뒋 form �쑝濡� �삷湲대떎.
     private IssueForm setIssueFormToExcelField(Row row, int rowIndex, Map<String, Priority> priorityMaps,
                                                Map<String, Severity> severityMaps, Map<String, DepartmentVo> departmentMaps,
                                                Map<String, CustomField> customFieldMaps, Map<String, CompanyField> companyFieldMaps,
                                                Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps,
-                                               List<String> headers) {
+                                               List<String> headers) throws ParseException {
         IssueForm issueForm = new IssueForm();
         issueForm.setRegisterId(this.webAppUtil.getLoginId());
         Project project = null;
@@ -3488,30 +3496,48 @@
         //  �젣紐�, �궡�슜, �봽濡쒖젥�듃 �궎, �씠�뒋 ���엯, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, �떆�옉�씪, 醫낅즺�씪, �궗�슜�옄 �젙�쓽 �븘�뱶
         for (int cellIndex = 0; cellIndex < headers.size(); cellIndex++) {
             Cell cell = row.getCell(cellIndex);
+            boolean isNull = cellNullCheck(cell);
+
+            String cellStr = "";
+            if (!isNull) {
+                cellStr = CommonUtil.convertExcelStringToCell(cell);
+
+                //  怨듬갚 �젣嫄�
+                cell.setCellValue(cellStr.trim());
+            } else {
+                cell.setCellValue(cellStr);
+            }
+
             switch (cellIndex) {
                 case 0:
                     //  �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormTitle(cell, issueForm, rowIndex);
+                    if (isNull) {
+                        throw new OwlRuntimeException(
+                                this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TITLE_IS_NULL, rowIndex));
+                    }
+                    this.setIssueFormTitle(cellStr, issueForm, rowIndex);
                     break;
 
                 case 1:    //  �궡�슜
-                    if (cellNullCheck(cell, rowIndex)) {
-                        issueForm.setDescription(CommonUtil.convertExcelStringToCell(cell));
-                    } else {
-                        //  null �엯�젰 諛⑹�
-                        issueForm.setDescription("");
-                    }
-
+                    issueForm.setDescription(cellStr);
                     break;
 
                 case 2:
                     //  �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormPriority(cell, priorityMaps, issueForm, rowIndex);
+                    if (isNull) {
+                        throw new OwlRuntimeException(
+                                this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PRIORITY_IS_NULL, rowIndex));
+                    }
+                    this.setIssueFormPriority(cellStr, priorityMaps, issueForm, rowIndex);
                     break;
 
                 case 3:
                     //  以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormSeverity(cell, severityMaps, issueForm, rowIndex);
+                    if (isNull) {
+                        throw new OwlRuntimeException(
+                                this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_SEVERITY_IS_NULL, rowIndex));
+                    }
+                    this.setIssueFormSeverity(cellStr, severityMaps, issueForm, rowIndex);
                     break;
                 /*case 6:
                     //  �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎.
@@ -3519,47 +3545,37 @@
                     break;*/
                 case 4:
                     //  �떆�옉�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
-                        this.setIssueFormPeriod(cell, issueForm, true, rowIndex);
-                    }
+                    this.setIssueFormPeriod(cellStr, issueForm, true, rowIndex, isNull);
                     break;
                 case 5:
                     //  醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
-                        this.setIssueFormPeriod(cell, issueForm, false, rowIndex);
-                    }
+                    this.setIssueFormPeriod(cellStr, issueForm, false, rowIndex, isNull);
                     break;
                 case 6:
                     //  �뾽泥대�� IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell, rowIndex)) {
-                        this.setIssueFormCompanyField(cell, companyFieldMaps, issueForm, rowIndex);
-                    }
+                    this.setIssueFormCompanyField(cellStr, companyFieldMaps, issueForm, rowIndex);
                     break;
                 case 7:
                     //  ISP瑜� IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell, rowIndex)) {
-                        this.setIssueFormIspField(cell, ispFieldMaps, issueForm, rowIndex);
-                    }
+                    this.setIssueFormIspField(cellStr, ispFieldMaps, issueForm, rowIndex);
                     break;
                 case 8:
                     //  �샇�뒪�똿�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell, rowIndex)) {
-                        this.setIssueFormHostingField(cell, hostingFieldMaps, issueForm, rowIndex);
-                    }
+                    this.setIssueFormHostingField(cellStr, hostingFieldMaps, issueForm, rowIndex);
                     break;
                 default:
                     //  9踰� 遺��꽣�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶. �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormCustomFieldValue(cell, customFieldMaps, issueForm, headers.get(cellIndex), rowIndex);
+                    this.setIssueFormCustomFieldValue(cellStr, customFieldMaps, issueForm, headers.get(cellIndex), rowIndex);
             }
         }
 
         return issueForm;
     }
 
-    private void setIssueFormHostingField(Cell cell, Map<String, HostingField> hostingFieldMaps, IssueForm issueForm, int rowIndex) {
-        if (cell != null) {
+    private void setIssueFormHostingField(String cell, Map<String, HostingField> hostingFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell.length() > 0) {
             Map<String, Object> issueHostingFields = new HashMap<>();
-            HostingField hostingFieldMap = hostingFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            HostingField hostingFieldMap = hostingFieldMaps.get(cell);
             if (hostingFieldMap == null) {
                 throw new OwlRuntimeException(
                         this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HOSTING_NOT_EXIST, rowIndex));
@@ -3569,10 +3585,10 @@
         }
     }
 
-    private void setIssueFormIspField(Cell cell, Map<String, IspField> ispFieldMaps, IssueForm issueForm, int rowIndex) {
-        if (cell != null) {
+    private void setIssueFormIspField(String cell, Map<String, IspField> ispFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell.length() > 0) {
             Map<String, Object> issueIspFields = new HashMap<>();
-            IspField ispFieldMap = ispFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            IspField ispFieldMap = ispFieldMaps.get(cell);
             if (ispFieldMap == null) {
                 throw new OwlRuntimeException(
                         this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISP_NOT_EXIST, rowIndex));
@@ -3582,10 +3598,10 @@
         }
     }
 
-    private void setIssueFormCompanyField(Cell cell, Map<String, CompanyField> companyFieldMaps, IssueForm issueForm, int rowIndex) {
-        if (cell != null) {
+    private void setIssueFormCompanyField(String cell, Map<String, CompanyField> companyFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell.length() > 0) {
             Map<String, Object> issueCompanyFields = new HashMap<>();
-            CompanyField companyFieldMap = companyFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            CompanyField companyFieldMap = companyFieldMaps.get(cell);
             if (companyFieldMap == null) {
                 throw new OwlRuntimeException(
                         this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_COMPANY_NOT_EXIST, rowIndex));
@@ -3596,14 +3612,7 @@
     }
 
     //  �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormTitle(Cell cell, IssueForm issueForm, int rowIndex) {
-        if (!cellNullCheck(cell, rowIndex)) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TITLE_IS_NULL, rowIndex));
-        }
-
-        String title = CommonUtil.convertExcelStringToCell(cell);
-
+    private void setIssueFormTitle(String title, IssueForm issueForm, int rowIndex) {
         //  �젣紐� �쑀�슚�꽦 泥댄겕
         this.verifyTitle(title);
         issueForm.setTitle(title);
@@ -3644,13 +3653,8 @@
 
 
     //  �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormPriority(Cell cell, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) {
-        if (!cellNullCheck(cell, rowIndex)) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PRIORITY_IS_NULL, rowIndex));
-        }
-
-        Priority priority = priorityMaps.get(CommonUtil.convertExcelStringToCell(cell));
+    private void setIssueFormPriority(String priorityStr, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) {
+        Priority priority = priorityMaps.get(priorityStr);
 
         if (priority == null) {
             throw new OwlRuntimeException(
@@ -3661,13 +3665,8 @@
     }
 
     //  以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormSeverity(Cell cell, Map<String, Severity> severityMaps, IssueForm issueForm, int rowIndex) {
-        if (!cellNullCheck(cell, rowIndex)) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_SEVERITY_IS_NULL, rowIndex));
-        }
-
-        Severity severity = severityMaps.get(CommonUtil.convertExcelStringToCell(cell));
+    private void setIssueFormSeverity(String strSeverity, Map<String, Severity> severityMaps, IssueForm issueForm, int rowIndex) {
+        Severity severity = severityMaps.get(strSeverity);
 
         if (severity == null) {
             throw new OwlRuntimeException(
@@ -3693,33 +3692,19 @@
         }
     }
     //  �떆�옉�씪, 醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormPeriod(Cell cell, IssueForm issueForm, Boolean checkStartDate, int rowIndex) {
-        if (cell != null && !cell.toString().equals("")) {
+    private void setIssueFormPeriod(String periodDate, IssueForm issueForm, Boolean checkStartDate, int rowIndex, boolean isNull) throws ParseException {
+        if (!isNull) {
 
-            //  媛믪씠 怨듬갚�씠硫� 以묒�
-            String cellValue = CommonUtil.convertExcelStringToCell(cell);
-            if (StringUtils.isEmpty(cellValue) || cell.toString().equals("null")) {
-                return;
-            }
-
-            if (cell.toString().length() < 10 && cell.toString().contains("-")) { //�궇吏� �삎�떇 泥댄겕
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_DASH, rowIndex));
-            }
-
-            Date startDate;
-
-            try {
-                startDate = cell.getDateCellValue();
-            } catch (Exception e) {
+            Date startDate = DateUtil.convertStrToDateOnly(periodDate);
+            if (startDate == null) {
                 throw new OwlRuntimeException(
                         this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY_EMPTY, rowIndex));
             }
 
             if (checkStartDate) {
-                issueForm.setStartDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd"));
+                issueForm.setStartDate(periodDate);
             } else {
-                issueForm.setCompleteDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd"));
+                issueForm.setCompleteDate(periodDate);
                 
                 //  醫낅즺�씪留� �엯�젰 �뻽�쓣 寃쎌슦
                 if (issueForm.getCompleteDate() != null && issueForm.getStartDate() == null) {
@@ -3739,93 +3724,89 @@
     }
 
     //  �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.-
-    private void setIssueFormCustomFieldValue(Cell cell, Map<String, CustomField> customFieldMaps, IssueForm issueForm, String customFieldName, int rowIndex) {
-        if (cell != null) {
-            String cellValue = CommonUtil.convertExcelStringToCell(cell);
-            Map<String, Object> issueCustomFieldMap = new HashMap<>();
-            CustomField customField = customFieldMaps.get(customFieldName);
+    private void setIssueFormCustomFieldValue(String cellValue, Map<String, CustomField> customFieldMaps, IssueForm issueForm, String customFieldName, int rowIndex) {
+        Map<String, Object> issueCustomFieldMap = new HashMap<>();
+        CustomField customField = customFieldMaps.get(customFieldName);
 
-            if (customField == null) {
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST, rowIndex));
-            }
-            //  �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 怨듬갚�씠硫� 以묒�
-            if (StringUtils.isEmpty(cellValue)) {
-                return;
-            }
+        if (customField == null) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST, rowIndex));
+        }
+        //  �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 怨듬갚�씠硫� 以묒�
+        if (StringUtils.isEmpty(cellValue)) {
+            return;
+        }
 
-            boolean validity = false;
+        boolean validity = false;
 
-            switch (customField.getCustomFieldType()) {
-                case INPUT:
-                case NUMBER:
-                case DATETIME:
-                case IP_ADDRESS:
-                case EMAIL:
-                case SITE:
-                case TEL:
-                    if (customField.getCustomFieldType() != INPUT && cellValue.length() > 100) { //INPUT ���엯�� 100�옄 �젣�븳 �뾾�쓬
+        switch (customField.getCustomFieldType()) {
+            case INPUT:
+            case NUMBER:
+            case DATETIME:
+            case IP_ADDRESS:
+            case EMAIL:
+            case SITE:
+            case TEL:
+                if (customField.getCustomFieldType() != INPUT && cellValue.length() > 100) { //INPUT ���엯�� 100�옄 �젣�븳 �뾾�쓬
+                    throw new OwlRuntimeException(
+                            this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_TEXT_TYPE_MAX_LENGTH_OUT));
+                }
+
+                if (customField.getCustomFieldType() == DATETIME) { //DATETIME�씪 寃쎌슦 format 蹂�寃�
+                    Date date = DateUtil.convertStrToDate(cellValue);
+                    if (date == null) {
                         throw new OwlRuntimeException(
-                                this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_TEXT_TYPE_MAX_LENGTH_OUT));
+                                this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_DATETIME_NOT_DASH, rowIndex));
                     }
+                }
 
-                    if (customField.getCustomFieldType() == DATETIME) { //DATETIME�씪 寃쎌슦 format 蹂�寃�
-                        if (cell.toString().length() < 10 && cell.toString().contains("-")) { //�궇吏� �삎�떇 泥댄겕
-                            throw new OwlRuntimeException(
-                                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_DATETIME_NOT_DASH, rowIndex));
-                        }
-                        Date date = cell.getDateCellValue();
-                        cellValue = new SimpleDateFormat("yyyy-MM-dd H:mm:ss").format(date);
+                issueCustomFieldMap.put("customFieldId", customField.getId());
+                issueCustomFieldMap.put("useValue", cellValue);
+                issueForm.addIssueCustomFields(issueCustomFieldMap);
+                break;
+            case SINGLE_SELECT:
+                //  媛� �쑀�슚�꽦 泥댄겕
+                for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) {
+                    if (customFieldValue.getValue().equals(cellValue)) {
+                        validity = true;
+                        break;
                     }
+                }
 
-                    issueCustomFieldMap.put("customFieldId", customField.getId());
-                    issueCustomFieldMap.put("useValue", cellValue);
-                    issueForm.addIssueCustomFields(issueCustomFieldMap);
-                    break;
-                case SINGLE_SELECT:
-                    //  媛� �쑀�슚�꽦 泥댄겕
+                if (!validity) {
+                    throw new OwlRuntimeException(
+                            this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex));
+                }
+
+                issueCustomFieldMap.put("customFieldId", customField.getId());
+                issueCustomFieldMap.put("useValue", cellValue);
+                issueForm.addIssueCustomFields(issueCustomFieldMap);
+
+                break;
+            case MULTI_SELECT:
+                //  媛� �쑀�슚�꽦 泥댄겕
+                String[] useValues = cellValue.split("#");
+                //  �빐, �떖
+                for (String useValue : useValues) {
                     for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) {
-                        if (customFieldValue.getValue().equals(cellValue)) {
+
+                        if (customFieldValue.getValue().equals(useValue)) {
                             validity = true;
-                            break;
+                            Map<String, Object> multiValueMap = new HashMap<>();
+                            multiValueMap.put("customFieldId", customField.getId());
+                            multiValueMap.put("useValue", useValue);
+                            issueForm.addIssueCustomFields(multiValueMap);
                         }
+
                     }
+                }
 
-                    if (!validity) {
-                        throw new OwlRuntimeException(
-                                this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex));
-                    }
+                if (!validity) {
+                    throw new OwlRuntimeException(
+                            this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex));
+                }
 
-                    issueCustomFieldMap.put("customFieldId", customField.getId());
-                    issueCustomFieldMap.put("useValue", cellValue);
-                    issueForm.addIssueCustomFields(issueCustomFieldMap);
-
-                    break;
-                case MULTI_SELECT:
-                    //  媛� �쑀�슚�꽦 泥댄겕
-                    String[] useValues = cellValue.split("#");
-                    //  �빐, �떖
-                    for (String useValue : useValues) {
-                        for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) {
-
-                            if (customFieldValue.getValue().equals(useValue)) {
-                                validity = true;
-                                Map<String, Object> multiValueMap = new HashMap<>();
-                                multiValueMap.put("customFieldId", customField.getId());
-                                multiValueMap.put("useValue", useValue);
-                                issueForm.addIssueCustomFields(multiValueMap);
-                            }
-
-                        }
-                    }
-
-                    if (!validity) {
-                        throw new OwlRuntimeException(
-                                this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex));
-                    }
-
-                    break;
-            }
+                break;
         }
     }
 
diff --git a/src/main/java/kr/wisestone/owl/util/CommonUtil.java b/src/main/java/kr/wisestone/owl/util/CommonUtil.java
index 079f3a4..af20eb8 100644
--- a/src/main/java/kr/wisestone/owl/util/CommonUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/CommonUtil.java
@@ -40,6 +40,7 @@
 import java.security.MessageDigest;
 import java.security.spec.KeySpec;
 import java.text.DecimalFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -962,7 +963,7 @@
                 double doubleValue = cell.getNumericCellValue();
                 int intValue;
 
-                if (doubleValue%1 == 0) {
+                if (doubleValue % 1 == 0) {
                     intValue = (int)doubleValue;
                     cellValue = intValue + "";
                 }
diff --git a/src/main/java/kr/wisestone/owl/util/DateUtil.java b/src/main/java/kr/wisestone/owl/util/DateUtil.java
index 0d67825..ab66168 100644
--- a/src/main/java/kr/wisestone/owl/util/DateUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/DateUtil.java
@@ -24,6 +24,10 @@
         return convertStrToDate(source, "yyyy-MM-dd HH:mm:ss");
     }
 
+    public static Date convertStrToDateOnly(String source) {
+        return convertStrToDate(source, "yyyy-MM-dd");
+    }
+
     public static Date convertStrToDate(String source, String pattern) {
         return convertStrToDate(source, pattern, Locale.KOREA);
     }
diff --git a/src/main/resources/system_prod.properties b/src/main/resources/system_prod.properties
index 3b2d910..ef61c3d 100644
--- a/src/main/resources/system_prod.properties
+++ b/src/main/resources/system_prod.properties
@@ -40,6 +40,7 @@
 # email \uC124\uC815
 email.host=221.149.161.20
 email.port=25
+email.sender=KISA
 email.userName=detect@krcert.or.kr
 email.password=kisc%2004
 email.transport.protocol=smtp
diff --git a/src/main/resources/system_test.properties b/src/main/resources/system_test.properties
index 3013451..38a1b11 100644
--- a/src/main/resources/system_test.properties
+++ b/src/main/resources/system_test.properties
@@ -1,42 +1,54 @@
 # mariaDB \uC124\uC815
-db.primary.url=jdbc:mariadb://IP\uC8FC\uC18C \uC785\uB825/dev_db?allowMultiQueries=true
-db.replica1.url=jdbc:mariadb://IP\uC8FC\uC18C \uC785\uB825/dev_db?allowMultiQueries=true
+db.primary.driverName=org.mariadb.jdbc.Driver
+db.primary.url=jdbc:mariadb://127.0.0.1/prod_db?allowMultiQueries=true
+db.replica1.url=jdbc:mariadb://127.0.0.1/prod_db?allowMultiQueries=true
 db.replica2.url=
 db.replica3.url=
 db.replica4.url=
 db.replica5.url=
-db.primary.userName=ID
-db.primary.password=\uBE44\uBC00\uBC88\uD638
+db.primary.userName=root
+db.primary.password=maponrex
 
 
 # elasticSearch \uC124\uC815
 elastic.search.hosts=http://52.78.198.178:9200
 
 # kafka \uC124\uC815
-kafka.bootstrap.servers=ec2-52-78-150-61.ap-northeast-2.compute.amazonaws.com:9092,ec2-52-79-150-7.ap-northeast-2.compute.amazonaws.com:9092,ec2-52-79-193-191.ap-northeast-2.compute.amazonaws.com:9092
-kafka.consumer.group.id=test-common-group
-kafka.common.topic=test-common-topic
+# use kafka or not
+# kafka by zenith at 20200625
+use.kafka=false
+
+# kafka.bootstrap.servers=ec2-52-78-150-61.ap-northeast-2.compute.amazonaws.com:9092,ec2-52-79-150-7.ap-northeast-2.compute.amazonaws.com:9092,ec2-52-79-193-191.ap-northeast-2.compute.amazonaws.com:9092
+kafka.bootstrap.servers=127.0.0.2:9092
+kafka.consumer.group.id=dev-common-group
+kafka.common.topic=dev-common-topic
 
 # redis \uC124\uC815
-#  test-session-01.9pesbb.ng.0001.apn2.cache.amazonaws.com
-redis.host=192.168.0.64
+redis.host=127.0.0.1
 redis.port=6379
-redis.common.topic=test-common-topic
+redis.common.topic=dev-common-topic
+spring.session.timeout=36000
+
+
+# License Key \uC124\uC815
+owl.license.key=1234
 
 # mail attached file path
 mail.file.path=C:/downloads/
 mail.account=
 mail.password=
 
-# email send
+# email \uC124\uC815
 email.host=mail.g2works.kr
 email.port=587
+email.sender=OWL-ITS
 email.userName=supportowl@wisestone.kr
 email.password=Stone0620**
 email.transport.protocol=smtp
 email.smtp.auth=true
 email.smtp.starttle.enable=true
 email.debug=true
+email.sendUrl=http://localhost:8080
 
 # \uD68C\uACC4 \uB2F4\uB2F9\uC790 \uACB0\uC81C \uCDE8\uC18C \uC54C\uB9BC - \uD68C\uACC4 \uB2F4\uB2F9\uC790\uB294 \uAF2D \uC2DC\uC2A4\uD15C\uC5D0 \uAC00\uC785 \uB418\uC5B4 \uC788\uC5B4\uC57C \uD55C\uB2E4.
 payment.cancel.manager.email=jslee1@wisestone.kr
@@ -48,28 +60,35 @@
 total.statistics.email=jslee1@wisestone.kr
 
 # saas service max user & use period
-saas.maxUser=10
-saas.period=30
+# packageteyp 1 : lite (~200 Users), 2 : medium (~500 users), 3 : Enterprice (~1000 users) (0 \uC740 demo version)
+saas.packagetype=1 
+
+saas.maxUser=200
+saas.period=3650
 
 # \uD658\uC728
-saas.usdkrw=1163
+saas.usdkrw=1183
 
 # use aws or not
 # added by zenith at 20200623
 use.aws=false
 
-# aws upload path
-attached.file.path=/test-upload/
-profile.file.path=/test-profile
+use.scheduler=false
+
+# upload path
+attached.file.path=/dev-upload/
+profile.file.path=/dev-profile
+
 # aws bucket name
 aws.bucket.name=wisestone-test
 # aws bucket access key
 aws.access.key=AKIARX6BJQMZKUYEEJVD
 aws.access.password=eAQvouvSJJFl47h2dkMJji/6OtzsGBGF4h9Df3qH
-
 # aws s3 url
-aws.s3.url=https://s3.ap-northeast-2.amazonaws.com/
-# OAuth 2.0 \uC778\uC99D \uC815\uBCF4
+# aws.s3.url=https://s3.ap-northeast-2.amazonaws.com/
+aws.s3.url=http://localhost:8081/
+
+# OAuth 2.0 \uC778\uC99D \uC815\uBCF4 \uC124\uC815
 OAuth.google.clientId=545115864261-lumkhr0qhei643koiva5b130410s032e.apps.googleusercontent.com
 OAuth.google.clientSecret=olvwp9OipUzaAj86Hx5HKPE5
 OAuth.google.redirectUri=http://localhost:8080/googleOAuth2CallBack
@@ -77,14 +96,12 @@
 OAuth.naver.clientId=Trl8vV30ctsUDlgGoWqZ
 OAuth.naver.clientSecret=suJXIbB8dz
 
-OAuth.kakao.clientId=13d56a63b9b9b1003d779261ce1651e3
-OAuth.kakao.clientSecret=kumDB7dtnBumpjydGZPqScl7Vd1tezcq
+OAuth.kakao.clientId=8db70e7979edc86b76c7b1d33312282d
+OAuth.kakao.clientSecret=yIpsPh81H326UL7jdcXAu4OhfmKnmmpx
 
 OAuth.facebook.clientId=1967163700251105
 OAuth.facebook.clientSecret=34c4c009bc85caf08a6e27ecfe65744d
 OAuth.facebook.redirectUri=https://www.owlsolution.io/facebookOAuth2CallBack
 
 OAuth.common.state=state_parameter_owl_its_value
-
-
 
diff --git a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
index a27bbd4..7313108 100644
--- a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -47,6 +47,7 @@
 WORKSPACE_INCLUDE_DISABLED = \uD574\uB2F9 \uC5C5\uBB34 \uACF5\uAC04\uC5D0\uC11C \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBBC0\uB85C \uC0DD\uC131, \uC218\uC815, \uC0AD\uC81C, \uC774\uBBF8\uC9C0/\uC5D1\uC140 \uB2E4\uC6B4\uB85C\uB4DC \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
 
 ATTACHED_FILE_NOT_EXIST = \uCCA8\uBD80 \uD30C\uC77C \uC815\uBCF4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+EXCEL_IMPORT_ERROR = \uC5D1\uC140 \uC784\uD3EC\uD2B8 \uC624\uB958\uC785\uB2C8\uB2E4. {0}\uC904 {1}\uCEEC\uB7FC
 
 START_ISSUE_STATUS_NOT_EXIST = \uC2DC\uC791\uD558\uB294 \uC774\uC288 \uC0C1\uD0DC\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
 END_ISSUE_STATUS_NOT_EXIST = \uC885\uB8CC\uD558\uB294 \uC774\uC288 \uC0C1\uD0DC\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.

--
Gitblit v1.8.0