From b1d7844cb525a36b1e0e193e9e96a2531d4badeb Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 화, 22 2월 2022 14:23:26 +0900
Subject: [PATCH] - 이슈유형 설정에 상위 이슈 업체/ISP/호스팅 상속 기능 - 워크플로우에 속해있는 부서 삭제 시 팝업 메시지 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  471 ++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 308 insertions(+), 163 deletions(-)

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 8d3e1be..283b46b 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -46,11 +46,10 @@
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
-import java.text.SimpleDateFormat;
+import java.text.ParseException;
 import java.util.*;
 
-import static kr.wisestone.owl.domain.enumType.CustomFieldType.DATETIME;
-import static kr.wisestone.owl.domain.enumType.CustomFieldType.INPUT;
+import static kr.wisestone.owl.domain.enumType.CustomFieldType.*;
 
 @Service
 public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService {
@@ -310,7 +309,7 @@
                     issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId());
                 }
 
-                // 醫낅즺�긽�깭媛� �븘�땶 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
+                // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
                 List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
                 int size = issues.size();
                 if (size > 0) {
@@ -467,7 +466,7 @@
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
             issueCustomFieldValueCondition.setUseValues(userValues);
             issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
-            issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
+//            issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
             List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             if (results != null && results.size() > 0) {
                 for (Map<String, Object> result : results) {
@@ -522,6 +521,12 @@
         if (issueForm.getParentIssueId() != null){
             Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
             issue.setParentIssue(parentIssue);
+
+            // �긽�쐞 �씠�뒋媛� 醫낅즺�씪寃쎌슦 ��湲곕줈 蹂�寃�
+            IssueStatus parentIssueStatus = parentIssue.getIssueStatus();
+            if (parentIssueStatus.getIssueStatusType().equals(IssueStatusType.CLOSE)) {
+                parentIssue.setIssueStatus(issueStatus);
+            }
         }
 
         issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project));    //  媛� �봽濡쒖젥�듃�쓽 怨좎쑀 �씠�뒋 踰덊샇 �깮�꽦
@@ -576,15 +581,15 @@
     //  �븯�쐞�씠�뒋瑜� �깮�꽦�븳�떎.
     @Override
     @Transactional
-    public Issue addDownIssue(IssueForm issueForm, List<MultipartFile> multipartFiles) {
+    public Issue addDownIssue(Map<String, Object> resJsonData, IssueForm issueForm, List<MultipartFile> multipartFiles) {
         User user = this.webAppUtil.getLoginUserObject();
-        return addDownIssue(user, issueForm, multipartFiles);
+        return addDownIssue(resJsonData, user, issueForm, multipartFiles);
     }
 
     //  �븯�쐞�씠�뒋瑜� �깮�꽦�븳�떎.
     @Override
     @Transactional
-    public Issue addDownIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
+    public Issue addDownIssue(Map<String, Object> resJsonData, User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
         StringBuilder detectIssueChange = new StringBuilder();
 
         //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
@@ -648,6 +653,7 @@
         this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null);
         //  �씠�뒋 �쐞�뿕 愿�由� �깮�꽦
         this.issueRiskService.addIssueRisk(issue, project.getWorkspace());
+
         //  �쁺�냽�꽦 而⑦뀓�뒪�듃 鍮꾩슦湲�
         this.clear();
         //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
@@ -657,7 +663,22 @@
         UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class);
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_ADD));
 
+        IssueVo issueVo = this.convertToIssueVo(issue);
+        resJsonData.put(Constants.RES_KEY_CONTENTS, issueVo);
+
         return issue;
+    }
+
+    /**
+     * Issue瑜� IssueVo濡� 蹂��솚(�븯�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽 �떆 �븘�슂)
+     * @param issue Issue
+     * @return IssueVo
+     */
+    private IssueVo convertToIssueVo(Issue issue) {
+        IssueVo issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
+        issueVo.setInheritPartners(issue.getIssueType().getInheritPartners());
+        issueVo.setUsePartner(issue.getIssueType().getUsePartner());
+        return issueVo;
     }
 
     //  �뿰愿��씠�뒋瑜� �깮�꽦�븳�떎.
@@ -867,15 +888,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));
         }
     }
 
@@ -1256,6 +1290,9 @@
     private void setMapToIssueVo(List<Map<String, Object>> results, List<IssueVo> issueVos, IssueCondition issueCondition, User user) {
         for (Map<String, Object> result : results) {
             IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
+            if (MapUtil.getString(result, "inheritPartners") != null && MapUtil.getString(result, "inheritPartners").equals("1")) {
+                issueVo.setInheritPartners(true);
+            }
             issueVos.add(issueVo);
             issueCondition.addIssueIds(String.valueOf(issueVo.getId()));
         }
@@ -2107,6 +2144,15 @@
         //  HOSTING �젙蹂� ���옣
         this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange);
 
