From 25e69beeac0e3939ba1873806710a18a5ec3091e Mon Sep 17 00:00:00 2001
From: 박지현 <jhpark@maprex.co.kr>
Date: 목, 03 3월 2022 17:49:56 +0900
Subject: [PATCH] Merge branch 'master' of http://maprex.iptime.org:9001/r/owl-kisa

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  347 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 234 insertions(+), 113 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 40f9cf2..e5c057b 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -47,11 +47,9 @@
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 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 {
@@ -311,7 +309,7 @@
                     issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId());
                 }
 
-                // 醫낅즺�긽�깭媛� �븘�땶 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
+                // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
                 List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
                 int size = issues.size();
                 if (size > 0) {
@@ -468,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) {
@@ -523,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));    //  媛� �봽濡쒖젥�듃�쓽 怨좎쑀 �씠�뒋 踰덊샇 �깮�꽦
@@ -540,6 +544,15 @@
         this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange);
         //  HOSTING �젙蹂� ���옣
         this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange);
+
+        if (issueForm.getParentIssueId() != null){
+            Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
+            if (issueForm.getIsApi().equals(Issue.IS_API_YES)
+                    || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) {
+                //  �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜
+                this.inheritPartners(issue, parentIssue);
+            }
+        }
 
         //  泥⑤� �뙆�씪 ���옣
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
@@ -577,15 +590,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();
 
         //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
@@ -649,6 +662,7 @@
         this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null);
         //  �씠�뒋 �쐞�뿕 愿�由� �깮�꽦
         this.issueRiskService.addIssueRisk(issue, project.getWorkspace());
+
         //  �쁺�냽�꽦 而⑦뀓�뒪�듃 鍮꾩슦湲�
         this.clear();
         //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
@@ -658,7 +672,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;
     }
 
     //  �뿰愿��씠�뒋瑜� �깮�꽦�븳�떎.
@@ -1270,6 +1299,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()));
         }
@@ -2121,6 +2153,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());
@@ -2832,8 +2873,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();
@@ -3085,6 +3134,9 @@
 
             Workbook workbook;
 
+            IssueType issueType = new IssueType();
+            Workflow workflow = new Workflow();
+
             workbook = WorkbookFactory.create(multipartFile.getInputStream());
             Sheet sheet = workbook.getSheetAt(0);
             int lastRowNum = sheet.getLastRowNum() + 1;
@@ -3120,10 +3172,19 @@
                 //  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);
 
+                    Project project = this.projectService.getProject(newIssueForm.getProjectId());
+                    Long issueNumber = this.issueNumberGeneratorService.generateIssueNumber(project);
+                    newIssueForm.setIssueNumber(issueNumber);
+
+                    issueType = this.issueTypeService.getIssueType(newIssueForm.getIssueTypeId());
+                    workflow = issueType.getWorkflow();
+                    IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(workflow);
+
+                    newIssueForm.setIssueStatusId(issueStatus.getId());
                     issueForms.add(newIssueForm);
                 }
             }
@@ -3133,53 +3194,28 @@
             }
             //  1.176
 
-
             //  �씠�뒋 �벑濡�
