OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2022-01-12 3b019e5599dfb5d368f4e8fd50fb557f4679a645
업체/isp/호스팅 기능 개편
11개 파일 추가됨
34개 파일 변경됨
3194 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/constant/MsgConstants.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/CompanyField.java 60 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/CompanyFieldCategory.java 74 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/enumType/CompanyFieldCategoryType.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/CompanyFieldCategoryMapper.java 22 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/CompanyFieldCategoryRepository.java 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/CompanyFieldCategoryService.java 22 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldCategoryServiceImpl.java 96 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java 94 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java 18 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java 18 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/CompanyFieldCategoryVo.java 60 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java 91 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCategoryCondition.java 131 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/CompanyFieldCategoryController.java 44 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java 65 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/HostingFieldForm.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IspFieldForm.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/UsePartnerForm.java 18 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_3__insert_new_data.sql 7 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/companyField-template.xml 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/companyFieldCategory-template.xml 49 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/WEB-INF/i18n/code_ko_KR.properties 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/assets/styles/main.css 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-autocomplete-single/js-autocomplete-single.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 23 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js 209 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyFieldList.controller.js 50 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js 271 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js 96 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js 25 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js 135 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js 96 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js 25 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js 135 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/companyFieldCategory/companyFieldCategory.service.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/autoComplete.controller.js 92 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 5 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldAdd.html 340 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldModify.html 369 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldAdd.html 94 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldModify.html 95 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldAdd.html 92 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldModify.html 93 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -245,6 +245,8 @@
    public static final String EMAIL_TEMPLATE_NOT_EXIST = "EMAIL_TEMPLATE_NOT_EXIST"; //  이메일 템플릿을 찾을수 없습니다.
    public static final String PARENT_SECTOR_NOT_SELECT = "PARENT_SECTOR_NOT_SELECT";   // 업종(대분류)를 먼저 선택 해 주세요.
    /**
     * api 파라미터 오류(이슈타입)
     */
src/main/java/kr/wisestone/owl/domain/CompanyField.java
@@ -1,9 +1,6 @@
package kr.wisestone.owl.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@@ -21,6 +18,13 @@
    private String memo;
    private Long ispId;
    private Long hostingId;
    private Long companyTypeId;
    private Long parentSectorId;
    private Long childSectorId;
    private Long regionId;
    private Long statusId;
    private String statusName;
    public CompanyField() {}
