= 업무 그룹 관리

== 개요

메일 그룹 및 맵핑 정보 관리 기능 제공.

== UI Design & Function

=== 업무 그룹 목록(WorkgroupList.vue)

업무별로 업무그룹을 만들고 해당 업무그룹에서 사용가능한 메뉴를 선택, 해당 메뉴 사용 가능한 Role 또는 User를 추가한다.

image::workgroupList.png[업무 그룹 목록]

* 기능 설명
. 업무그룹 목록 조회
. 업무그룹 상세정보 조회
. 업무그룹 등록 : 업무그룹 정보를 입력하는 Popup이 호출 되며, 정보 기입 후 저장 버튼을 클릭하여 등록한다.
. 업무그룹 수정 : 선택된(checkbox : true) 업무그룹 정보를 수정하는 Popup이 호출 되며 역할 정보 기입 후 저장 버튼을 클릭하여 수정한다.
. 업무그룹 삭제 : 선택된(checkbox : true) 역할 목록을 삭제한다.

=== 업무그룹-메뉴(WorkgroupMenuInfo.vue)

업무그룹에서 사용 가능한 메뉴를 관리 하는 화면. +
메뉴 등록 및 삭제가 가능하며 메뉴별 권한 설정이 가능하다.

image::workgroupMenuInfo.png[업무그룹-메뉴]

* 기능 설명
. 업무그룹-메뉴 목록 조회
. 업무그룹-메뉴 등록 : 메뉴를 선택하는 Popup이 호출 되며 선택 후 저장 버튼을 클릭하여 등록한다.
. 업무그룹-메뉴 수정 : 권한을 선택(checkbox : true)하여 해당 메뉴에 대한 권한을 수정한다.
. 업무그룹-메뉴 삭제 : 선택된(checkbox : true) 메뉴 목록을 삭제한다.

=== 업무그룹-역할(WorkgroupMenuInfo.vue)

선택한 업무그룹에 역할 또는 사용자를 관리하는 화면. +
역할과 사용자를 추가 또는 삭제할 수 있다.

image::workgroupRoleInfo.png[업무그룹-역할]

* 기능 설명
. 업무그룹-역할 목록 조회
. 업무그룹-역할 등록
.. 사용자 등록 : 사용자 추가 버튼 클릭 시 사용자를 선택할 수 있는 Popup이 호출 되며 선택 후 저장 버튼을 클릭하여 등록 한다.
.. 역할 등록 : 역할 추가 버튼 클릭 시 역할을 선택할 수 있는 Popup이 호출 되며 선택 후 저장 버튼을 클릭하여 등록 한다.
. 업무그룹-역할 수정 : 등록된 사용자의 업무그룹 만료일을 수정 한다.
. 업무그룹-역할 삭제 : 선택된(checkbox : true) 역할(사용자) 목록을 삭제한다.

== API & Service

=== API

* API : WorkgroupController.java

. 업무그룹 목록 조회 : GET /auth/workgroups-with-paging
. 업무그룹 상세정보 조회 : GET /auth/workgroups/{workgroupId}
. 업무그룹 등록 : POST /auth/workgroups
. 업무그룹 수정 : PUT /auth/workgroups/{workgroupId}
. 업무그룹 삭제 : DELETE /auth/workgroups
. 업무그룹-메뉴 목록 조회 : GET /auth/workgroups/{workgroupId}/menus
. 업무그룹-메뉴 등록 : POST /auth/workgroups/{workgroupId}/menus
. 업무그룹-메뉴 수정 : PUT /auth/workgroups/{workgroupId}/menus
. 업무그룹-메뉴 삭제 : DELETE /auth/workgroups/{workgroupId}/menus
. 업무그룹-역할 목록 조회 : GET /auth/workgroups/{workgroupId}/roles
. 업무그룹-역할 등록 : POST /auth/workgroups/{workgroupId}/roles
. 업무그룹-역할 수정 : PUT /auth/workgroups/{workgroupId}/roles
. 업무그룹-역할 삭제 : DELETE /auth/workgroups/{workgroupId}/roles

* Service : WorkgroupServiceImpl.java

. 업무그룹-메뉴 목록 조회. +
메뉴의 전체 경로 셋팅 및 권한별 row 데이터를 메뉴 row 데이터로 가공한다.