-//            this.issueMapper.insertBatch(issueForms);
+            this.issueMapper.insertBatch(issueForms);
 
             for (IssueForm saveIssueForm : issueForms) {
                 Issue issue = new Issue();
                 ConvertUtil.copyProperties(saveIssueForm, issue);
 
-                IssueType issueType = this.issueTypeService.getIssueType(saveIssueForm.getIssueTypeId());
-                Workflow workflow = issueType.getWorkflow();
-
-                Project project = this.projectService.getProject(saveIssueForm.getProjectId());
-                Long issueNumber = this.issueNumberGeneratorService.generateIssueNumber(project);
-
-                IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(workflow);
-
-                issue.setPriority(this.priorityService.getPriority(saveIssueForm.getPriorityId()));
-                issue.setSeverity(this.severityService.getSeverity(saveIssueForm.getSeverityId()));
-                issue.setIssueStatus(issueStatus);
-                issue.setIssueType(issueType);
-                issue.setProject(project);
-                issue.setIssueNumber(issueNumber);
-                if (saveIssueForm.getParentIssueId() != null && saveIssueForm.getParentIssueId() > -1) {
-                    issue.setParentIssue(this.getIssue(saveIssueForm.getParentIssueId()));
+                if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && issueForm.getParentIssueId() != null) {
+                    Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
+                    //  �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽
+                    this.inheritPartners(issue, parentIssue);
                 }
-
-                issue = this.issueRepository.saveAndFlush(issue);
 
                 saveIssueForm.setId(issue.getId());
-
-                IssueDepartment issueDepartment = new IssueDepartment();
-                issueDepartment.setIssue(issue);
-                issueDepartment.setWorkspace(workspace);
-
+                
+                //  �썙�겕�뵆濡쒖슦 ��湲� �긽�깭�쓽 遺��꽌 異붽�
                 List<Long> departmentsIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow);
                 if (departmentsIds != null && departmentsIds.size() > 0) {
-                    for (Long departmentId : departmentsIds) {
-                        issueDepartment.setDepartment(this.departmentService.getDepartment(departmentId));
-                    }
-                    issue.addIssueDepartment(issueDepartment);
+                    this.issueDepartmentService.add(departmentsIds, workspace, issue);
                 }
-
-                saveIssueForm.setIssueStatusId(issueStatus.getId());
-
                 this.setIssuePartners(saveIssueForm, issue);
             }
-
 
             //  0.416 - 0.439
 
@@ -3191,7 +3227,7 @@
             //  �씠�뒋 �떞�떦�옄 踰뚰겕 �벑濡�
             this.bulkInsertIssueAssignee(issueForms, workspace);
             //  0.361 - 0.705
-            
+
             //  1.816
             /*StopWatch serviceStart = new StopWatch();
             serviceStart.start();*/
@@ -3218,24 +3254,21 @@
      * @param issueForm IssueForm
      */
     private void setIssuePartners(IssueForm issueForm, Issue issue) {
-        IssueCompany issueCompany = new IssueCompany();
-        IssueIsp issueIsp = new IssueIsp();
-        IssueHosting issueHosting = new IssueHosting();
         //issueCompany �벑濡�
         if (issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) {
             for (Map<String, Object> issueCompanyMap : issueForm.getIssueCompanyFields()) {
                 CompanyField companyField =  ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class);
-                issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class, "id");
+                IssueCompany issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class, "id", "registerDate", "modifyDate");
                 issueCompany.setCompanyField(companyField);
                 issueCompany.setIssue(issue);
                 this.issueCompanyRepository.saveAndFlush(issueCompany);