+        //  �뙆�듃�꼫�젙蹂� �븯�쐞�씠�뒋 �긽�냽
+        List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
+        if (issueForm.getInheritYn() != null && issueForm.getInheritYn()
+                && downIssues != null && downIssues.size() > 0) {
+            for (Issue downIssue : downIssues) {
+                this.inheritPartners(downIssue, issue);
+            }
+        }
+
         //  �씠�뒋 �씠�젰 �벑濡�
         if (!StringUtils.isEmpty(detectIssueChange.toString())) {
             this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.MODIFY, detectIssueChange.toString());
@@ -2818,8 +2864,16 @@
 
         for (IssueVo issueVo : issueVos) {
             for (Map<String, Object> issueCustomFieldValue : issueCustomFieldValues) {
+                int count = 0;
+                Map<String, Object> useValues = new HashMap<>();
+
                 if (issueVo.getId().equals(MapUtil.getLong(issueCustomFieldValue, "issueId"))) {
                     IssueCustomFieldValueVo issueCustomFieldValueVo = new IssueCustomFieldValueVo();
+
+                    useValues.put("useValue"+count, MapUtil.getString(issueCustomFieldValue, "useValue"));
+                    useValues.put("customFieldId", MapUtil.getLong(issueCustomFieldValue, "customFieldId"));
+                    issueCustomFieldValueVo.setUseValues(useValues);
+
                     issueCustomFieldValueVo.setUseValue(MapUtil.getString(issueCustomFieldValue, "useValue"));
 
                     CustomFieldVo customFieldVo = new CustomFieldVo();
@@ -3106,7 +3160,7 @@
                 //  1踰� �뿤�뜑遺��꽣 �뜲�씠�꽣 �쁺�뿭
                 if (rowIndex > 1) {
                     //  �씠�뒋濡� �벑濡앺븯湲� �쐞�빐 IssueForm �뿉 �뜲�씠�꽣瑜� �뀑�똿�븳�떎.
-                    IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, departmentMaps, customFieldMaps,
+                    IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, customFieldMaps,
                             companyFieldMaps, ispFieldMaps, hostingFieldMaps, headers);
                     ConvertUtil.copyProperties(issueForm, newIssueForm);
 
@@ -3147,6 +3201,11 @@
 
                 issue = this.issueRepository.saveAndFlush(issue);
 
+                if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && issue.getParentIssue() != null) {
+                    //  �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽
+                    this.inheritPartners(issue, issue.getParentIssue());
+                }
+
                 saveIssueForm.setId(issue.getId());
 
                 IssueDepartment issueDepartment = new IssueDepartment();
@@ -3177,7 +3236,7 @@
             //  �씠�뒋 �떞�떦�옄 踰뚰겕 �벑濡�
             this.bulkInsertIssueAssignee(issueForms, workspace);
             //  0.361 - 0.705
-            
+
             //  1.816
             /*StopWatch serviceStart = new StopWatch();
             serviceStart.start();*/
@@ -3215,7 +3274,7 @@
                 issueCompany.setCompanyField(companyField);
                 issueCompany.setIssue(issue);
                 this.issueCompanyRepository.saveAndFlush(issueCompany);
-                
+
                 //  �궗�슜�옄媛� ISP瑜� 吏곸젒 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 �뾽泥댁뿉 �벑濡앸릺�뼱�엳�뒗 ISP �꽕�젙 
                 if (issueForm.getIssueIspFields() == null || issueForm.getIssueIspFields().size() < 1) {
                     //  �뾽泥댁쓽 ISP媛� �엳�뒗 寃쎌슦 issueISP �벑濡�
@@ -3359,7 +3418,7 @@
                 issueCustomField.put("registerId", this.webAppUtil.getLoginId());
                 issueCustomFieldValueMaps.add(issueCustomField);
             }
-            
+
             //  �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린
             if (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) {
                 // 媛숈� �룄硫붿씤 �뾽泥� 李얘린
@@ -3450,51 +3509,93 @@
     }
 
     /**
+     * cell String�쑝濡� 蹂��솚 �븿�닔
+     * @param cell Cell
+     * @param isNull boolean
+     * @return String
+     */
+    private String stringToCell (Cell cell, boolean isNull) {
+        String cellStr = "";
+        if (!isNull) {
+            cellStr = CommonUtil.convertExcelStringToCell(cell);
+            //  怨듬갚 �젣嫄�
+            cell.setCellValue(cellStr.trim());
+        } else {
+            cell.setCellValue(cellStr);
+        }
+        return cellStr;
+    }
+
+    /**
      * cell NULL 泥댄겕 �븿�닔
+     * 鍮� 媛믪씠 �븘�땶 cell 泥댄겕
      * @param cell Cell
      * @return boolean
      */
     private Boolean cellNullCheck (Cell cell) {
-        return cell != null && cell.getStringCellValue() != null && !cell.getStringCellValue().equals("") && cell.getCellType() != Cell.CELL_TYPE_BLANK;
+        int cellType = cell.getCellType();
+        if (cellType < Cell.CELL_TYPE_BLANK) {
+            if (cellType == Cell.CELL_TYPE_STRING) {
+                if (cell.getStringCellValue() != null && !cell.getStringCellValue().equals("")) {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        }
+        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) {
+                                               Map<String, Severity> severityMaps, Map<String, CustomField> customFieldMaps,
+                                               Map<String, CompanyField> companyFieldMaps, Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps,
+                                               List<String> headers) throws ParseException {
         IssueForm issueForm = new IssueForm();
         issueForm.setRegisterId(this.webAppUtil.getLoginId());
-        Project project = null;
 
         //  �젣紐�, �궡�슜, �봽濡쒖젥�듃 �궎, �씠�뒋 ���엯, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, �떆�옉�씪, 醫낅즺�씪, �궗�슜�옄 �젙�쓽 �븘�뱶
         for (int cellIndex = 0; cellIndex < headers.size(); cellIndex++) {
             Cell cell = row.getCell(cellIndex);
+
+            String cellStr = "";
+            boolean isNull = true;
+
+            if (cell != null) {
+                isNull = cellNullCheck(cell);
+                cellStr = stringToCell(cell, isNull); //cell�쓣 String�쑝濡� 蹂��솚
+            }
+
             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)) {
-                        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 �뿉 ���옣�븳�떎.
@@ -3502,47 +3603,37 @@
                     break;*/
                 case 4:
                     //  �떆�옉�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell)) {
-                        this.setIssueFormPeriod(cell, issueForm, true, rowIndex);
-                    }
+                    this.setIssueFormPeriod(cellStr, issueForm, true, rowIndex, isNull);
                     break;
                 case 5:
                     //  醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell)) {
-                        this.setIssueFormPeriod(cell, issueForm, false, rowIndex);
-                    }
+                    this.setIssueFormPeriod(cellStr, issueForm, false, rowIndex, isNull);
                     break;
                 case 6:
                     //  �뾽泥대�� IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell)) {
-                        this.setIssueFormCompanyField(cell, companyFieldMaps, issueForm, rowIndex);
-                    }
+                    this.setIssueFormCompanyField(cellStr, companyFieldMaps, issueForm, rowIndex);
                     break;
                 case 7:
                     //  ISP瑜� IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell)) {
-                        this.setIssueFormIspField(cell, ispFieldMaps, issueForm, rowIndex);
-                    }
+                    this.setIssueFormIspField(cellStr, ispFieldMaps, issueForm, rowIndex);
                     break;
                 case 8:
                     //  �샇�뒪�똿�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cellNullCheck(cell)) {
-                        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));
@@ -3552,10 +3643,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));
@@ -3565,10 +3656,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));
@@ -3579,14 +3670,7 @@
     }
 
     //  �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormTitle(Cell cell, IssueForm issueForm, int rowIndex) {
