= 역할 관리

== 개요

역할을 등록하고, 해당 역할에 사용자 및 업무그룹을 Mapping 한다.

== UI Design & Function

=== 역할 목록(RoleList.vue)

역할 등록, 수정 및 조회. +
조회된 목록의 사용자/업무그룹 컬럼을 클릭하여 역할-사용자, 역할-업무그룹 상세 화면으로 이동한다.

image::roleList.png[역할 관리]

* 기능 설명
. 역할 목록 조회
. 역할 등록 : 역할 정보를 입력하는 Popup이 호출 되며 정보 기입 후 저장 버튼을 클릭하여 등록한다.
. 역할 수정 : 선택된(checkbox : true) 역할 정보를 수정하는 Popup이 호출 되며, 정보 기입 후 저장 버튼을 클릭하여 수정한다.
. 역할 삭제 : 선택된(checkbox : true) 역할 목록을 삭제한다.
. 엑셀 다운로드 : 조회 조건과 동일한 역할 목록을 엑셀 파일로 다운로드 한다.

=== 역할-사용자 관리(RoleUserInfo.vue)

선택한 역할에 대한 사용자 추가. +
역할에 대한 사용자가 많을 경우를 대비하여 상단에 페이징 처리 되는 Grid를, 하단에는 사용자를 추가하는 Grid로 나누어 화면을 구성된다.

image::roleUserInfo.png[역할-사용자 관리]

* 기능 설명
. 역할-사용자 목록 조회
. 역할-사용자 등록 : 추가 버튼 클릭시 사용자 조회 Popup이 호출 되며 사용자 선택 후 추가된 하단의 사용자 목록에서 저장한다.
. 역할-사용자 수정 : 기등록된 상단 사용자 목록에서 역할 적용 기간을 수정한다.
. 역할-사용자 삭제 : 기등록된 상단 사용자 목록에서 선택된(checkbox : true) 사용자 목록을 삭제한다.

=== 역할-업무그룹 관리(RoleWorkgroupInfo.vue)

선택한 역할에 대한 업무그룹 추가.

image::roleWorkgroupInfo.png[역할-업무그룹 관리]

* 기능 설명
. 역할-업무그룹 목록 조회
. 역할-업무그룹 등록 : 추가 버튼 클릭시 업무그룹 조회 Popup이 호출 되며 업무그룹을 선택 하여 등록 할 수 있다.
. 역할-업무그룹 삭제 : 기등록된 상단 업무그룹 목록에서 선택된(checkbox : true) 업무그룹 목록을 삭제한다.

== API & Service

=== API

* API : RoleController.java

. 역할 목록 조회 : GET /roles-with-paging
. 역할 상세정보 조회 : GET /roles/{roleId}
. 역할 등록 : POST /roles
. 역할 수정 : PUT /roles
. 역할 삭제 : DELETE /roles
. 역할-사용자 목록 조회 : GET /roles/{roleId}/users-with-paging
. 역할-사용자 등록 : POST /roles/{roleId}/users
. 역할-사용자 수정 : PUT /roles/{roleId}/users
. 역할-사용자 삭제 : DELETE /roles/{roleId}/users
. 역할-업무그룹 목록 조회 : GET /roles/{roleId}/workgroups
. 역할-업무그룹 등록 : POST /roles/{roleId}/workgroups
. 역할-업무그룹 삭제 : DELETE /roles/{roleId}/workgroups

== Entity Table & SQL

=== Entity Table

* TN_CF_ROLE : 역할
* TN_CF_USER_ROLE : 역할-사용자 맵핑
* TN_CF_WORKGROUP_ROLE : 역할-업무그룹 맵핑

=== SQL

. 역할 목록 조회

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

[start=2]
. 역할 상세정보 조회

[source,xml]
----
<select id="selectRole" parameterType="java.util.HashMap" resultMap="roleResult">
	SELECT <include refid="columnsRole" />
	FROM   <include refid="tableRole" />
	--생략--
----

[start=3]
. 역할 등록

[source,xml]
----
<insert id="insertRole" parameterType="role">
	INSERT INTO <include refid="tableRole" />
	(<include refid="columnsRole" />)
	--생략--
----

[start=4]
. 역할 수정

[source,xml]
----
<update id="updateRole"  parameterType="role" flushCache="true" >
	UPDATE <include refid="tableRole" />
	SET	   ROLE_NAME = #{roleName},
	--생략--
----

[start=5]
. 역할 삭제

[source,xml]
----
<update id="deleteRole" parameterType="role" flushCache="true" >
	UPDATE <include refid="tableRole" />
	SET    DELETE_YN = 1,
	--생략--
----

[start=6]
. 역할-사용자 목록 조회

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

[start=7]
. 역할-사용자 등록

[source,xml]
----
<insert id="insertUserRole" parameterType="userRole">
	INSERT INTO <include refid="tableUserRole" />
		(ROLE_ID, USER_ID, FROM_DATE, THRU_DATE,
	--생략--
----

[start=8]
. 역할-사용자 수정

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

[start=9]
. 역할-사용자 삭제

[source,xml]
----
<delete id="deleteUserRole" parameterType="java.util.HashMap">
	DELETE FROM <include refid="tableUserRole" />
	WHERE  USER_ID = #{userId}
	--생략--
----

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

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

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

[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=12]
. 역할-업무그룹 삭제

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