-                
-                //  �궗�슜�옄媛� ISP瑜� 吏곸젒 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 �뾽泥댁뿉 �벑濡앸릺�뼱�엳�뒗 ISP �꽕�젙 
+
+                //  �궗�슜�옄媛� ISP瑜� 吏곸젒 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 �뾽泥댁뿉 �벑濡앸릺�뼱�엳�뒗 ISP �꽕�젙
                 if (issueForm.getIssueIspFields() == null || issueForm.getIssueIspFields().size() < 1) {
                     //  �뾽泥댁쓽 ISP媛� �엳�뒗 寃쎌슦 issueISP �벑濡�
                     if (companyField.getIspId() != null && companyField.getIspId() != -1) {
                         IspField ispField = this.ispFieldService.getIsp(companyField.getIspId());
-                        issueIsp = ConvertUtil.copyProperties(ispField, IssueIsp.class, "id");
+                        IssueIsp issueIsp = ConvertUtil.copyProperties(ispField, IssueIsp.class, "id", "registerDate", "modifyDate");
                         issueIsp.setIspField(ispField);
                         issueIsp.setIssue(issue);
                         this.issueIspRepository.saveAndFlush(issueIsp);
@@ -3246,7 +3279,7 @@
                     //  �뾽泥댁쓽 �샇�뒪�똿�씠 �엳�뒗 寃쎌슦 issueHosting �벑濡�
                     if (companyField.getHostingId() != null && companyField.getHostingId() != -1) {
                         HostingField hostingField = this.hostingFieldService.getHosting(companyField.getHostingId());
-                        issueHosting = ConvertUtil.copyProperties(hostingField, IssueHosting.class, "id");
+                        IssueHosting issueHosting = ConvertUtil.copyProperties(hostingField, IssueHosting.class, "id", "registerDate", "modifyDate");
                         issueHosting.setHostingField(hostingField);
                         issueHosting.setIssue(issue);
                         this.issueHostingRepository.saveAndFlush(issueHosting);
@@ -3257,7 +3290,7 @@
         //issueIsp �벑濡�
         if (issueForm.getIssueIspFields() != null && issueForm.getIssueIspFields().size() > 0) {
             for (Map<String, Object> issueIspMap : issueForm.getIssueIspFields()) {
-                issueIsp = ConvertUtil.convertMapToClass(issueIspMap, IssueIsp.class, "id");
+                IssueIsp issueIsp = ConvertUtil.convertMapToClass(issueIspMap, IssueIsp.class, "id", "registerDate", "modifyDate");
                 IspField ispField = ConvertUtil.convertMapToClass(issueIspMap, IspField.class);
                 issueIsp.setIspField(ispField);
                 issueIsp.setIssue(issue);
@@ -3267,7 +3300,7 @@
         //issueHosting �벑濡�
         if (issueForm.getIssueHostingFields() != null && issueForm.getIssueHostingFields().size() > 0) {
             for (Map<String, Object> issueHostingMap : issueForm.getIssueHostingFields()) {
-                issueHosting = ConvertUtil.convertMapToClass(issueHostingMap, IssueHosting.class, "id");
+                IssueHosting issueHosting = ConvertUtil.convertMapToClass(issueHostingMap, IssueHosting.class, "id", "registerDate", "modifyDate");
                 HostingField hostingField = ConvertUtil.convertMapToClass(issueHostingMap, HostingField.class);
                 issueHosting.setHostingField(hostingField);
                 issueHosting.setIssue(issue);
@@ -3373,45 +3406,53 @@
                 issueCustomField.put("registerId", this.webAppUtil.getLoginId());
                 issueCustomFieldValueMaps.add(issueCustomField);
             }
-            
-            //  �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린
-            if (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) {
-                // 媛숈� �룄硫붿씤 �뾽泥� 李얘린
-                IssueForm partners = this.findCompanyField(issueForm);
-                Issue issue = this.findOne(issueForm.getId());
-                if (partners.getIssueCompanyFields() != null && partners.getIssueCompanyFields().size() > 0) {
-                    for (Map<String, Object> company : partners.getIssueCompanyFields()) {
-                        IssueCompany issueCompany = ConvertUtil.convertMapToClass(company, IssueCompany.class);
-                        CompanyField companyField = ConvertUtil.convertMapToClass(company, CompanyField.class);
-                        issueCompany.setCompanyField(companyField);
-                        issueCompany.setIssue(issue);
 
-                        this.issueCompanyRepository.saveAndFlush(issueCompany);
-                    }
-                }
-                if (partners.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) {
-                    for (Map<String, Object> isp : partners.getIssueIspFields()) {
-                        IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class);
-                        IspField ispField = ConvertUtil.convertMapToClass(isp, IspField.class);
-                        issueIsp.setIspField(ispField);
-                        issueIsp.setIssue(issue);
-                        this.issueIspRepository.saveAndFlush(issueIsp);
-                    }
-                }
-                if (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) {
-                    for (Map<String, Object> hosting : partners.getIssueHostingFields()) {
-                        IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class);
-                        HostingField hostingField = ConvertUtil.convertMapToClass(hosting, HostingField.class);
-                        issueHosting.setHostingField(hostingField);
-                        issueHosting.setIssue(issue);
-                        this.issueHostingRepository.saveAndFlush(issueHosting);
-                    }
-                }
-            }
+            //  �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+            this.findPartnerByDomain(issueForm);
         }
 
         if (issueCustomFieldValueMaps.size() > 0) {
             this.issueMapper.insertIssueCustomFieldValueBatch(issueCustomFieldValueMaps);
+        }
+    }
+
+    /**
+     * �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+     * @param issueForm IssueForm
+     */
+    private void findPartnerByDomain(IssueForm issueForm) {
+        if (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) {
+            // 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+            IssueForm partners = this.findCompanyField(issueForm);
+            Issue issue = this.findOne(issueForm.getId());
+            if (partners.getIssueCompanyFields() != null && partners.getIssueCompanyFields().size() > 0) {
+                for (Map<String, Object> company : partners.getIssueCompanyFields()) {
+                    IssueCompany issueCompany = ConvertUtil.convertMapToClass(company, IssueCompany.class);
+                    CompanyField companyField = ConvertUtil.convertMapToClass(company, CompanyField.class);
+                    issueCompany.setCompanyField(companyField);
+                    issueCompany.setIssue(issue);
+
+                    this.issueCompanyRepository.saveAndFlush(issueCompany);
+                }
+            }
+            if (partners.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) {
+                for (Map<String, Object> isp : partners.getIssueIspFields()) {
+                    IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class);
+                    IspField ispField = ConvertUtil.convertMapToClass(isp, IspField.class);
+                    issueIsp.setIspField(ispField);
+                    issueIsp.setIssue(issue);
+                    this.issueIspRepository.saveAndFlush(issueIsp);
+                }
+            }
+            if (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) {
+                for (Map<String, Object> hosting : partners.getIssueHostingFields()) {
+                    IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class);
+                    HostingField hostingField = ConvertUtil.convertMapToClass(hosting, HostingField.class);
+                    issueHosting.setHostingField(hostingField);
+                    issueHosting.setIssue(issue);
+                    this.issueHostingRepository.saveAndFlush(issueHosting);
+                }
+            }
         }
     }
 