-        if (cell == null) {
-            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);
@@ -3627,13 +3711,8 @@
 
 
     //  �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormPriority(Cell cell, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) {
-        if (cell == null) {
-            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(
@@ -3644,13 +3723,8 @@
     }
 
     //  以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormSeverity(Cell cell, Map<String, Severity> severityMaps, IssueForm issueForm, int rowIndex) {
-        if (cell == null) {
-            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(
@@ -3676,20 +3750,11 @@
         }
     }
     //  �떆�옉�씪, 醫낅즺�씪�쓣 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;
-            }
-
-            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));
             }
@@ -3699,101 +3764,121 @@
             } else {
                 issueForm.setCompleteDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd"));
 
+                //  醫낅즺�씪留� �엯�젰 �뻽�쓣 寃쎌슦
+                if (issueForm.getCompleteDate() != null && issueForm.getStartDate() == null) {
+                    throw new OwlRuntimeException(
+                            this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY_EMPTY_START, rowIndex));
+                }
+
                 try {
                     //  �궇吏� �쑀�슚�꽦 泥댄겕
                     this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate());
                 } catch (OwlRuntimeException e) {
                     throw new OwlRuntimeException(
-                            this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY, rowIndex));
+                            this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALID, rowIndex));
                 }
             }
         }
     }
 
     //  �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� 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));