@@ -95,4 +99,52 @@
    public void setHostingId(Long hostingId) {
        this.hostingId = hostingId;
    }
    public Long getCompanyTypeId() {
        return companyTypeId;
    }
    public void setCompanyTypeId(Long companyTypeId) {
        this.companyTypeId = companyTypeId;
    }
    public Long getParentSectorId() {
        return parentSectorId;
    }
    public void setParentSectorId(Long parentSectorId) {
        this.parentSectorId = parentSectorId;
    }
    public Long getChildSectorId() {
        return childSectorId;
    }
    public void setChildSectorId(Long childSectorId) {
        this.childSectorId = childSectorId;
    }
    public Long getRegionId() {
        return regionId;
    }
    public void setRegionId(Long regionId) {
        this.regionId = regionId;
    }
    public Long getStatusId() {
        return statusId;
    }
    public void setStatusId(Long statusId) {
        this.statusId = statusId;
    }
    public String getStatusName() {
        return statusName;
    }
    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
}
src/main/java/kr/wisestone/owl/domain/CompanyFieldCategory.java
New file
@@ -0,0 +1,74 @@
package kr.wisestone.owl.domain;
import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.Setter;
import kr.wisestone.owl.domain.enumType.CompanyFieldCategoryType;
import kr.wisestone.owl.domain.enumType.IssueStatusType;
import javax.persistence.*;
import java.io.Serializable;
@Entity
public class CompanyFieldCategory extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String typeCategory;
    private String parentId;
    private String useValue;
    private String description;
    @Enumerated(EnumType.STRING)
    private CompanyFieldCategoryType companyFieldCategoryType;
    public CompanyFieldCategory() {}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getTypeCategory() {
        return typeCategory;
    }
    public void setTypeCategory(String typeCategory) {
        this.typeCategory = typeCategory;
    }
    public String getParentId() {
        return parentId;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    public String getUseValue() {
        return useValue;
    }
    public void setUseValue(String useValue) {
        this.useValue = useValue;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public CompanyFieldCategoryType getCompanyFieldCategoryType() {
        return companyFieldCategoryType;
    }
    public void setCompanyFieldCategoryType(CompanyFieldCategoryType companyFieldCategoryType) {
        this.companyFieldCategoryType = companyFieldCategoryType;
    }
}
src/main/java/kr/wisestone/owl/domain/enumType/CompanyFieldCategoryType.java
New file
@@ -0,0 +1,12 @@
package kr.wisestone.owl.domain.enumType;
/**
 * Created by wisestone on 2018-03-09.
 */
public enum CompanyFieldCategoryType {
    COMPANYTYPE,
    PARENTSECTOR,
    CHILDSECTOR,
    REGION,
    STATUS
}
src/main/java/kr/wisestone/owl/mapper/CompanyFieldCategoryMapper.java
New file
@@ -0,0 +1,22 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.domain.CompanyFieldCategory;
import kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-02-26.
 */
@Repository
public interface CompanyFieldCategoryMapper {
    List<Map<String, Object>> find(CompanyFieldCategoryCondition companyFieldCategoryCondition);
    Long count(CompanyFieldCategoryCondition companyFieldCategoryCondition);
    CompanyFieldCategory findById(Long id);
}
src/main/java/kr/wisestone/owl/repository/CompanyFieldCategoryRepository.java
New file
@@ -0,0 +1,10 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.CompanyField;
import kr.wisestone.owl.domain.CompanyFieldCategory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
public interface CompanyFieldCategoryRepository extends JpaRepository<CompanyFieldCategory, Long> {
}
src/main/java/kr/wisestone/owl/service/CompanyFieldCategoryService.java
New file
@@ -0,0 +1,22 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.CompanyField;
import kr.wisestone.owl.domain.CompanyFieldCategory;
import kr.wisestone.owl.vo.CompanyFieldCategoryVo;
import kr.wisestone.owl.vo.CompanyFieldVo;
import kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import kr.wisestone.owl.web.form.CompanyFieldForm;
import org.springframework.data.domain.Pageable;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface CompanyFieldCategoryService {
    List<CompanyFieldCategoryVo> find(Map<String, Object> resJsonData, CompanyFieldCategoryCondition condition, Pageable pageable);
    CompanyFieldCategory find(Long id);
}
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldCategoryServiceImpl.java
New file
@@ -0,0 +1,96 @@
package kr.wisestone.owl.service.impl;
import com.google.common.collect.Lists;
import kr.wisestone.owl.common.ExcelConditionCheck;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.constant.MsgConstants;
import kr.wisestone.owl.domain.CompanyField;
import kr.wisestone.owl.domain.CompanyFieldCategory;
import kr.wisestone.owl.domain.HostingField;
import kr.wisestone.owl.domain.IspField;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.mapper.CompanyFieldCategoryMapper;
import kr.wisestone.owl.mapper.CompanyFieldMapper;
import kr.wisestone.owl.repository.CompanyFieldCategoryRepository;
import kr.wisestone.owl.repository.CompanyFieldRepository;
import kr.wisestone.owl.repository.HostingFieldRepository;
import kr.wisestone.owl.repository.IspFieldRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.vo.*;
import kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import kr.wisestone.owl.web.condition.HostingFieldCondition;
import kr.wisestone.owl.web.form.CompanyFieldForm;
import kr.wisestone.owl.web.view.ExcelView;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CompanyFieldCategoryServiceImpl extends AbstractServiceImpl<CompanyFieldCategory, Long, JpaRepository<CompanyFieldCategory, Long>> implements CompanyFieldCategoryService {
    @Autowired
    private CompanyFieldCategoryRepository companyFieldCategoryRepository;
    @Autowired
    private CompanyFieldCategoryMapper companyFieldCategoryMapper;
    @Override
    protected JpaRepository<CompanyFieldCategory, Long> getRepository() {
        return this.companyFieldCategoryRepository;
    }
    @Override
    public List<CompanyFieldCategoryVo> find(Map<String, Object> resJsonData, CompanyFieldCategoryCondition condition, Pageable pageable) {
        condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
        condition.setPageSize(pageable.getPageSize());
        List<Map<String, Object>> results = Lists.newArrayList();
        Long totalCount = 0L;
        if (condition.getTypeCategory() != null && !condition.getTypeCategory().equals(""))  {
            if(condition.getTypeCategory().equals("CHILDSECTOR")
                    && (condition.getParentId() == null || condition.getParentId().equals(""))){
                throw new OwlRuntimeException(
                        this.messageAccessor.getMessage(MsgConstants.PARENT_SECTOR_NOT_SELECT));
            }
            results = this.companyFieldCategoryMapper.find(condition);
            totalCount = this.companyFieldCategoryMapper.count(condition);
        }
        return this.convertCompanyFieldCategoryVoToMap(results, totalCount, pageable, resJsonData);
    }
    public CompanyFieldCategory find(Long id) {
        return this.companyFieldCategoryMapper.findById(id);
    }
    //  검색 결과를 Vo 로 변환한다.
    private List<CompanyFieldCategoryVo> convertCompanyFieldCategoryVoToMap(List<Map<String, Object>> results, Long totalCount, Pageable pageable, Map<String, Object> resJsonData) {
        List<CompanyFieldCategoryVo> companyFieldCategoryVos = Lists.newArrayList();
        for (Map<String, Object> result : results) {
            CompanyFieldCategoryVo companyFieldCategoryVo = ConvertUtil.convertMapToClass(result, CompanyFieldCategoryVo.class);
            companyFieldCategoryVos.add(companyFieldCategoryVo);
        }
        int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
        resJsonData.put(Constants.RES_KEY_CONTENTS, companyFieldCategoryVos);
        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
                totalPage, totalCount));
        return companyFieldCategoryVos;
    }
}
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -4,6 +4,8 @@
import kr.wisestone.owl.repository.HostingFieldRepository;
import kr.wisestone.owl.repository.IspFieldRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.CommonUtil;
import kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import kr.wisestone.owl.web.form.CompanyFieldForm;
import org.apache.commons.lang3.StringUtils;
@@ -26,10 +28,7 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
@Service
public class CompanyFieldServiceImpl extends AbstractServiceImpl<CompanyField, Long, JpaRepository<CompanyField, Long>> implements CompanyFieldService {
@@ -53,6 +52,9 @@
    private HostingFieldService hostingFieldService;
    @Autowired
    private CompanyFieldCategoryService companyFieldCategoryService;
    @Autowired
    private UserService userService;
    @Autowired
@@ -74,6 +76,15 @@
    public CompanyField addCompany(CompanyFieldForm companyFieldForm) {
        //  url 유효성 체크
        this.verifyUrl(companyFieldForm.getUrl(), null);
        if (companyFieldForm.getTelList() != null && companyFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(companyFieldForm.getTelList());
            companyFieldForm.setTel(Arrays.toString(tels));
        }
        if (companyFieldForm.getEmailList() != null && companyFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(companyFieldForm.getEmailList());
            companyFieldForm.setEmail(Arrays.toString(emails));
        }
        CompanyField companyField = ConvertUtil.copyProperties(companyFieldForm, CompanyField.class);
        companyFieldRepository.saveAndFlush(companyField);
@@ -131,15 +142,46 @@
        Long companyId = companyFieldCondition.getId();
        if (companyId != null) {
            CompanyField companyField = this.getCompany(companyId);
            if(companyField.getIspId() != null){
            if(companyField.getIspId() != null && companyField.getIspId() != -1){
                ispField = this.ispFieldRepository.getOne(companyField.getIspId());
            }
            if(companyField.getHostingId() != null){
            if(companyField.getHostingId() != null && companyField.getHostingId() != -1){
                hostingField = this.hostingFieldRepository.getOne(companyField.getHostingId());
            }
            companyFieldVo = ConvertUtil.copyProperties(companyField, CompanyFieldVo.class);
            ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class);
            hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class);
            if (companyField.getCompanyTypeId() != null && companyField.getCompanyTypeId() != -1) {
                CompanyFieldCategory companyType = this.companyFieldCategoryService.find(companyField.getCompanyTypeId());
                if (companyType != null) {
                    companyFieldVo.setCompanyTypeName(companyType.getUseValue());
                }
            }
            if (companyField.getParentSectorId() != null && companyField.getParentSectorId() != -1) {
                CompanyFieldCategory parentSector = this.companyFieldCategoryService.find(companyField.getParentSectorId());
                if (parentSector != null) {
                    companyFieldVo.setParentSectorName(parentSector.getUseValue());
                }
            }
            if (companyField.getChildSectorId() != null && companyField.getChildSectorId() != -1) {
                CompanyFieldCategory childSector = this.companyFieldCategoryService.find(companyField.getChildSectorId());
                if (childSector != null) {
                    companyFieldVo.setChildSectorName(childSector.getUseValue());
                }
            }
            if (companyField.getRegionId() != null && companyField.getRegionId() != -1) {
                CompanyFieldCategory region = this.companyFieldCategoryService.find(companyField.getRegionId());
                if (region != null) {
                    companyFieldVo.setRegionName(region.getUseValue());
                }
            }
            /*if (companyField.getStatusId() != null && companyField.getStatusId() != -1) {
                CompanyFieldCategory status = this.companyFieldCategoryService.find(companyField.getStatusId());
                if (status != null) {
                    companyFieldVo.setStatusName(status.getUseValue());
                }
            }*/
            companyFieldVo.setIspFieldVo(ispFieldVo);
            companyFieldVo.setHostingFieldVo(hostingFieldVo);
@@ -152,6 +194,15 @@
    public void modifyCompany(CompanyFieldForm companyFieldForm) {
        //  url 유효성 체크
        this.verifyUrl(companyFieldForm.getUrl(), companyFieldForm.getId());
        if (companyFieldForm.getTelList() != null && companyFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(companyFieldForm.getTelList());
            companyFieldForm.setTel(Arrays.toString(tels));
        }
        if (companyFieldForm.getEmailList() != null && companyFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(companyFieldForm.getEmailList());
            companyFieldForm.setEmail(Arrays.toString(emails));
        }
        CompanyField companyField = ConvertUtil.copyProperties(companyFieldForm, CompanyField.class);
        companyFieldRepository.saveAndFlush(companyField);
@@ -198,6 +249,11 @@
        excelInfo.addAttrInfos(new ExportExcelAttrVo("tel", this.messageAccessor.message("companyField.companyTel"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("email", this.messageAccessor.message("companyField.companyEmail"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("url", this.messageAccessor.message("companyField.companyUrl"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyTypeName", this.messageAccessor.message("companyField.companyTypeName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("parentSectorName", this.messageAccessor.message("companyField.parentSectorName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("childSectorName", this.messageAccessor.message("companyField.childSectorName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("regionName", this.messageAccessor.message("companyField.regionName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("statusName", this.messageAccessor.message("companyField.statusName"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("memo", this.messageAccessor.message("companyField.companyMemo"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.setDatas(companyFieldVos);
@@ -212,6 +268,32 @@
        for (Map<String, Object> result : results) {
            CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(result, CompanyFieldVo.class);
            if (companyFieldVo.getCompanyTypeId() != null && companyFieldVo.getCompanyTypeId() != -1) {
                CompanyFieldCategory companyType = this.companyFieldCategoryService.find(companyFieldVo.getCompanyTypeId());
                if (companyType != null) {
                    companyFieldVo.setCompanyTypeName(companyType.getUseValue());
                }
            }
            if (companyFieldVo.getParentSectorId() != null && companyFieldVo.getParentSectorId() != -1) {
                CompanyFieldCategory parentSector = this.companyFieldCategoryService.find(companyFieldVo.getParentSectorId());
                if (parentSector != null) {
                    companyFieldVo.setParentSectorName(parentSector.getUseValue());
                }
            }
            if (companyFieldVo.getChildSectorId() != null && companyFieldVo.getChildSectorId() != -1) {
                CompanyFieldCategory childSector = this.companyFieldCategoryService.find(companyFieldVo.getChildSectorId());
                if (childSector != null) {
                    companyFieldVo.setChildSectorName(childSector.getUseValue());
                }
            }
            if (companyFieldVo.getRegionId() != null && companyFieldVo.getRegionId() != -1) {
                CompanyFieldCategory region = this.companyFieldCategoryService.find(companyFieldVo.getRegionId());
                if (region != null) {
                    companyFieldVo.setRegionName(region.getUseValue());
                }
            }
            if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1){
                IspField ispField = this.ispFieldService.getIsp(companyFieldVo.getIspId());
                if(ispField != null){
src/main/java/kr/wisestone/owl/service/impl/HostingFieldServiceImpl.java
@@ -28,6 +28,7 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -58,6 +59,15 @@
    // Hosting 추가
    @Override
    public HostingField add(HostingFieldForm HostingFieldForm) {
        if (HostingFieldForm.getTelList() != null && HostingFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(HostingFieldForm.getTelList());
            HostingFieldForm.setTel(Arrays.toString(tels));
        }
        if (HostingFieldForm.getEmailList() != null && HostingFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(HostingFieldForm.getEmailList());
            HostingFieldForm.setEmail(Arrays.toString(emails));
        }
        HostingField hostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
        if (hostingField.getCode() != null && !hostingField.getCode().equals("")) {
            hostingFieldRepository.saveAndFlush(hostingField);
@@ -100,6 +110,14 @@
    // Hosting 정로를 수정한다.
    @Override
    public void modify(HostingFieldForm HostingFieldForm) {
        if (HostingFieldForm.getTelList() != null && HostingFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(HostingFieldForm.getTelList());
            HostingFieldForm.setTel(Arrays.toString(tels));
        }
        if (HostingFieldForm.getEmailList() != null && HostingFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(HostingFieldForm.getEmailList());
            HostingFieldForm.setEmail(Arrays.toString(emails));
        }
        HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
        hostingFieldRepository.saveAndFlush(HostingField);
    }
src/main/java/kr/wisestone/owl/service/impl/IspFieldServiceImpl.java
@@ -28,6 +28,7 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -58,6 +59,15 @@
    // Isp 추가
    @Override
    public IspField add(IspFieldForm IspFieldForm) {
        if (IspFieldForm.getTelList() != null && IspFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(IspFieldForm.getTelList());
            IspFieldForm.setTel(Arrays.toString(tels));
        }
        if (IspFieldForm.getEmailList() != null && IspFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(IspFieldForm.getEmailList());
            IspFieldForm.setEmail(Arrays.toString(emails));
        }
        IspField ispField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
        if (ispField.getCode() != null && !ispField.getCode().equals("")) {
            ispFieldRepository.saveAndFlush(ispField);
@@ -100,7 +110,13 @@
    // Isp 정로를 수정한다.
    @Override
    public void modify(IspFieldForm IspFieldForm) {
        if(IspFieldForm.getUrl() != null){
        if (IspFieldForm.getTelList() != null && IspFieldForm.getTelList().size() > 0) {
            String[] tels = ConvertUtil.ToArray(IspFieldForm.getTelList());
            IspFieldForm.setTel(Arrays.toString(tels));
        }
        if (IspFieldForm.getEmailList() != null && IspFieldForm.getEmailList().size() > 0) {
            String[] emails = ConvertUtil.ToArray(IspFieldForm.getEmailList());
            IspFieldForm.setEmail(Arrays.toString(emails));
        }
        IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
src/main/java/kr/wisestone/owl/vo/CompanyFieldCategoryVo.java
New file
@@ -0,0 +1,60 @@
package kr.wisestone.owl.vo;
public class CompanyFieldCategoryVo extends UsePartnerVo {
    private Long id;
    private String typeCategory;
    private String parentId;
    private String useValue;
    private String description;
    public CompanyFieldCategoryVo() {}
    public CompanyFieldCategoryVo(String typeCategory, String parentId, String useValue) {
        this.typeCategory = typeCategory;
        this.parentId = parentId;
        this.useValue = useValue;
    }
    @Override
    public Long getId() {
        return id;
    }
    @Override
    public void setId(Long id) {
        this.id = id;
    }
    public String getTypeCategory() {
        return typeCategory;
    }
    public void setTypeCategory(String typeCategory) {
        this.typeCategory = typeCategory;
    }
    public String getParentId() {
        return parentId;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    public String getUseValue() {
        return useValue;
    }
    public void setUseValue(String useValue) {
        this.useValue = useValue;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
src/main/java/kr/wisestone/owl/vo/CompanyFieldVo.java
@@ -14,6 +14,17 @@
    private Long ispId;
    private Long hostingId;
    private Long companyTypeId;
    private Long parentSectorId;
    private Long childSectorId;
    private Long regionId;
    private Long statusId;
    private String companyTypeName;
    private String parentSectorName;
    private String childSectorName;
    private String regionName;
    private String statusName;
    private IspFieldVo ispFieldVo;
    private HostingFieldVo hostingFieldVo;
@@ -98,4 +109,84 @@
    public void setHostingId(Long hostingId) {
        this.hostingId = hostingId;
    }
    public Long getCompanyTypeId() {
        return companyTypeId;
    }
    public void setCompanyTypeId(Long companyTypeId) {
        this.companyTypeId = companyTypeId;
    }
    public Long getParentSectorId() {
        return parentSectorId;
    }
    public void setParentSectorId(Long parentSectorId) {
        this.parentSectorId = parentSectorId;
    }
    public Long getChildSectorId() {
        return childSectorId;
    }
    public void setChildSectorId(Long childSectorId) {
        this.childSectorId = childSectorId;
    }
    public Long getRegionId() {
        return regionId;
    }
    public void setRegionId(Long regionId) {
        this.regionId = regionId;
    }
    public Long getStatusId() {
        return statusId;
    }
    public void setStatusId(Long statusId) {
        this.statusId = statusId;
    }
    public String getCompanyTypeName() {
        return companyTypeName;
    }
    public void setCompanyTypeName(String companyTypeName) {
        this.companyTypeName = companyTypeName;
    }
    public String getParentSectorName() {
        return parentSectorName;
    }
    public void setParentSectorName(String parentSectorName) {
        this.parentSectorName = parentSectorName;
    }
    public String getChildSectorName() {
        return childSectorName;
    }
    public void setChildSectorName(String childSectorName) {
        this.childSectorName = childSectorName;
    }
    public String getRegionName() {
        return regionName;
    }
    public void setRegionName(String regionName) {
        this.regionName = regionName;
    }
    public String getStatusName() {
        return statusName;
    }
    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
}
src/main/java/kr/wisestone/owl/web/condition/CompanyFieldCategoryCondition.java
New file
@@ -0,0 +1,131 @@
package kr.wisestone.owl.web.condition;
import kr.wisestone.owl.util.ConvertUtil;
import java.util.Map;
public class CompanyFieldCategoryCondition {
    private Long id;
    private String typeCategory;
    private String parentId;
    private String useValue;
    private String description;
    private Long companyTypeId;
    private Long parentSectorId;
    private Long childSectorId;
    private Long regionId;
    private Long statusId;
    private String statusName;
    private Integer Page;
    private Integer PageSize;
    public static CompanyFieldCategoryCondition make(Map<String, Object> companyFieldCategoryCondition) {
        return ConvertUtil.convertMapToClass(companyFieldCategoryCondition, CompanyFieldCategoryCondition.class);
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getTypeCategory() {
        return typeCategory;
    }
    public void setTypeCategory(String typeCategory) {
        this.typeCategory = typeCategory;
    }
    public String getParentId() {
        return parentId;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    public String getUseValue() {
        return useValue;
    }
    public void setUseValue(String useValue) {
        this.useValue = useValue;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Integer getPage() {
        return Page;
    }
    public void setPage(Integer page) {
        Page = page;
    }
    public Integer getPageSize() {
        return PageSize;
    }
    public void setPageSize(Integer pageSize) {
        PageSize = pageSize;
    }
    public Long getCompanyTypeId() {
        return companyTypeId;
    }
    public void setCompanyTypeId(Long companyTypeId) {
        this.companyTypeId = companyTypeId;
    }
    public Long getParentSectorId() {
        return parentSectorId;
    }
    public void setParentSectorId(Long parentSectorId) {
        this.parentSectorId = parentSectorId;
    }
    public Long getChildSectorId() {
        return childSectorId;
    }
    public void setChildSectorId(Long childSectorId) {
        this.childSectorId = childSectorId;
    }
    public Long getRegionId() {
        return regionId;
    }
    public void setRegionId(Long regionId) {
        this.regionId = regionId;
    }
    public Long getStatusId() {
        return statusId;
    }
    public void setStatusId(Long statusId) {
        this.statusId = statusId;
    }
    public String getStatusName() {
        return statusName;
    }
    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
}
src/main/java/kr/wisestone/owl/web/controller/CompanyFieldCategoryController.java
New file
@@ -0,0 +1,44 @@
package kr.wisestone.owl.web.controller;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.service.CompanyFieldCategoryService;
import kr.wisestone.owl.service.CompanyFieldService;
import kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import kr.wisestone.owl.web.form.CompanyFieldForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Controller
public class CompanyFieldCategoryController extends BaseController{
    @Autowired
    private CompanyFieldCategoryService companyFieldCategoryService;
    // 기업구분 조회
    @RequestMapping(value = "/CompanyFieldCategory/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Pageable pageable = this.pageUtil.convertPageable(this.getPageVo(params));
        this.companyFieldCategoryService.find(resJsonData, CompanyFieldCategoryCondition.make(params.get(Constants.REQ_KEY_CONTENT)), pageable);
        return this.setSuccessMessage(resJsonData);
    }
}
src/main/java/kr/wisestone/owl/web/form/CompanyFieldForm.java
@@ -4,16 +4,23 @@
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class CompanyFieldForm extends UsePartnerForm {
    private String manager;
    private String tel;
    private String url;
    private String memo;
    private String tel;
    private Long ispId;
    private Long hostingId;
    private Long companyTypeId;
    private Long parentSectorId;
    private Long childSectorId;
    private Long regionId;
    private Long statusId;
    private String statusName;
    private List<Long> removeIds = Lists.newArrayList();
@@ -21,6 +28,14 @@
    }
    public static CompanyFieldForm make(Map<String, Object> params) {
        CompanyFieldForm form = ConvertUtil.convertMapToClass(params, CompanyFieldForm.class);
        if (MapUtil.getStrings(params, "tels") != null) {
            form.setTelList(MapUtil.getStrings(params, "tels"));
        }
        if (MapUtil.getStrings(params, "emails") != null) {
            form.setEmailList(MapUtil.getStrings(params, "emails"));
        }
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
@@ -83,4 +98,52 @@
    public void setRemoveIds(List<Long> removeIds) {
        this.removeIds = removeIds;
    }
    public Long getCompanyTypeId() {
        return companyTypeId;
    }
    public void setCompanyTypeId(Long companyTypeId) {
        this.companyTypeId = companyTypeId;
    }
    public Long getParentSectorId() {
        return parentSectorId;
    }
    public void setParentSectorId(Long parentSectorId) {
        this.parentSectorId = parentSectorId;
    }
    public Long getChildSectorId() {
        return childSectorId;
    }
    public void setChildSectorId(Long childSectorId) {
        this.childSectorId = childSectorId;
    }
    public Long getRegionId() {
        return regionId;
    }
    public void setRegionId(Long regionId) {
        this.regionId = regionId;
    }
    public Long getStatusId() {
        return statusId;
    }
    public void setStatusId(Long statusId) {
        this.statusId = statusId;
    }
    public String getStatusName() {
        return statusName;
    }
    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
}
src/main/java/kr/wisestone/owl/web/form/HostingFieldForm.java
@@ -20,6 +20,14 @@
    public static HostingFieldForm make(Map<String, Object> params) {
        HostingFieldForm form = ConvertUtil.convertMapToClass(params, HostingFieldForm.class);
        if (MapUtil.getStrings(params, "tels") != null) {
            form.setTelList(MapUtil.getStrings(params, "tels"));
        }
        if (MapUtil.getStrings(params, "emails") != null) {
            form.setEmailList(MapUtil.getStrings(params, "emails"));
        }
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
        }
src/main/java/kr/wisestone/owl/web/form/IspFieldForm.java
@@ -20,6 +20,14 @@
    public static IspFieldForm make(Map<String, Object> params) {
        IspFieldForm form = ConvertUtil.convertMapToClass(params, IspFieldForm.class);
        if (MapUtil.getStrings(params, "tels") != null) {
            form.setTelList(MapUtil.getStrings(params, "tels"));
        }
        if (MapUtil.getStrings(params, "emails") != null) {
            form.setEmailList(MapUtil.getStrings(params, "emails"));
        }
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
        }
src/main/java/kr/wisestone/owl/web/form/UsePartnerForm.java
@@ -4,6 +4,7 @@
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -12,6 +13,8 @@
    private String name;
    private String email;
    private String emailTemplate;
    private List<String> telList = new ArrayList<>();
    private List<String> emailList = new ArrayList<>();
    public UsePartnerForm() {
    }
@@ -53,4 +56,19 @@
        this.emailTemplate = emailTemplate;
    }
    public List<String> getTelList() {
        return telList;
    }
    public void setTelList(List<String> telList) {
        this.telList = telList;
    }
    public List<String> getEmailList() {
        return emailList;
    }
    public void setEmailList(List<String> emailList) {
        this.emailList = emailList;
    }
}
src/main/resources/migration/V1_3__insert_new_data.sql
@@ -152,4 +152,9 @@
ALTER TABLE `company_field` ADD COLUMN `parent_sector_id` bigint(11) NULL;
ALTER TABLE `company_field` ADD COLUMN `child_sector_id` bigint(11) NULL;
ALTER TABLE `company_field` ADD COLUMN `region_id` bigint(11) NULL;
ALTER TABLE `company_field` ADD COLUMN `status_id` bigint(11) NULL;
ALTER TABLE `company_field` ADD COLUMN `status_id` bigint(11) NULL;
ALTER TABLE `company_field` ADD COLUMN `status_name` varchar(50) NULL;
ALTER TABLE `company_field` MODIFY `tel` varchar(255);
ALTER TABLE `isp_field` MODIFY `tel` varchar(255);
ALTER TABLE `hosting_field` MODIFY `tel` varchar(255);
src/main/resources/mybatis/query-template/companyField-template.xml
@@ -13,7 +13,13 @@
        cf.url as url,
        cf.memo as memo,
        cf.isp_id as ispId,
        cf.hosting_id as hostingId
        cf.hosting_id as hostingId,
        cf.company_type_id as companyTypeId,
        cf.parent_sector_id as parentSectorId,
        cf.child_sector_id as childSectorId,
        cf.region_id as regionId,
        cf.status_id as statusId,
        cf.status_name as statusName
        FROM
        company_field cf
        WHERE 1=1
src/main/resources/mybatis/query-template/companyFieldCategory-template.xml
New file
@@ -0,0 +1,49 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.CompanyFieldCategoryMapper">
    <select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCategoryCondition">
        SELECT
        cfc.id as id,
        cfc.type_category as typeCategory,
        cfc.parent_id as parentId,
        cfc.use_value as useValue,
        cfc.description as description
        FROM
        company_field_category cfc
        WHERE cfc.type_category = #{typeCategory}
        AND cfc.use_value != "직접입력"
        <if test="parentId != '' and parentId != null">
            AND cfc.parent_id = #{parentId}
        </if>
        <if test="useValue != '' and useValue != null">
            AND cfc.use_value like CONCAT('%',#{useValue},'%')
        </if>
        ORDER BY cfc.id DESC
        <if test="pageSize != '' and pageSize != null">
            limit #{pageSize} offset #{page};
        </if>
    </select>
    <select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.CompanyFieldCondition">
        SELECT
        count(cfc.id)
        FROM
        company_field_category cfc
        WHERE cfc.type_category = #{typeCategory}
    </select>
    <select id="findById" resultType="kr.wisestone.owl.domain.CompanyFieldCategory" parameterType="java.lang.Long">
        SELECT
        cfc.id as id,
        cfc.type_category as typeCategory,
        cfc.parent_id as parentId,
        cfc.use_value as useValue,
        cfc.description as description
        FROM
        company_field_category cfc
        WHERE cfc.id = #{id}
    </select>
</mapper>
src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
@@ -141,6 +141,11 @@
companyField.companyTel=\uC804\uD654\uBC88\uD638
companyField.companyEmail=\uC774\uBA54\uC77C
companyField.companyUrl=url
companyField.companyTypeName=\uAE30\uC5C5\uAD6C\uBD84
companyField.parentSectorName=\uC5C5\uC885(\uB300\uBD84\uB958)
companyField.childSectorName=\uC5C5\uC885(\uC911\uBD84\uB958)
companyField.regionName=\uC9C0\uC5ED
companyField.statusName=\uC0C1\uD0DC
companyField.companyMemo=\uBE44\uACE0
isp.ispName=ISP \uC774\uB984
isp.ispCode=\uCF54\uB4DC
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -26,6 +26,7 @@
PROJECT_NOT_INCLUDE_USER = \uC120\uD0DD\uD55C \uB2F4\uB2F9\uC790 \uC911 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCC38\uC5EC\uD558\uACE0 \uC788\uC9C0 \uC54A\uC740 \uC0AC\uC6A9\uC790\uAC00 \uC788\uC2B5\uB2C8\uB2E4.
PROJECT_NOT_INCLUDE_DEPARTMENT = \uC120\uD0DD\uD55C \uBD80\uC11C \uC911 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCC38\uC5EC\uD558\uACE0 \uC788\uC9C0 \uC54A\uC740 \uBD80\uC11C\uAC00 \uC788\uC2B5\uB2C8\uB2E4.
PROJECT_USED_PROJECT_KEY = \uD504\uB85C\uC81D\uD2B8 \uD0A4\uAC00 \uC774\uBBF8 \uC0AC\uC6A9\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4.
PARENT_SECTOR_NOT_SELECT = \uC5C5\uC885(\uB300\uBD84\uB958)\uB97C \uBA3C\uC800 \uC120\uD0DD \uD574 \uC8FC\uC138\uC694.
PAYMENT_TYPE_NOT_EXIST = \uACB0\uC81C \uBC29\uC2DD\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
PAYMENT_NOT_EXIST = \uACB0\uC81C \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
src/main/webapp/assets/styles/main.css
@@ -28561,6 +28561,10 @@
    margin-top: 20px !important;
}
.mt-25 {
    margin-top: 25px !important;
}
.mt-30 {
    margin-top: 30px !important;
}
src/main/webapp/custom_components/js-autocomplete-single/js-autocomplete-single.js
@@ -158,7 +158,7 @@
                // 검색된 아이템 클릭시 입력 필드 포커스 주기
                function searchInputField() {
                    if ($scope.selectedModel.length > 0) {
                    if (angular.isDefined($scope.selectedModel) && $scope.selectedModel.length > 0) {
                        $($element).find(".input-tag-search-field-readonly").focus();
                    }
                }
src/main/webapp/i18n/ko/global.json
@@ -867,6 +867,7 @@
        "failedToProjectListLookUp": "프로젝트 목록 조회 실패",
        "failedToWorkflowListLookUp": "워크플로우 목록 조회 실패",
        "failedToIssueListLookUp": "이슈 목록 조회 실패",
        "failedToCompanyCategoryListLookUp": "업체 카테고리 목록 조회 실패",
        "title": "제목",
        "number": "번호",
        "m": "월",
@@ -882,6 +883,11 @@
        "emptyIsp": "선택할 수 있는 ISP가 없습니다.",
        "emptyHosting": "선택할 수 있는 HOSTING이 없습니다.",
        "emptyCustomField": "선택할 수 있는 사용자 정의 필드가 없습니다.",
        "emptyCompanyType": "선택할 수 있는 기업구분이 없습니다.",
        "emptyParentSector": "선택할 수 있는 업종(대분류)이 없습니다.",
        "emptyChildSector": "선택할 수 있는 업종(중분류)이 없습니다.",
        "emptyRegion": "선택할 수 있는 지역이 없습니다.",
        "emptyStatus": "선택할 수 있는 상태가 없습니다.",
        "department" : "부서",
        "level" : "사용자 등급",
        "manageDepartment": "부서 관리",
@@ -969,11 +975,16 @@
        "domain" : "도메인",
        "url"   : "url",
        "ipAdress" : "ip주소",
        "manager" : "담당자",
        "tel" : "전화번호",
        "tel" : "연락처",
        "code" : "코드",
        "email" : "이메일",
        "memo" : "비고",
        "companyType" : "기업구분",
        "parentSector" : "업종(대분류)",
        "childSector" : "업종(중분류)",
        "region" : "지역",
        "status" : "상태",
        "description" : "설명",
        "failedToSelectCompanyFieldFullList" : "업체 관리 목록 조회 실패",
        "delete" : "업체 삭제",
        "wantToDeleteSelectCompanyField" : "선택한 업체를 삭제하겠습니까? 삭제된 업체는 복구할 수 없습니다.",
@@ -981,7 +992,9 @@
        "failedToDetailCompanyFieldModify" : "업체 상세 정보 조회 실패",
        "pleaseEnterCompanyFieldName": "업체 이름을 입력하세요.",
        "enterSpecialCharacters": "업체 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidTelFormat": "전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요."
        "invalidTelFormat": "전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.",
        "writeCompanyTel": "전화번호를 입력해주세요.",
        "writeTel": "전화번호를 입력하셔야 추가할수 있습니다."
    },
    "ispField" : {
        "info": "ISP정보",
@@ -990,7 +1003,7 @@
        "name" : "ISP이름",
        "ispName" : "ISP명",
        "manager" : "담당자",
        "tel" : "전화번호",
        "tel" : "연락처",
        "code" : "코드",
        "email" : "이메일",
        "memo" : "비고",
@@ -1011,7 +1024,7 @@
        "manager" : "호스팅이름",
        "hostingName" : "호스팅명",
        "manager" : "담당자",
        "tel" : "전화번호",
        "tel" : "연락처",
        "code" : "코드",
        "email" : "이메일",
        "memo" : "비고",
src/main/webapp/scripts/app/companyField/companyFieldAdd.controller.js
@@ -7,15 +7,24 @@
        'app'
    ],
    function (app) {
        app.controller('companyFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'CompanyField', '$filter', '$injector','$controller',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, CompanyField, $filter, $injector, $controller) {
        app.controller('companyFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'CompanyField', 'CompanyFieldCategory', '$filter', '$injector','$controller',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, CompanyField, CompanyFieldCategory, $filter, $injector, $controller) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                    getIssueIspFieldListCallBack : getIssueIspFieldListCallBack,
                    getIssueHostingFieldListCallBack : getIssueHostingFieldListCallBack
                    getIssueHostingFieldListCallBack : getIssueHostingFieldListCallBack,
                    getCompanyTypeListCallBack : getCompanyTypeListCallBack,
                    getParentSectorListCallBack : getParentSectorListCallBack,
                    getChildSectorListCallBack : getChildSectorListCallBack,
                    getRegionListCallBack : getRegionListCallBack,
                    getStatusListCallBack : getStatusListCallBack,
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -29,7 +38,28 @@
                        tel : "",  //전화번호
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //비고
                        memo : "",  //비고
                        companyTypeId : "",
                        companyType : "", //기업구분
                        parentSectorId : "",
                        parentSector : "", //업종(대분류)
                        childSectorId : "",
                        childSector : "", //업종(중분류)
                        regionId : "",
                        region : "", //지역
                        statusId : "",
                        status : "", //상태
                        inputTels : [0], //연락처
                        tels : {},
                        inputMails : [0], //이메일
                        emails : {}
                    },
                    typeCategory : {
                        companyType : "COMPANYTYPE",
                        parentSector : "PARENTSECTOR",
                        childSector : "CHILDSECTOR",
                        region : "REGION",
                        status : "STATUS"
                    },
                    autoCompletePage : {
                        ispField : {
@@ -37,6 +67,26 @@
                            totalPage : 0
                        },
                        hostingField : {
                            page : 0,
                            totalPage : 0
                        },
                        companyType : {
                            page : 0,
                            totalPage : 0
                        },
                        parentSector : {
                            page : 0,
                            totalPage : 0
                        },
                        childSector : {
                            page : 0,
                            totalPage : 0
                        },
                        region : {
                            page : 0,
                            totalPage : 0
                        },
                        status : {
                            page : 0,
                            totalPage : 0
                        }
@@ -56,6 +106,31 @@
                    $scope.vm.autoCompletePage.hostingField.totalPage = result.data.page.totalPage;
                }
                // 기업구분 autocomplete page 업데이트
                function getCompanyTypeListCallBack(result) {
                    $scope.vm.autoCompletePage.companyType.totalPage = result.data.page.totalPage;
                }
                // 업종(대분류) autocomplete page 업데이트
                function getParentSectorListCallBack(result) {
                    $scope.vm.autoCompletePage.parentSector.totalPage = result.data.page.totalPage;
                }
                // 업종(중분류) 카테고리 autocomplete page 업데이트
                function getChildSectorListCallBack(result) {
                    $scope.vm.autoCompletePage.childSector.totalPage = result.data.page.totalPage;
                }
                // 지역 카테고리 autocomplete page 업데이트
                function getRegionListCallBack(result) {
                    $scope.vm.autoCompletePage.region.totalPage = result.data.page.totalPage;
                }
                // 상태 카테고리 autocomplete page 업데이트
                function getStatusListCallBack(result) {
                    $scope.vm.autoCompletePage.status.totalPage = result.data.page.totalPage;
                }
                //  폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
@@ -71,8 +146,6 @@
                $scope.$on("hostingFieldEvent", function (event, result) {
                    $scope.vm.form.hostingId = result[0].id;
                });
                //  폼 전송
                function formSubmit(condition) {
@@ -95,10 +168,80 @@
                            return hostingId;
                        })(),
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $scope.vm.form.url, // url
                        memo : $scope.vm.form.memo  //비고
                        memo : $scope.vm.form.memo,  //비고
                        companyTypeId : (function () {
                            var companyTypeId = -1;
                            if ($scope.vm.form.companyTypes != null) {
                                companyTypeId = $scope.vm.form.companyTypes[0].id;
                            }
                            return companyTypeId;
                        })(),
                        parentSectorId : (function () {
                            var parentSectorId = -1;
                            if ($scope.vm.form.parentSectors != null) {
                                parentSectorId = $scope.vm.form.parentSectors[0].id;
                            }
                            return parentSectorId;
                        })(),
                        childSectorId : (function () {
                            var childSectorId = -1;
                            if ($scope.vm.form.childSectors != null) {
                                childSectorId = $scope.vm.form.childSectors[0].id;
                            }
                            return childSectorId;
                        })(),
                        regionId : (function () {
                            var regionId = -1;
                            if ($scope.vm.form.regions != null) {
                                regionId = $scope.vm.form.regions[0].id;
                            }
                            return regionId;
                        })(),
                        statusId : (function () {
                            var statusId = -1;
                            if ($scope.vm.form.statuses != null) {
                                statusId = $scope.vm.form.statuses[0].id;
                            } else if ($scope.vm.form.status !== ""){
                                statusId = 120; //직접입력 일 경우
                            }
                            return statusId;
                        })(),
                        statusName : $scope.vm.form.status
                    };
                    CompanyField.add($resourceProvider.getContent(content,
@@ -118,6 +261,54 @@
                }
                // 연락처 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
src/main/webapp/scripts/app/companyField/companyFieldList.controller.js
@@ -97,6 +97,31 @@
                        .setDName("url")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.companyType")
                        .setHWidth("bold")
                        .setDName("companyTypeName")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.parentSector")
                        .setHWidth("bold")
                        .setDName("parentSectorName")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.childSector")
                        .setHWidth("bold")
                        .setDName("childSectorName")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.region")
                        .setHWidth("bold")
                        .setDName("regionName")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.status")
                        .setHWidth("bold")
                        .setDName("statusName")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("companyField.memo")
                        .setHWidth("bold")
                        .setDName("memo")
@@ -130,10 +155,27 @@
                            $scope.vm.page.selectedPage = currentPage + 1;
                            
                            // 전화번호 조회시 하이픈 추가 해서 조회
                            result.data.data.forEach(function (telData) {
                                let hyphen = telData.tel.trim();
                                let phone = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/,"$1-$2-$3");
                                telData.tel = phone;
                            result.data.data.forEach(function (data) {
                                if (data.tel != null && data.tel !== "") {
                                    var tels = data.tel.substr(1, data.tel.indexOf("]")-1);
                                    var telArr = tels.split(",");
                                    for (var i = 0; i < telArr.length; i++) {
                                        let hyphen = telArr[i].trim();
                                        telArr[i] = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/, "$1-$2-$3");
                                        if (telArr[i] === "") {
                                            telArr.splice(i,1);
                                        }
                                    }
                                    data.tel = telArr.join();
                                }
                            });
                            // 이메일 조회시 배열 형태 제거
                            result.data.data.forEach(function (data) {
                                if (data.email != null && data.email !== "") {
                                    data.email = data.email.substr(1, data.email.indexOf("]")-1);
                                }
                            });
                            $scope.vm.responseData = result.data;
src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
@@ -17,7 +17,16 @@
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                    getIssueIspFieldListCallBack : getIssueIspFieldListCallBack,
                    getIssueHostingFieldListCallBack : getIssueHostingFieldListCallBack
                    getIssueHostingFieldListCallBack : getIssueHostingFieldListCallBack,
                    getCompanyTypeListCallBack : getCompanyTypeListCallBack,
                    getParentSectorListCallBack : getParentSectorListCallBack,
                    getChildSectorListCallBack : getChildSectorListCallBack,
                    getRegionListCallBack : getRegionListCallBack,
                    getStatusListCallBack : getStatusListCallBack,
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -32,7 +41,28 @@
                        tel : "",  //전화번호
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //메모(비고)
                        memo : "",  //메모(비고)
                        companyTypeId : "",
                        companyType : "", //기업구분
                        parentSectorId : "",
                        parentSector : "", //업종(대분류)
                        childSectorId : "",
                        childSector : "", //업종(중분류)
                        regionId : "",
                        region : "", //지역
                        statusId : "",
                        status : "", //상태
                        inputTels : [0],
                        tels : {},
                        inputMails : [0],
                        emails : {}
                    },
                    typeCategory : {
                        companyType : "COMPANYTYPE",
                        parentSector : "PARENTSECTOR",
                        childSector : "CHILDSECTOR",
                        region : "REGION",
                        status : "STATUS"
                    },
                    autoCompletePage : {
                        ispField : {
@@ -40,6 +70,26 @@
                            totalPage : 0
                        },
                        hostingField : {
                            page : 0,
                            totalPage : 0
                        },
                        companyType : {
                            page : 0,
                            totalPage : 0
                        },
                        parentSector : {
                            page : 0,
                            totalPage : 0
                        },
                        childSector : {
                            page : 0,
                            totalPage : 0
                        },
                        region : {
                            page : 0,
                            totalPage : 0
                        },
                        status : {
                            page : 0,
                            totalPage : 0
                        }
@@ -57,6 +107,31 @@
                // 호스팅정보 autocomplete page 업데이트
                function getIssueHostingFieldListCallBack(result) {
                    $scope.vm.autoCompletePage.hostingField.totalPage = result.data.page.totalPage;
                }
                // 업체 카테고리 autocomplete page 업데이트
                function getCompanyTypeListCallBack(result) {
                    $scope.vm.autoCompletePage.companyType.totalPage = result.data.page.totalPage;
                }
                // 업체 카테고리 autocomplete page 업데이트
                function getParentSectorListCallBack(result) {
                    $scope.vm.autoCompletePage.parentSector.totalPage = result.data.page.totalPage;
                }
                // 업체 카테고리 autocomplete page 업데이트
                function getChildSectorListCallBack(result) {
                    $scope.vm.autoCompletePage.childSector.totalPage = result.data.page.totalPage;
                }
                // 업체 카테고리 autocomplete page 업데이트
                function getRegionListCallBack(result) {
                    $scope.vm.autoCompletePage.region.totalPage = result.data.page.totalPage;
                }
                // 업체 카테고리 autocomplete page 업데이트
                function getStatusListCallBack(result) {
                    $scope.vm.autoCompletePage.status.totalPage = result.data.page.totalPage;
                }
                // 폼 체크
@@ -86,23 +161,105 @@
                        name : $rootScope.preventXss($scope.vm.form.name),
                        ispId : (function () {  // ISP 아이디
                            var ispId = -1;
                            if ($scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0) {
                            if ($scope.vm.form.ispName !== "" && $scope.vm.form.ispId !== null && $scope.vm.form.ispId !== -1) {
                                ispId = $scope.vm.form.ispId;
                            }else if ($scope.vm.form.issueIspFields != null) {
                                ispId = $scope.vm.form.issueIspFields[0].id;
                            }
                            return ispId;
                        })(),
                        hostingId : (function () {  // Hosting 아이디
                            var hostingId = -1;
                            if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) {
                            if ($scope.vm.form.hostingName !== "" && $scope.vm.form.hostingId !== null && $scope.vm.form.hostingId !== -1) {
                                hostingId = $scope.vm.form.hostingId;
                            }else if ($scope.vm.form.issueHostingFields != null) {
                                hostingId = $scope.vm.form.issueHostingFields[0].id;
                            }
                            return hostingId;
                        })(),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $rootScope.preventXss($scope.vm.form.url), // url
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                        memo : $rootScope.preventXss($scope.vm.form.memo),
                        companyTypeId : (function () {
                            var companyTypeId = -1;
                            if ($scope.vm.form.companyType !== "" && $scope.vm.form.companyTypeId !== "" && $scope.vm.form.companyTypeId !== -1) {
                                companyTypeId = $scope.vm.form.companyTypeId;
                            }else if ($scope.vm.form.companyTypes != null) {
                                companyTypeId = $scope.vm.form.companyTypes[0].id;
                            }
                            return companyTypeId;
                        })(),
                        parentSectorId : (function () {
                            var parentSectorId = -1;
                            if ($scope.vm.form.parentSector !== "" && $scope.vm.form.parentSectorId !== "" && $scope.vm.form.parentSectorId !== -1) {
                                parentSectorId = $scope.vm.form.parentSectorId;
                            }else if ($scope.vm.form.parentSectors != null) {
                                parentSectorId = $scope.vm.form.parentSectors[0].id;
                            }
                            return parentSectorId;
                        })(),
                        childSectorId : (function () {
                            var childSectorId = -1;
                            if ($scope.vm.form.childSector !== "" && $scope.vm.form.childSectorId !== "" && $scope.vm.form.childSectorId !== -1) {
                                childSectorId = $scope.vm.form.childSectorId;
                            }else if ($scope.vm.form.childSectors != null) {
                                childSectorId = $scope.vm.form.childSectors[0].id;
                            }
                            return childSectorId;
                        })(),
                        regionId : (function () {
                            var regionId = -1;
                            if ($scope.vm.form.region !== "" && $scope.vm.form.regionId !== "" && $scope.vm.form.regionId !== -1) {
                                regionId = $scope.vm.form.regionId;
                            }else if ($scope.vm.form.regions != null) {
                                regionId = $scope.vm.form.regions[0].id;
                            }
                            return regionId;
                        })(),
                        statusId : (function () {
                            var statusId = -1;
                            if ($scope.vm.form.status !== "" && $scope.vm.form.statusId !== "" && $scope.vm.form.statusId !== -1) {
                                statusId = $scope.vm.form.statusId;
                            }else if ($scope.vm.form.statuses != null) {
                                statusId = $scope.vm.form.statuses[0].id;
                            }
                            return statusId;
                        })(),
                        statusName : $scope.vm.form.status
                    };
                    CompanyField.modify($resourceProvider.getContent(
@@ -111,7 +268,6 @@
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
@@ -122,6 +278,54 @@
                        $rootScope.spinner = false;
                    });
                }
                // 메일 주소 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = ""
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
@@ -144,18 +348,63 @@
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                            if (result.data.content != null) {
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                if (result.data.content.tel != null) {
                                    var inputTels = $scope.vm.form.inputTels;
                                    var tels = result.data.content.tel.substr(1, result.data.content.tel.indexOf("]")-1);
                                    var telArr = tels.split(", ");
                                    angular.forEach(telArr, function (tel) {
                                        inputTels.push(tel);
                                    });
                                    inputTels  = inputTels.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if (inputTels[0] === 0 || inputTels[0] === "") {
                                        inputTels.shift();
                                    }
                                    inputTels.push("");
                                    $scope.vm.form.tels = angular.copy(inputTels);
                                }
                                if (result.data.content.email != null) {
                                    var inputMails = $scope.vm.form.inputMails;
                                    var emails = result.data.content.email.substr(1, result.data.content.email.indexOf("]")-1);
                                    var emailArr = emails.split(", ");
                                    angular.forEach(emailArr, function (email) {
                                        inputMails.push(email);
                                    });
                                    inputMails  = inputMails.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if(inputMails[0] === 0 || inputMails[0] === "") { // 첫번째 배열은 공백으로
                                        inputMails.shift();
                                    }
                                    inputMails.push("");
                                    $scope.vm.form.emails = angular.copy(inputMails);
                                }
                                $scope.vm.form.url = result.data.content.url;
                                $scope.vm.form.memo = result.data.content.memo;
                                $scope.vm.form.companyTypeId = result.data.content.companyTypeId;
                                $scope.vm.form.companyType = result.data.content.companyTypeName;
                                $scope.vm.form.parentSectorId = result.data.content.parentSectorId;
                                $scope.vm.form.parentSector = result.data.content.parentSectorName;
                                $scope.vm.form.childSectorId = result.data.content.childSectorId;
                                $scope.vm.form.childSector = result.data.content.childSectorName;
                                $scope.vm.form.regionId = result.data.content.regionId;
                                $scope.vm.form.region = result.data.content.regionName;
                                $scope.vm.form.statusId = result.data.content.statusId;
                                $scope.vm.form.status = result.data.content.statusName;
                                if (result.data.content.ispFieldVo != null) {
                                    $scope.vm.form.ispId = result.data.content.ispFieldVo.id;
                                    $scope.vm.form.ispName = result.data.content.ispFieldVo.name;
                                }
                                if (result.data.content.hostingFieldVo != null) {
                                    $scope.vm.form.hostingId = result.data.content.hostingFieldVo.id;
                                    $scope.vm.form.hostingName = result.data.content.hostingFieldVo.name;
                                }
                            }
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js
@@ -13,7 +13,11 @@
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck   //  폼 체크
                    formCheck : formCheck,   //  폼 체크
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -24,7 +28,11 @@
                        tel : "",  //전화번호
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //비고
                        memo : "",  //비고
                        inputTels : [0], //연락처
                        tels : {},
                        inputMails : [0], //이메일
                        emails : {}
                    }
                };
@@ -44,8 +52,40 @@
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  호스팅명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $scope.vm.form.url, // url
                        memo : $scope.vm.form.memo  //비고
                    };
@@ -67,6 +107,54 @@
                }
                // 연락처 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js
@@ -129,10 +129,27 @@
                            $scope.vm.page.selectedPage = currentPage + 1;
                            // 전화번호 조회시 하이픈 추가 해서 조회
                            result.data.data.forEach(function (telDatas) {
                                let hyphen = telDatas.tel.trim();
                                let phone = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/,"$1-$2-$3");
                                telDatas.tel = phone;
                            result.data.data.forEach(function (data) {
                                if (data.tel != null && data.tel !== "") {
                                    var tels = data.tel.substr(1, data.tel.indexOf("]")-1);
                                    var telArr = tels.split(",");
                                    for (var i = 0; i < telArr.length; i++) {
                                        let hyphen = telArr[i].trim();
                                        telArr[i] = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/, "$1-$2-$3");
                                        if (telArr[i] === "") {
                                            telArr.splice(i,1);
                                        }
                                    }
                                    data.tel = telArr.join();
                                }
                            });
                            // 이메일 조회시 배열 형태 제거
                            result.data.data.forEach(function (data) {
                                if (data.email != null && data.email !== "") {
                                    data.email = data.email.substr(1, data.email.indexOf("]")-1);
                                }
                            });
                            $scope.vm.responseData = result.data;
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js
@@ -15,7 +15,11 @@
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck  //  폼 체크
                    formCheck : formCheck,  //  폼 체크
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -27,7 +31,11 @@
                        tel : "",  //전화번호
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //메모(비고)
                        memo : "",  //메모(비고)
                        inputTels : [0],
                        tels : {},
                        inputMails : [0],
                        emails : {}
                    }
                };
@@ -49,8 +57,40 @@
                        code : $rootScope.preventXss($scope.vm.form.code),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $rootScope.preventXss($scope.vm.form.url), // url
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
@@ -74,6 +114,54 @@
                }
                // 메일 주소 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = ""
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
@@ -94,12 +182,45 @@
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                            if (result.data.content != null) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                if (result.data.content.tel != null) {
                                    var inputTels = $scope.vm.form.inputTels;
                                    var tels = result.data.content.tel.substr(1, result.data.content.tel.indexOf("]")-1);
                                    var telArr = tels.split(", ");
                                    angular.forEach(telArr, function (tel) {
                                        inputTels.push(tel);
                                    });
                                    inputTels  = inputTels.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if (inputTels[0] === 0 || inputTels[0] === "") {
                                        inputTels.shift();
                                    }
                                    inputTels.push("");
                                    $scope.vm.form.tels = angular.copy(inputTels);
                                }
                                if (result.data.content.email != null) {
                                    var inputMails = $scope.vm.form.inputMails;
                                    var emails = result.data.content.email.substr(1, result.data.content.email.indexOf("]")-1);
                                    var emailArr = emails.split(", ");
                                    angular.forEach(emailArr, function (email) {
                                        inputMails.push(email);
                                    });
                                    inputMails  = inputMails.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if(inputMails[0] === 0 || inputMails[0] === "") { // 첫번째 배열은 공백으로
                                        inputMails.shift();
                                    }
                                    inputMails.push("");
                                    $scope.vm.form.emails = angular.copy(inputMails);
                                }
                                $scope.vm.form.url = result.data.content.url;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js
@@ -13,7 +13,11 @@
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck   //  폼 체크
                    formCheck : formCheck,   //  폼 체크
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -24,7 +28,11 @@
                        tel : "",  //전화번호
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //비고
                        memo : "",  //비고
                        inputTels : [0], //연락처
                        tels : {},
                        inputMails : [0], //이메일
                        emails : {}
                    }
                };
@@ -44,8 +52,40 @@
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  ISP명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $scope.vm.form.url, // url
                        memo : $scope.vm.form.memo  //비고
                    };
@@ -67,6 +107,54 @@
                }
                // 연락처 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js
@@ -129,10 +129,27 @@
                            $scope.vm.page.selectedPage = currentPage + 1;
                            // 전화번호 조회시 하이픈 추가 해서 조회
                            result.data.data.forEach(function (telData) {
                                let hyphen = telData.tel.trim();
                                let phone = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/,"$1-$2-$3");
                                telData.tel = phone
                            result.data.data.forEach(function (data) {
                                if (data.tel != null && data.tel !== "") {
                                    var tels = data.tel.substr(1, data.tel.indexOf("]")-1);
                                    var telArr = tels.split(",");
                                    for (var i = 0; i < telArr.length; i++) {
                                        let hyphen = telArr[i].trim();
                                        telArr[i] = hyphen.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/, "$1-$2-$3");
                                        if (telArr[i] === "") {
                                            telArr.splice(i,1);
                                        }
                                    }
                                    data.tel = telArr.join();
                                }
                            });
                            // 이메일 조회시 배열 형태 제거
                            result.data.data.forEach(function (data) {
                                if (data.email != null && data.email !== "") {
                                    data.email = data.email.substr(1, data.email.indexOf("]")-1);
                                }
                            });
                            $scope.vm.responseData = result.data;
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js
@@ -15,7 +15,11 @@
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck  //  폼 체크
                    formCheck : formCheck,  //  폼 체크
                    addTel : addTel,
                    addMail : addMail,
                    removeTelInput : removeTelInput,
                    removeMailInput : removeMailInput
                };
                $scope.vm = {
@@ -27,7 +31,11 @@
                        code : "",
                        email : "",  //이메일
                        url : "", // url
                        memo : ""  //메모(비고)
                        memo : "",  //메모(비고)
                        inputTels : [0],
                        tels : {},
                        inputMails : [0],
                        emails : {}
                    }
                };
@@ -48,8 +56,40 @@
                        code : $rootScope.preventXss($scope.vm.form.code),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        tels : (function () {
                            var telList = [];
                            if ($scope.vm.form.tels != null) {
                                angular.forEach($scope.vm.form.tels, function (tel) {
                                    telList.push(tel);
                                });
                                telList  = telList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                telList  = telList.filter(function(item, idx){
                                    return telList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return telList;
                        })(),
                        emails : (function () {
                            var emailList = [];
                            if ($scope.vm.form.emails != null) {
                                angular.forEach($scope.vm.form.emails, function (email) {
                                    emailList.push(email);
                                });
                                emailList  = emailList.filter(function(item) { //쓰레기 데이터 필터링
                                    return item !== null && item !== undefined && item !== '';
                                });
                                emailList  = emailList.filter(function(item, idx){
                                    return emailList.findIndex(function(item2, idx2){
                                        return item === item2
                                    }) == idx;
                                });
                            }
                            return emailList;
                        })(),
                        url : $rootScope.preventXss($scope.vm.form.url), // url
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
@@ -73,6 +113,54 @@
                }
                // 메일 주소 input 창 추가 버튼
                function addTel() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputTels.forEach(function (tel) {
                        if (!$rootScope.isDefined($scope.vm.form.tels[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputTels.push(index);
                        $scope.vm.form.tels[index] = "";
                    } else {
                        SweetAlert.warning($filter("translate")("companyField.writeCompanyTel"), $filter("translate")("companyField.writeTel")); // 추가버튼 경고
                    }
                }
                // 메일 주소 input 창 추가 버튼
                function addMail() {
                    var arrayFull = true;      // 배열이 가득 차 있는지 여부
                    var index = 0;
                    $scope.vm.form.inputMails.forEach(function (email) {
                        if (!$rootScope.isDefined($scope.vm.form.emails[index])) {
                            arrayFull = false;
                        }
                        index++;
                    });
                    if (arrayFull) {
                        $scope.vm.form.inputMails.push(index);
                        $scope.vm.form.emails[index] = ""
                    } else {
                        SweetAlert.warning($filter("translate")("issue.writeIssueMail"), $filter("translate")("issue.writeMail")); // 추가버튼 경고
                    }
                }
                // 연락처 input 삭제
                function removeTelInput(index) {
                    $scope.vm.form.inputTels.splice(index, 1);
                }
                // 이메일 주소 input 삭제
                function removeMailInput(index) {
                    $scope.vm.form.inputMails.splice(index, 1);
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
@@ -93,12 +181,45 @@
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                            if (result.data.content != null) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                if (result.data.content.tel != null) {
                                    var inputTels = $scope.vm.form.inputTels;
                                    var tels = result.data.content.tel.substr(1, result.data.content.tel.indexOf("]")-1);
                                    var telArr = tels.split(", ");
                                    angular.forEach(telArr, function (tel) {
                                        inputTels.push(tel);
                                    });
                                    inputTels  = inputTels.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if (inputTels[0] === 0 || inputTels[0] === "") {
                                        inputTels.shift();
                                    }
                                    inputTels.push("");
                                    $scope.vm.form.tels = angular.copy(inputTels);
                                }
                                if (result.data.content.email != null) {
                                    var inputMails = $scope.vm.form.inputMails;
                                    var emails = result.data.content.email.substr(1, result.data.content.email.indexOf("]")-1);
                                    var emailArr = emails.split(", ");
                                    angular.forEach(emailArr, function (email) {
                                        inputMails.push(email);
                                    });
                                    inputMails  = inputMails.filter(function(item) {
                                        return item !== null && item !== undefined && item !== '';
                                    });
                                    if(inputMails[0] === 0 || inputMails[0] === "") { // 첫번째 배열은 공백으로
                                        inputMails.shift();
                                    }
                                    inputMails.push("");
                                    $scope.vm.form.emails = angular.copy(inputMails);
                                }
                                $scope.vm.form.url = result.data.content.url;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
src/main/webapp/scripts/components/companyFieldCategory/companyFieldCategory.service.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by maprex on 2021-11-04
 */
'use strict';
define([
    'app'
], function (app) {
    app.factory("CompanyFieldCategory", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("CompanyFieldCategory/find", conditions).then(function (response) {
                    $log.debug("업체 카테고리 목록 데이터 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
});
src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -25,6 +25,7 @@
                var IssueType = $injector.get("IssueType");
                var IssueTypeCustomField = $injector.get("IssueTypeCustomField");
                var CustomField = $injector.get("CustomField");
                var CompanyFieldCategory = $injector.get("CompanyFieldCategory");
                var $log = $injector.get("$log");
                var SweetAlert = $injector.get("SweetAlert");
@@ -45,6 +46,8 @@
                $scope.fn.getCustomFieldList = getCustomFieldList;          // 사용자 정의 필드 목록 조회
                $scope.fn.getMailTargetAll = getMailTargetAll;          // 사용자 정의 필드 목록 조회
                $scope.fn.getIssueTypeCustomFieldList = getIssueTypeCustomFieldList;      // 이슈 유형에서 사용중인 사용자정의 필드가져오기
                $scope.fn.getCompanyTypeCategory = getCompanyTypeCategory;    //  업체 카테고리 목록 정보를 조회한다.
                $scope.fn.getCompanyChildSector = getCompanyChildSector;    //  업체 카테고리 목록 정보를 조회한다.
                function getUserList(query, excludeList, page, callBack) {
                    var conditions = {
@@ -410,7 +413,7 @@
                function getIssueIspFieldList(query, excludeList, page, callBack) {
                    var conditions = {
                        ispName : query,
                        name : query,
                        excludeIds : (function () {
                            var excludeIds = [];
@@ -443,7 +446,7 @@
                function getIssueHostingFieldList(query, excludeList, page, callBack) {
                    var conditions = {
                        hostingName : query,
                        name : query,
                        excludeIds : (function () {
                            var excludeIds = [];
@@ -475,6 +478,91 @@
                    return deferred.promise;
                }
                function getCompanyTypeCategory(typeCategory, query, excludeList, page, callBack) {
                    var conditions = {
                        typeCategory : typeCategory,
                        useValue : query,
                        excludeIds : (function () {
                            var excludeIds = [];
                            angular.forEach(excludeList, function (exclude) {
                                excludeIds.push(exclude.id);
                            });
                            return excludeIds;
                        })()
                    };
                    var deferred = $q.defer();
                    if ($rootScope.isDefined(page) && page > 0) {
                        $rootScope.spinner = true;
                    }
                    CompanyFieldCategory.find($resourceProvider.getContent(         //  페이징 업데이트가 필요한 컴포넌트 일경우, page 업데이트가 있을 경우 기본 10개씩 가져오고 아닐경우 25개씩 가져온다.
                        conditions, $resourceProvider.getPageContent($rootScope.isDefined(page) ? page : 0, $rootScope.isDefined(page) ? 10 : 25))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if ($rootScope.isDefined(callBack)) {
                                callBack(result);
                            }
                            deferred.resolve(result.data.data);
                        }
                        else {
                            SweetAlert.swal($filter("translate")("common.failedToCompanyCategoryListLookUp"), result.data.message.message, "error");
                        }
                        $rootScope.spinner = false;
                    });
                    return deferred.promise;
                }
                function getCompanyChildSector(parentSector, parentSectorId, typeCategory, query, excludeList, page, callBack) {
                    var conditions = {
                        parentId : (function () {   // 업종(대분류)
                            var parentId = "";
                            if (parentSector != null && parentSector !== "") {
                                parentId = parentSector[0].id;
                            }else {
                                parentId = parentSectorId;
                            }
                            return parentId;
                        })(),
                        typeCategory : typeCategory,
                        useValue : query,
                        excludeIds : (function () {
                            var excludeIds = [];
                            angular.forEach(excludeList, function (exclude) {
                                excludeIds.push(exclude.id);
                            });
                            return excludeIds;
                        })()
                    };
                    var deferred = $q.defer();
                    if ($rootScope.isDefined(page) && page > 0) {
                        $rootScope.spinner = true;
                    }
                    CompanyFieldCategory.find($resourceProvider.getContent(         //  페이징 업데이트가 필요한 컴포넌트 일경우, page 업데이트가 있을 경우 기본 10개씩 가져오고 아닐경우 25개씩 가져온다.
                        conditions, $resourceProvider.getPageContent($rootScope.isDefined(page) ? page : 0, $rootScope.isDefined(page) ? 10 : 25))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if ($rootScope.isDefined(callBack)) {
                                callBack(result);
                            }
                            deferred.resolve(result.data.data);
                        }
                        else {
                            SweetAlert.swal($filter("translate")("common.failedToCompanyCategoryListLookUp"), result.data.message.message, "error");
                        }
                        $rootScope.spinner = false;
                    });
                    return deferred.promise;
                }
                function getPartnerList(query, excludeList, page, callBack) {
                    var conditions = {
                        partnerName : query,
src/main/webapp/scripts/main.js
@@ -355,6 +355,8 @@
        'companyFieldAddController' : 'app/companyField/companyFieldAdd.controller', // 업체 생성 컨트롤러
        'companyFieldModifyController' : 'app/companyField/companyFieldModify.controller', // 업체 수정 컨트롤러
        'companyFieldCategoryService' : 'components/companyFieldCategory/companyFieldCategory.service',  // 업체 카테고리
        /* ISP */
        'ispFieldRoute' : 'app/ispField/ispField',   // ISP route 정보
        'ispFieldService' : 'components/ispField/ispField.service',  // ISP 관련된 통신 담당
@@ -600,7 +602,8 @@
    'companyFieldService',
    'ispFieldService',
    'hostingFieldService',
    'userWorkspaceService'
    'userWorkspaceService',
    'companyFieldCategoryService',
], function ($, angular, domReady, app, sortable, crypto) {
    //  대시보드에서 Sortable 인식 못하는 문제 해결
    window.Sortable = sortable;
src/main/webapp/views/companyField/companyFieldAdd.html
@@ -31,43 +31,6 @@
            </div>
            <div class="form-group">
                <label class="issue-label">
                    <span translate="ispField.select">ISP 선택</span>
                </label>
                <js-autocomplete-single data-input-name="ispField"
                                    selected-model="vm.form.issueIspFields"
                                    ng-model="vm.form.ispName"
                                    custom-input="true"
                                    search="vm.form.ispName"
                                    source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
                                    page="vm.autoCompletePage.ispField.page"
                                    total-page="vm.autoCompletePage.ispField.totalPage"
                                    input-disabled="false"
                                    translation-texts="{ empty : 'common.emptyIsp' }"
                                    broad-cast="ispFieldEvent"
                                    extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
            </div>
            <div class="form-group">
                <label class="issue-label">
                    <span translate="hostingField.select">호스팅 선택</span>
                </label>
                <js-autocomplete-single data-input-name="hostingField"
                                    selected-model="vm.form.issueHostingFields"
                                    ng-model="vm.form.hostingName"
                                    custom-input="true"
                                    search="vm.hostingName"
                                    source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
                                    page="vm.autoCompletePage.hostingField.page"
                                    total-page="vm.autoCompletePage.hostingField.totalPage"
                                    input-disabled="false"
                                    translation-texts="{ empty : 'common.emptyHosting' }"
                                    broad-cast="hostingFieldEvent"
                                    extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
            </div>
            <div class="form-group">
                <label for="companyFieldAddForm10" class="issue-label">
                    <span translate="companyField.url">url</span>
                    <code class="highlighter-rouge">*</code>
@@ -87,140 +50,223 @@
                     translate="common.invalidUrlFormat">url 형식이 맞지 않습니다.
                </div>
            </div>
            <!--<div class="row">
                <div class="col-md-3">
                    <div class="form-group mb10">
                        <label for="companyFieldAddForm2" class="issue-label"> <span
                                translate="companyField.company">업체 분류</span>
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.select">ISP 선택</span>
                        </label>
                        <select id="companyFieldAddForm2"
                                name="companyType"
                                class="form-control input-sm issue-select-label"
                                ng-model="vm.form.companyType"
                                >
                            <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }"><span
                                    translate="common.selectTarget">대상 선택</span>
                            </option>
                            <option value="personal">개인</option>
                            <option value="business">기업</option>
                        </select>
                        <js-autocomplete-single data-input-name="ispField"
                                            selected-model="vm.form.issueIspFields"
                                            ng-model="vm.form.ispName"
                                            custom-input="true"
                                            search="vm.form.ispName"
                                            source="fn.getIssueIspFieldList(vm.form.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
                                            page="vm.autoCompletePage.ispField.page"
                                            total-page="vm.autoCompletePage.ispField.totalPage"
                                            input-disabled="false"
                                            translation-texts="{ empty : 'common.emptyIsp' }"
                                            broad-cast="ispFieldEvent"
                                            extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
                <div class="col-md-3">
                    <div class="form-group mb10">
                        <label for="companyFieldAddForm3" class="issue-label">
                            <span translate="companyField.profitYN">영리/비영리</span>
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="hostingField.select">호스팅 선택</span>
                        </label>
                        <select id="companyFieldAddForm3"
                                name="profitYN"
                                class="form-control input-sm issue-select-label"
                                ng-model="vm.form.profitYN"
                                >
                            <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }">
                                <span translate="common.selectTarget">대상 선택</span>
                            </option>
                            <option value="profit">영리</option>
                            <option value="nonProfit">비영리</option>
                        </select>
                        <js-autocomplete-single data-input-name="hostingField"
                                            selected-model="vm.form.issueHostingFields"
                                            ng-model="vm.form.hostingName"
                                            custom-input="true"
                                            search="vm.form.hostingName"
                                            source="fn.getIssueHostingFieldList(vm.form.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
                                            page="vm.autoCompletePage.hostingField.page"
                                            total-page="vm.autoCompletePage.hostingField.totalPage"
                                            input-disabled="false"
                                            translation-texts="{ empty : 'common.emptyHosting' }"
                                            broad-cast="hostingFieldEvent"
                                            extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="form-group mb10">
                        <label for="companyFieldAddForm4" class="issue-label"> <span
                                translate="companyField.industry">산업 분류</span>
            </div>
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label"><span translate="companyField.tel">전화번호</span></label>
                        <div class="input-group" ng-repeat="tell in vm.form.inputTels">
                            <input type="text"
                                   name="tel"
                                   class="form-control mt-1"
                                   kr-input
                                   ng-model="vm.form.tels[$index]"
                                   input-regex="[^0-9]"
                                   maxlength="11"
                                   minlength="9"
                                   autocomplete="off">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="companyFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.email">이메일</span>
                        </label>
                        <input id="companyFieldAddForm4"
                               name="industry"
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input type="text"
                                   name="email"
                                   class="form-control mt-1"
                                   kr-input
                                   ng-model="vm.form.emails[$index]"
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                                   autocomplete="off">
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="companyFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label for="companyFieldAddForm9" class="issue-label">
                            <span translate="companyField.manager">담당자</span>
                        </label>
                        <input id="companyFieldAddForm9"
                               name="manager"
                               type="text"
                               class="form-control"
                               kr-input
                               input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                               autocomplete="off"
                               ng-model="vm.form.industry"
                               ng-maxlength="200"
                               maxlength="200"
                               >
                               ng-model="vm.form.manager"
                               ng-maxlength="100"
                               maxlength="100"
                        >
                    </div>
                </div>
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.companyType">기업구분</span>
                        </label>
                        <js-autocomplete-single data-input-name="companyType"
                                                selected-model="vm.form.companyTypes"
                                                ng-model="vm.form.companyType"
                                                custom-input="false"
                                                search="vm.form.companyType"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.companyType, vm.form.companyType, vm.form.companyTypes, vm.autoCompletePage.companyType.page, fn.getCompanyTypeListCallBack)"
                                                page="vm.autoCompletePage.companyType.page"
                                                total-page="vm.autoCompletePage.companyType.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyCompanyType' }"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label for="companyFieldAddForm5" class="issue-label">
                    <span translate="companyField.domain">도메인</span>
                <label class="issue-label">
                    <span translate="companyField.parentSector">업종(대분류)</span>
                </label>
                <input id="companyFieldAddForm5"
                       name="domain"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.domain"
                       ng-maxlength="200"
                       maxlength="200"
                       >
                &lt;!&ndash;<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>&ndash;&gt;
            </div>-->
            <div>
                <div class="form-group">
                    <label for="companyFieldAddForm9" class="issue-label">
                        <span translate="companyField.manager">담당자</span>
                    </label>
                    <input id="companyFieldAddForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
                <js-autocomplete-single data-input-name="parentSector"
                                        selected-model="vm.form.parentSectors"
                                        ng-model="vm.form.parentSector"
                                        custom-input="false"
                                        search="vm.form.parentSector"
                                        source="fn.getCompanyTypeCategory(vm.typeCategory.parentSector, vm.form.parentSector, vm.form.parentSectors, vm.autoCompletePage.parentSector.page, fn.getParentSectorListCallBack)"
                                        page="vm.autoCompletePage.parentSector.page"
                                        total-page="vm.autoCompletePage.parentSector.totalPage"
                                        input-disabled="false"
                                        translation-texts="{ empty : 'common.emptyParentSector' }"
                                        extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldAddForm7" class="issue-label"><span translate="companyField.tel">전화번호</span></label>
                    <input id="companyFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="companyFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
            <div class="form-group">
                <label class="issue-label">
                    <span translate="companyField.childSector">업종(중분류)</span>
                </label>
                <js-autocomplete-single data-input-name="childSector"
                                        selected-model="vm.form.childSectors"
                                        ng-model="vm.form.childSector"
                                        custom-input="false"
                                        search="vm.form.childSector"
                                        source="fn.getCompanyChildSector(vm.form.parentSectorId, vm.form.parentSectors[0].id, vm.typeCategory.childSector, vm.form.childSector, vm.form.childSectors, vm.autoCompletePage.childSector.page, fn.getChildSectorListCallBack)"
                                        page="vm.autoCompletePage.childSector.page"
                                        total-page="vm.autoCompletePage.childSector.totalPage"
                                        input-disabled="false"
                                        translation-texts="{ empty : 'common.emptyChildSector' }"
                                        extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
            </div>
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.region">지역</span>
                        </label>
                        <js-autocomplete-single data-input-name="region"
                                                selected-model="vm.form.regions"
                                                ng-model="vm.form.region"
                                                custom-input="false"
                                                search="vm.form.region"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.region, vm.form.region, vm.form.regions, vm.autoCompletePage.region.page, fn.getRegionListCallBack)"
                                                page="vm.autoCompletePage.region.page"
                                                total-page="vm.autoCompletePage.region.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyRegion' }"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
<!--                    <div ng-show="companyFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldAddForm6" class="issue-label">
                        <span translate="companyField.email">이메일</span>
                    </label>
                    <input id="companyFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="companyFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.status">상태</span>
                        </label>
                        <js-autocomplete-single data-input-name="status"
                                                selected-model="vm.form.statuses"
                                                ng-model="vm.form.status"
                                                custom-input="false"
                                                search="vm.form.status"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.status, vm.form.status, vm.form.statuses, vm.autoCompletePage.status.page, fn.getStatusListCallBack)"
                                                page="vm.autoCompletePage.status.page"
                                                total-page="vm.autoCompletePage.status.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyStatus' }"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldAddForm8" class="issue-label">
src/main/webapp/views/companyField/companyFieldModify.html
@@ -30,196 +30,243 @@
                <small translate="companyField.enterSpecialCharacters">업체 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div class="form-group">
                <label class="issue-label">
                    <span translate="ispField.select">ISP 선택</span>
                <label for="companyFieldAddForm10" class="issue-label">
                    <span translate="companyField.url">url</span>
                </label>
                <js-autocomplete-single data-input-name="ispField"
                                        selected-model="vm.form.issueIspFields"
                                        ng-model="vm.form.ispName"
                                        custom-input="true"
                                        search="vm.form.ispName"
                                        source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
                                        page="vm.autoCompletePage.ispField.page"
                                        total-page="vm.autoCompletePage.ispField.totalPage"
                                        input-disabled="false"
                                        translation-texts="{ empty : 'common.emptyIsp' }"
                                        broad-cast="ispFieldEvent"
                                        extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                <input id="companyFieldAddForm10"
                       name="url"
                       type="text"
                       class="form-control"
                       kr-input
                       autocomplete="off"
                       ng-model="vm.form.url"
                       ng-maxlength="200"
                       maxlength="200"
                       ng-pattern="/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/"
                >
                <div ng-show="companyFieldModifyForm.url.$error.pattern" class="help-block form-text text-danger"
                     translate="common.invalidUrlFormat">url 형식이 맞지 않습니다.
                </div>
            </div>
            <div class="form-group">
                <label class="issue-label">
                    <span translate="hostingField.select">호스팅 선택</span>
                </label>
                <js-autocomplete-single data-input-name="hostingField"
                                        selected-model="vm.form.issueHostingFields"
                                        ng-model="vm.form.hostingName"
                                        custom-input="true"
                                        search="vm.form.hostingName"
                                        source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
                                        page="vm.autoCompletePage.hostingField.page"
                                        total-page="vm.autoCompletePage.hostingField.totalPage"
                                        input-disabled="false"
                                        translation-texts="{ empty : 'common.emptyHosting' }"
                                        broad-cast="hostingFieldEvent"
                                        extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldAddForm10" class="issue-label">
                        <span translate="companyField.url">url</span>
                    </label>
                    <input id="companyFieldAddForm10"
                           name="url"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.url"
                           ng-maxlength="200"
                           maxlength="200"
                           ng-pattern="/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/"
                    >
                    <div ng-show="companyFieldModifyForm.url.$error.pattern" class="help-block form-text text-danger"
                         translate="common.invalidUrlFormat">url 형식이 맞지 않습니다.
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.select">ISP 선택</span>
                        </label>
                        <js-autocomplete-single data-input-name="ispField"
                                                selected-model="vm.form.issueIspFields"
                                                ng-model="vm.form.ispName"
                                                custom-input="true"
                                                search="vm.form.ispName"
                                                source="fn.getIssueIspFieldList(vm.form.ispName, vm.form.issueIspFields, vm.autoCompletePage.issueIspFields.page, fn.getIssueIspFieldListCallBack)"
                                                page="vm.autoCompletePage.ispField.page"
                                                total-page="vm.autoCompletePage.ispField.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyIsp' }"
                                                broad-cast="ispFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="hostingField.select">호스팅 선택</span>
                        </label>
                        <js-autocomplete-single data-input-name="hostingField"
                                                selected-model="vm.form.issueHostingFields"
                                                ng-model="vm.form.hostingName"
                                                custom-input="true"
                                                search="vm.form.hostingName"
                                                source="fn.getIssueHostingFieldList(vm.form.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
                                                page="vm.autoCompletePage.hostingField.page"
                                                total-page="vm.autoCompletePage.hostingField.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyHosting' }"
                                                broad-cast="hostingFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                            type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
            </div>
            <!--<div class="row">
                <div class="col-md-3">
                    <div class="form-group mb10">
                        <label for="companyFieldModifyForm2" class="issue-label"> <span
                                translate="companyField.company">업체 분류</span>
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.tel">전화번호</span>
                        </label>
                        <select id="companyFieldModifyForm2"
                                name="companyType"
                                class="form-control input-sm issue-select-label"
                                ng-model="vm.form.companyType"
                                >
                            <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }"><span
                                    translate="common.selectTarget">대상 선택</span>
                            </option>
                            <option value="personal">개인</option>
                            <option value="business">기업</option>
                        </select>
                        <div class="input-group" ng-repeat="tell in vm.form.inputTels">
                            <input type="text"
                                   name="tel"
                                   class="form-control mt-1"
                                   kr-input
                                   ng-model="vm.form.tels[$index]"
                                   input-regex="[^0-9]"
                                   maxlength="11"
                                   minlength="9"
                                   autocomplete="off">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="companyFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
                </div>
                <div class="col-md-3">
                    <div class="form-group mb10">
                        <label for="companyFieldModifyForm3" class="issue-label">
                            <span translate="companyField.profitYN">영리/비영리</span>
                        </label>
                        <select id="companyFieldModifyForm3"
                                name="profitYN"
                                class="form-control input-sm issue-select-label"
                                ng-model="vm.form.profitYN"
                                >
                            <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }">
                                <span translate="common.selectTarget">대상 선택</span>
                            </option>
                            <option value="profit">영리</option>
                            <option value="nonProfit">비영리</option>
                        </select>
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="form-group mb10">
                        <label for="companyFieldModifyForm4" class="issue-label"> <span
                                translate="companyField.industry">산업 분류</span>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.email">이메일</span>
                        </label>
                        <input id="companyFieldModifyForm4"
                               name="industry"
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input type="text"
                                   name="email"
                                   class="form-control mt-1"
                                   kr-input
                                   ng-model="vm.form.emails[$index]"
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                                   autocomplete="off">
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="companyFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label for="companyFieldModifyForm9" class="issue-label">
                            <span translate="companyField.manager">담당자</span>
                        </label>
                        <input id="companyFieldModifyForm9"
                               name="manager"
                               type="text"
                               class="form-control"
                               kr-input
                               input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                               autocomplete="off"
                               ng-model="vm.form.industry"
                               ng-maxlength="200"
                               maxlength="200"
                               >
                               ng-model="vm.form.manager"
                               ng-maxlength="100"
                               maxlength="100"
                        >
                    </div>
                </div>
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.companyType">기업구분</span>
                        </label>
                        <js-autocomplete-single data-input-name="companyType"
                                                selected-model="vm.form.companyTypes"
                                                ng-model="vm.form.companyType"
                                                custom-input="false"
                                                search="vm.form.companyType"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.companyType, vm.form.companyType, vm.form.companyTypes, vm.autoCompletePage.companyType.page, fn.getCompanyTypeListCallBack)"
                                                page="vm.autoCompletePage.companyType.page"
                                                total-page="vm.autoCompletePage.companyType.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyCompanyType' }"
                                                broad-cast="companyTypeEvent"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label for="companyFieldModifyForm5" class="issue-label">
                    <span translate="companyField.domain">도메인</span>
                </label>
                <input id="companyFieldModifyForm5"
                       name="domain"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.domain"
                       ng-maxlength="200"
                       maxlength="200"
                       >
                &lt;!&ndash;<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>&ndash;&gt;
            </div>-->
            <div>
                <div class="form-group">
                    <label for="companyFieldModifyForm9" class="issue-label">
                        <span translate="companyField.manager">담당자</span>
                    <label class="issue-label">
                        <span translate="companyField.parentSector">업종(대분류)</span>
                    </label>
                    <input id="companyFieldModifyForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                    <js-autocomplete-single data-input-name="parentSector"
                                            selected-model="vm.form.parentSectors"
                                            ng-model="vm.form.parentSector"
                                            custom-input="false"
                                            search="vm.form.parentSector"
                                            source="fn.getCompanyTypeCategory(vm.typeCategory.parentSector, vm.form.parentSector, vm.form.parentSectors, vm.autoCompletePage.parentSector.page, fn.getParentSectorListCallBack)"
                                            page="vm.autoCompletePage.parentSector.page"
                                            total-page="vm.autoCompletePage.parentSector.totalPage"
                                            input-disabled="false"
                                            translation-texts="{ empty : 'common.emptyParentSector' }"
                                            broad-cast="parentSectorEvent"
                                            extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldModifyForm7" class="issue-label">
                        <span translate="companyField.tel">전화번호</span>
                    <label class="issue-label">
                        <span translate="companyField.childSector">업종(중분류)</span>
                    </label>
                    <input id="companyFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="companyFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                    <js-autocomplete-single data-input-name="childSector"
                                            selected-model="vm.form.childSectors"
                                            ng-model="vm.form.childSector"
                                            custom-input="false"
                                            search="vm.form.childSector"
                                            source="fn.getCompanyChildSector(vm.form.parentSectors, vm.form.parentSectorId, vm.typeCategory.childSector, vm.form.childSector, vm.form.childSectors, vm.autoCompletePage.childSector.page, fn.getChildSectorListCallBack)"
                                            page="vm.autoCompletePage.childSector.page"
                                            total-page="vm.autoCompletePage.childSector.totalPage"
                                            input-disabled="false"
                                            translation-texts="{ empty : 'common.emptyChildSector' }"
                                            broad-cast="childSectorEvent"
                                            extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                </div>
            </div>
            <div class="row">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.region">지역</span>
                        </label>
                        <js-autocomplete-single data-input-name="region"
                                                selected-model="vm.form.regions"
                                                ng-model="vm.form.region"
                                                custom-input="false"
                                                search="vm.form.region"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.region, vm.form.region, vm.form.regions, vm.autoCompletePage.region.page, fn.getRegionListCallBack)"
                                                page="vm.autoCompletePage.region.page"
                                                total-page="vm.autoCompletePage.region.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyRegion' }"
                                                broad-cast="regionEvent"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
<!--                    <div ng-show="companyFieldModifyForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="companyFieldModifyForm6" class="issue-label">
                        <span translate="companyField.email">이메일</span>
                    </label>
                    <input id="companyFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="companyFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-6">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="companyField.status">상태</span>
                        </label>
                        <js-autocomplete-single data-input-name="status"
                                                selected-model="vm.form.statuses"
                                                ng-model="vm.form.status"
                                                custom-input="false"
                                                search="vm.form.status"
                                                source="fn.getCompanyTypeCategory(vm.typeCategory.status, vm.form.status, vm.form.statuses, vm.autoCompletePage.status.page, fn.getStatusListCallBack)"
                                                page="vm.autoCompletePage.status.page"
                                                total-page="vm.autoCompletePage.status.totalPage"
                                                input-disabled="false"
                                                translation-texts="{ empty : 'common.emptyStatus' }"
                                                broad-cast="statusEvent"
                                                extra-settings="{ displayProp : 'useValue' , idProp : 'id', imageable : false, imagePathProp : '',
                        type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                    </div>
                </div>
            </div>
src/main/webapp/views/hostingField/hostingFieldAdd.html
@@ -65,46 +65,64 @@
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="hostingFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="hostingField.tel">전화번호</span>
                        </label>
                        <div class="input-group" ng-repeat="i in vm.form.inputTels">
                            <input name="tel"
                                   type="text"
                                   class="form-control"
                                   kr-input
                                   input-regex="[^0-9]"
                                   autocomplete="off"
                                   ng-model="vm.form.tels[$index]"
                                   maxlength="11"
                                   minlength="9">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="hostingFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
<!--                    <div ng-show="hostingFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="hostingFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="hostingField.email">이메일</span>
                        </label>
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input id="hostingFieldAddForm6"
                                   name="email"
                                   type="email"
                                   class="form-control"
                                   autocomplete="off"
                                   maxLength="50"
                                   ng-model="vm.form.emails[$index]"
                                   kr-input
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                            >
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="hostingFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>
src/main/webapp/views/hostingField/hostingFieldModify.html
@@ -66,46 +66,63 @@
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="hostingFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.tel">전화번호</span>
                        </label>
                        <div class="input-group" ng-repeat="tell in vm.form.inputTels">
                            <input name="tel"
                                   type="text"
                                   class="form-control"
                                   kr-input
                                   input-regex="[^0-9]"
                                   autocomplete="off"
                                   ng-model="vm.form.tels[$index]"
                                   maxlength="11"
                                   minlength="9">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="hostingFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
<!--                    <div ng-show="hostingFieldModifyForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="hostingFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.email">이메일</span>
                        </label>
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input name="email"
                                   type="email"
                                   class="form-control"
                                   autocomplete="off"
                                   maxLength="50"
                                   ng-model="vm.form.emails[$index]"
                                   kr-input
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                            >
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="hostingFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>
@@ -125,7 +142,7 @@
                           maxlength="200"
                           ng-pattern="/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/"
                    >
                    <div ng-show="ispFieldModifyForm.url.$error.pattern" class="help-block form-text text-danger"
                    <div ng-show="hostingFieldModifyForm.url.$error.pattern" class="help-block form-text text-danger"
                         translate="common.invalidUrlFormat">url 형식이 맞지 않습니다.
                    </div>
                </div>
src/main/webapp/views/ispField/ispFieldAdd.html
@@ -65,46 +65,62 @@
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm7" class="issue-label">
                        <span translate="ispField.tel">전화번호</span>
                    </label>
                    <input id="ispFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="ispFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label"> <span translate="ispField.tel">전화번호</span></label>
                        <div class="input-group" ng-repeat="tell in vm.form.inputTels">
                            <input name="tel"
                                   type="text"
                                   class="form-control mt-1"
                                   kr-input
                                   input-regex="[^0-9]"
                                   autocomplete="off"
                                   ng-model="vm.form.tels[$index]"
                                   maxlength="11"
                                   minlength="9">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="ispFieldAddForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
<!--                    <div ng-show="ispFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm6" class="issue-label">
                        <span translate="ispField.email">이메일</span>
                    </label>
                    <input id="ispFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="ispFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.email">이메일</span>
                        </label>
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input id="ispFieldAddForm6"
                                   name="email"
                                   type="email"
                                   class="form-control"
                                   autocomplete="off"
                                   maxLength="50"
                                   ng-model="vm.form.emails[$index]"
                                   kr-input
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                            >
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="ispFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>
src/main/webapp/views/ispField/ispFieldModify.html
@@ -66,46 +66,63 @@
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldModifyForm7" class="issue-label">
                        <span translate="ispField.tel">전화번호</span>
                    </label>
                    <input id="ispFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="11"
                           minlength="9">
                    <div ng-show="ispFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                         translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
            <div class="row">
                <div class="col-lg-4">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.tel">전화번호</span>
                        </label>
                        <div class="input-group" ng-repeat="tell in vm.form.inputTels">
                            <input name="tel"
                                   type="text"
                                   class="form-control"
                                   kr-input
                                   input-regex="[^0-9]"
                                   autocomplete="off"
                                   ng-model="vm.form.tels[$index]"
                                   maxlength="11"
                                   minlength="9">
                            <span class="select3-selection__email__remove" ng-click="fn.removeTelInput($index)">×</span>
                        </div>
                        <div ng-show="ispFieldModifyForm.tel.$error.minlength" class="help-block form-text text-danger"
                             translate="common.least9CharactersTel">전화번호 형식이 맞지 않습니다.(9자리 이상)
                        </div>
                    </div>
<!--                    <div ng-show="ispFieldModifyForm.tel.$error.pattern" class="help-block form-text text-danger"-->
<!--                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.-->
<!--                    </div>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldModifyForm6" class="issue-label">
                        <span translate="ispField.email">이메일</span>
                    </label>
                    <input id="ispFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="ispFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                <div class="col-lg-2 mt-25" style="margin-left: -15px">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addTel()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
                <div class="col-lg-5">
                    <div class="form-group">
                        <label class="issue-label">
                            <span translate="ispField.email">이메일</span>
                        </label>
                        <div class="input-group" ng-repeat="mail in vm.form.inputMails">
                            <input name="email"
                                   type="email"
                                   class="form-control"
                                   autocomplete="off"
                                   maxLength="50"
                                   ng-model="vm.form.emails[$index]"
                                   kr-input
                                   ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                            >
                            <span class="select3-selection__email__remove" ng-click="fn.removeMailInput($index)">×</span>
                        </div>
                        <div ng-show="ispFieldModifyForm.email.$error.pattern" class="help-block form-text text-danger"
                             translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                        </div>
                    </div>
                </div>
                <div class="col-lg-2 mt-25" style="margin-left: -15px; margin-right: -16px;">
                    <div>
                        <button type="button" class="btn btn-secondary" ng-click="fn.addMail()">
                            <span translate="common.add">추가</span>
                        </button>
                    </div>
                </div>
            </div>