= 내부 결재

== 개요
SDL에서 제공하는 내부결재 기능. +
결재를 위한 문서 Entity등록과 내부결재 후처리를 위한 Interceptor 클래스 구현으로 간단하게 결재 기능을 구현할 수 있다. +
샘플로 제공하는 화면의 결재 스텝을 지정하는 Component를 필요한 결재 문서 화면에 적용하여 사용할 수 있으며 샘플 Controller를 참조하여 문서와 결재 스텝 목록을 저장하여 approvalService.submit 메소드를 호출하면 된다.

== Table
* 결재 정보 : TN_CF_APPROVAL
* 결재 스텝 정보 : TN_CF_APPROVAL_STEP
* Sample Document : TN_CF_SAMPLE_APPROVAL_INTERNAL_DOCUMENT

== API
.ApprovalController.java

. 상신함 목록 조회(내부 결재) +
GET /internal-approvals/submit +
Query ID : selectInternalApprovalPagingListBySubmit
* 사용자가 상신한 내부결재 문서를 조회한다.

. 미결함 목록 조회(내부 결재) +
GET /internal-approvals/not-approve +
Query ID : selectInternalApprovalPagingListByNotApprove
* 미결중인 내부결재 문서를 조회한다.

. 기결함 목록 조회(내부 결재) +
GET /internal-approvals/approved +
Query ID : selectInternalApprovalPagingListByApproved
* 사용자가 결재 완료한 내부결재 문서를 조회한다.

. 통보함 목록 조회(내부 결재) +
GET /internal-approvals/notice +
Query ID : selectInternalApprovalPagingListByNotice
* 사용자가 통보 대상인 결재문서를 조회한다.

. 내부결재 문서 상신 취소 +
POST /internal-approvals/{approvalRequestId}/cancel +
Service : cancelInternalApproval
Query ID : updateInternalApprovalStep
* 결재 문서 상신을 취소한다.

. 내부결재 문서 결재 승인 또는 합의 +
POST /internal-approvals/{approvalRequestId}/confirm +
Service : confirmInternalApproval
Query ID : updateInternalApprovalStep
* 결재 문서 승인 또는 합의 한다.

. 내부결재 문서 반려 +
POST /internal-approvals/{approvalRequestId}/reject +
Service : rejectInternalApproval
Query ID : updateInternalApprovalStep
* 결재 문서를 반려 한다.

.ApprovalSampleController.java

. 내부결재 문서 목록 조회(페이징) +
GET /internal-approval/sample-document-with-paging +
Query ID : selectSampleApprovalDocumentPagingList
* Sample Document 문서 목록을 조회한다.

. 내부 결재 문서 상신(Sample Document) +
POST /internal-approval/submit/sample-document
* Knox 결재 정보 동기화 로직을 제외한 다른 부분은 Knox 결재 상신과 동일하다.
* 동기화 배치 로직 대상에서 제외된다.
* 내부결재 전후 처리 로직은 문서 타입별로 Interceptor 클래스를 구현하여 처리한다.
[source,java]
----
@Log4j2
@ApprovalDocumentType(names = {"internalSample"})
public class InternalApprovalSampleInterceptor implements ApprovalInterceptor {

    @Autowired
    InternalApprovalSampleService internalApprovalSampleService;
    @Override
    public void afterSubmit(Approval approval, List<ApprovalStep> approvalStepList, Map<String, Object> attribute) {
        log.debug("execute ApprovalSampleInterceptor afterSubmit");
        //상신 후 문서 상태 업데이트
        internalApprovalSampleService.updateSampleApprovalDocument(approval.getDbDocId(), ApprovalDocStatus.INPROCESS);
    }
    --생략--
}
----

== 화면

. 내부결재 문서 상신함

image::internalApproval_01.png[]
image::internalApproval_05.png[]
* 사용자가 상신한 내부결재 문서 목록을 조회한다.
* 상세화면에 진입하여 상신취소가 가능하다.

[start=2]
. 내부결재 문서 미결함

image::internalApproval_02.png[]
image::internalApproval_06.png[]
* 사용자의 결재 차순에 있는 내부결재 문서 목록을 조회한다.
* 상세화면에 진입하여 승인/합의 또는 반려가 가능하다.

[start=3]
. 내부결재 문서 기결함

image::internalApproval_03.png[]
* 사용자의 결재 완료한 내부결재 문서 목록을 조회한다.

[start=4]
. 내부결재 문서 통보함

image::internalApproval_04.png[]
* 결재 완료 후 사용자에게 통보된 내부결재 문서 목록을 조회한다.