[source,java]
----
@Override
public List<WorkgroupMenuDto> getWorkgroupMenuList(String workgroupId) {

    List<WorkgroupMenuDto> workgroupMenuDtoList = new ArrayList<>();
    List<String> authorizationIdList;
    String beforeMenuId = "";
    -- 생략 --
----

== Entity Table & SQL

=== Entity Table

* TN_CF_WORKGROUP : 업무그룹
* TN_CF_WORK_AUTHORIZATION : 업무그룹 메뉴 권한 맵핑
* TN_CF_WORKGROUP_ROLE : 업무그룹 역할 맵핑

=== SQL

. 업무그룹 목록 조회

[source,xml]
----
<select id="selectWorkgroupPagingList" parameterType="java.util.HashMap" resultMap="workgroupResult">
    SELECT *
    FROM   (SELECT ROW_NUMBER() OVER (	<if test="@com.samsung.SdlComparator@isNotEmptyForDynamicSql(orderBy)">ORDER BY ${orderBy}</if> ) ROWNUM,
                   <include refid="columnsWorkgroup" />
	--생략--
----

[start=2]
. 업무그룹 상세정보 조회

[source,xml]
----
<select id="selectWorkgroup" parameterType="java.util.HashMap" resultMap="workgroupResult">
    SELECT <include refid="columnsWorkgroup" />
    FROM   <include refid="tableWorkgroup" />
    <include refid="conditionWorkgroup" />
</select>
----

[start=3]
. 업무그룹 등록

[source,xml]
----
<insert id="insertWorkgroup" parameterType="workgroup">
    INSERT INTO <include refid="tableWorkgroup" />
        (<include refid="columnsWorkgroup"/>)
    --생략--
----

[start=4]
. 업무그룹 수정

[source,xml]
----
<update id="updateWorkgroup" parameterType="workGroup">
    UPDATE <include refid="tableWorkgroup" />
    SET    WORKGROUP_NAME = #{workgroupName},
    --생략--
----

[start=5]
. 업무그룹 삭제

[source,xml]
----
<delete id="deleteWorkgroup" parameterType="java.util.HashMap">
    UPDATE <include refid="tableWorkgroup" />
    SET    DELETE_YN = 1,
    --생략--
----

[start=6]
. 업무그룹-메뉴 목록 조회

[source,xml]
----
<select id="selectWorkgroupMenuList" parameterType="java.util.HashMap" resultMap="workgroupMenuResult">
    WITH TREE_TABLE AS (SELECT SR.UPPER_SYS_RESOURCE_ID, M.MENU_ID,
                               CONVERT(NVARCHAR(100), M.LABEL) LABEL,
                               CONVERT(NVARCHAR(100), M.LABEL_JSON) LABEL_JSON,
    --생략--
----

[start=7]
. 업무그룹-메뉴 등록

[source,xml]
----
<insert id="insertWorkgroupMenu" parameterType="workgroupMenu">
    INSERT INTO <include refid="tableWorkAuthorization" />
        (WORKGROUP_ID, SYS_RESOURCE_ID, AUTHORIZATION_ID,
    --생략--
----

[start=8]
. 업무그룹-메뉴 삭제

[source,xml]
----
<delete id="deleteWorkgroupMenu" parameterType="workgroupMenu">
    DELETE FROM <include refid="tableWorkAuthorization" />
    WHERE  SYS_RESOURCE_ID = #{sysResourceId}
    --생략--
----

[start=9]
. 업무그룹-역할 목록 조회

[source,xml]
----
<select id="selectRoleWorkgroupList" parameterType="java.util.HashMap" resultMap="workgroup.workgroupResult">
    SELECT W.WORKGROUP_ID, W.WORKGROUP_NAME, W.DESCRIPTION,
           W.LABEL
    --생략--
----

[start=10]
. 업무그룹-역할 등록

[source,xml]
----
<insert id="insertWorkgroupRole" parameterType="workgroupRole">
    INSERT INTO <include refid="tableWorkgroupRole" />
        (WORKGROUP_ID, USER_ROLE_ID, FROM_DATE, THRU_DATE, ROLE_ID, USER_ID,
    --생략--
----

[start=11]
. 업무그룹-역할 수정

[source,xml]
----
<update id="updateWorkgroupRole" parameterType="workgroupRole">
    UPDATE <include refid="tableWorkgroupRole" />
    SET    THRU_DATE = #{thruDate},
    --생략--
----

[start=12]
. 업무그룹-역할 삭제

[source,xml]
----
<delete id="deleteWorkgroupRole" parameterType="java.util.HashMap">
    DELETE FROM <include refid="tableWorkgroupRole" />
    WHERE  WORKGROUP_ID = #{workgroupId}
    --생략--
----