@@ -3464,55 +3505,61 @@
     }
 
     /**
+     * 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) {
-        if (cell != null ) {
-            int cellType = cell.getCellType();
-            if (cellType < Cell.CELL_TYPE_BLANK) {
-                if (cellType == Cell.CELL_TYPE_STRING)
-                {
-                    if (cell.getStringCellValue() != null) {
-                        return false;
-                    }
-                } else {
+        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,
+                                               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);
-            boolean isNull = cellNullCheck(cell);
 
             String cellStr = "";
+            boolean isNull = true;
 
-            if (!isNull) {
-                cellStr = CommonUtil.convertExcelStringToCell(cell);
-
-                //  怨듬갚 �젣嫄�
-                cell.setCellValue(cellStr.trim());
-            } else {
-                cell.setCellValue(cellStr);
+            if (cell != null) {
+                isNull = cellNullCheck(cell);
+                cellStr = stringToCell(cell, isNull); //cell�쓣 String�쑝濡� 蹂��솚
             }
 
             switch (cellIndex) {
@@ -3712,7 +3759,7 @@
                 issueForm.setStartDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd"));
             } else {
                 issueForm.setCompleteDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd"));
-                
+
                 //  醫낅즺�씪留� �엯�젰 �뻽�쓣 寃쎌슦
                 if (issueForm.getCompleteDate() != null && issueForm.getStartDate() == null) {
                     throw new OwlRuntimeException(
@@ -3759,11 +3806,25 @@
                             this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_TEXT_TYPE_MAX_LENGTH_OUT));
                 }
 
-                if (customField.getCustomFieldType() == DATETIME) { //DATETIME�씪 寃쎌슦 format 蹂�寃�
+                //DATETIME�씪 寃쎌슦 format 蹂�寃�
+                if (customField.getCustomFieldType() == DATETIME) {
                     Date date = DateUtil.convertStrToDate(cellValue);
                     if (date == null) {
                         throw new OwlRuntimeException(
                                 this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_DATETIME_NOT_DASH, rowIndex));
+                    }
+                }
+
+                //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));
                     }
                 }
 
@@ -4127,11 +4188,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