+                }
+
+                //DATETIME�씪 寃쎌슦 format 蹂�寃�
+                if (customField.getCustomFieldType() == DATETIME) {
+                    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 蹂�寃�
-                        Date date = cell.getDateCellValue();
-                        cellValue = new SimpleDateFormat("yyyy-MM-dd H:mm:ss").format(date);
+                //IP_ADDRESS�씪 寃쎌슦 �젙洹쒗몴�쁽�떇 泥댄겕
+                if (customField.getCustomFieldType() == IP_ADDRESS) {
+                    String regExp = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
+                            + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
+                            + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
+                            + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
+
+                    if (!cellValue.matches(regExp)) {
+                        throw new OwlRuntimeException(
+                                this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_IP_ADDRESS_NOT_VALIDITY, rowIndex));
                     }
+                }
 
-                    issueCustomFieldMap.put("customFieldId", customField.getId());
-                    issueCustomFieldMap.put("useValue", cellValue);
-                    issueForm.addIssueCustomFields(issueCustomFieldMap);
-                    break;
-                case SINGLE_SELECT:
-                    //  媛� �쑀�슚�꽦 泥댄겕
+                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;
+                    }
+                }
+
+                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;
         }
     }
 
@@ -4107,11 +4192,71 @@
                 this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
                 issue.setParentIssue(null);
             }
+
+            if (issueDownForm.getInheritYn() != null && issueDownForm.getInheritYn() && issue.getParentIssue() != null) {
+                //  �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽諛쏄린
+                issue = this.inheritPartners(issue, parentIssue);
+            }
+
             this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�)
             this.issueRepository.saveAndFlush(issue);
         }
     }
 
+    /**
+     * �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽諛쏄린
+     * @param issue Issue
+     * @param parentIssue Issue
+     * @return Issue
+     */
+    private Issue inheritPartners(Issue issue, Issue parentIssue) {
+        if (parentIssue != null) {
+            if (parentIssue.getIssueType().getInheritPartners()) {
+                IssueCompany issueCompany = new IssueCompany();
+                IssueIsp issueIsp = new IssueIsp();
+                IssueHosting issueHosting = new IssueHosting();
+
+                if (parentIssue.getIssueCompanies() != null && parentIssue.getIssueCompanies().size() > 0) {
+                    issue.getIssueCompanies().clear();
+                    issue.getIssueCompanies().addAll(parentIssue.getIssueCompanies());
+                    Iterator<IssueCompany> itrCompany = issue.getIssueCompanies().iterator();
+                    ConvertUtil.copyProperties(itrCompany.next(), issueCompany, "id");
+                    issueCompany.setIssue(issue);
+                    issueCompany.setCompanyField(parentIssue.getIssueCompanies().iterator().next().getCompanyField());
+                    this.issueCompanyRepository.saveAndFlush(issueCompany);
+                } else {
+                    this.issueCompanyRepository.deleteByIssueId(issue.getId());
+                    this.issueCompanyRepository.flush();
+                }
+                if (parentIssue.getIssueIspFields() != null && parentIssue.getIssueIspFields().size() > 0) {
+                    issue.getIssueIspFields().clear();
+                    issue.getIssueIspFields().addAll(parentIssue.getIssueIspFields());
+                    Iterator<IssueIsp> itrIsp = issue.getIssueIspFields().iterator();
+                    ConvertUtil.copyProperties(itrIsp.next(), issueIsp, "id");
+                    issueIsp.setIssue(issue);
+                    issueIsp.setIspField(parentIssue.getIssueIspFields().iterator().next().getIspField());
+                    this.issueIspRepository.saveAndFlush(issueIsp);
+                } else {
+                    this.issueIspRepository.deleteByIssueId(issue.getId());
+                    this.issueIspRepository.flush();
+                }
+                if (parentIssue.getIssueHostingFields() != null && parentIssue.getIssueHostingFields().size() > 0) {
+                    issue.getIssueHostingFields().clear();
+                    issue.getIssueHostingFields().addAll(parentIssue.getIssueHostingFields());
+                    Iterator<IssueHosting> itrHosting = issue.getIssueHostingFields().iterator();
+                    ConvertUtil.copyProperties(itrHosting.next(), issueHosting, "id");
+                    issueHosting.setIssue(issue);
+                    issueHosting.setHostingField(parentIssue.getIssueHostingFields().iterator().next().getHostingField());
+                    this.issueHostingRepository.saveAndFlush(issueHosting);
+                } else {
+                    this.issueHostingRepository.deleteByIssueId(issue.getId());
+                    this.issueHostingRepository.flush();
+                }
+            }
+        }
+        return issue;
+    }
+
     @Override
     public void findPartner(Map<String, Object> resJsonData, Map<String, Object> params) {
         Long issueTypeId = MapUtil.getLong(params, "issueTypeId");

--
Gitblit v1.8.0