@startuml
!theme mono

title 06. Todo 관리 및 추적 - 이벤트스토밍 플로우

actor "Todo 담당자" as Assignee
actor "회의 주최자" as Organizer
participant "Todo 시스템" as System
participant "알림 시스템" as Notification
participant "캘린더 시스템" as Calendar
participant "회의록 시스템" as MeetingNote

== Todo 할당 ==

System -> System : **커맨드**: Todo 할당하기\n(데이터: Todo ID, 담당자, 마감일, 우선순위)
activate System
System -> System : Todo 등록
System --> System : **이벤트**: Todo가 할당됨\n(데이터: Todo ID, 담당자, 마감일, 할당 시간)
deactivate System

note right of System
**Policy/Rule**:
Todo 할당 시 →
담당자에게 즉시 알림 발송
end note

System -> Notification : **커맨드**: 담당자에게 알림 보내기\n(데이터: Todo 정보, 알림 채널)
activate Notification
Notification -> Assignee : 이메일/슬랙 알림
Notification --> System : **이벤트**: 담당자에게 알림이 발송됨\n(데이터: 알림 ID, 발송 시간, 발송 채널)
deactivate Notification

System -> Calendar : 마감일 캘린더 등록
Calendar --> System : 캘린더 등록 완료

== Todo 진행 상황 업데이트 ==

Assignee -> System : **커맨드**: Todo 진행 상황 업데이트하기\n(데이터: Todo ID, 진행률, 상태)
activate System
System -> System : 진행 상황 저장
System --> Assignee : **이벤트**: Todo 진행 상황이 업데이트됨\n(데이터: 업데이트 시간, 진행률, 상태: 시작 전/진행 중/완료)
deactivate System

System -> Notification : 주최자에게 진행 상황 알림
Notification -> Organizer : 진행 상황 공유

== 마감일 리마인더 ==

note right of System
**Policy/Rule**:
마감일 3일 전 →
자동 리마인더 발송
end note

System -> System : 마감일 모니터링
System --> System : **이벤트**: 마감일이 임박함\n(데이터: Todo ID, 남은 시간)

System -> Notification : **커맨드**: 리마인더 발송하기\n(데이터: Todo ID, 리마인더 시간)
activate Notification
Notification -> Assignee : 마감일 3일 전 알림
Notification --> System : **이벤트**: 리마인더가 발송됨\n(데이터: 리마인더 ID, 발송 시간)
deactivate Notification

== 마감일 당일 미완료 ==

alt 마감일 당일 미완료
    note right of System
    **Policy/Rule**:
    마감일 당일 미완료 시 →
    긴급 알림 발송
    end note

    System -> Notification : 긴급 알림
    Notification -> Assignee : 마감일 경고
    Notification -> Organizer : 지연 알림
end

== Todo 완료 ==

Assignee -> System : **커맨드**: Todo 완료 처리하기\n(데이터: Todo ID, 완료 시간, 완료자)
activate System
System -> System : 완료 상태 업데이트
System --> Assignee : **이벤트**: Todo가 완료됨\n(데이터: 완료 시간, 완료자)
deactivate System

note right of System
**Policy/Rule**:
Todo 완료 시 →
회의록에 완료 상태 자동 반영
end note

System -> MeetingNote : 회의록 업데이트
MeetingNote --> System : **이벤트**: 회의록에 완료 상태가 반영됨\n(데이터: 반영 시간, 회의록 버전)

System -> Notification : 완료 알림 발송
Notification -> Organizer : Todo 완료 알림

== 모든 Todo 완료 ==

alt 모든 Todo 완료
    note right of System
    **Policy/Rule**:
    모든 Todo 완료 시 →
    회의 주최자에게 완료 알림
    end note

    System -> Notification : 전체 완료 알림
    Notification -> Organizer : 회의 액션 아이템 완료
end

note over Assignee, MeetingNote
**Actor**: Todo 담당자, 회의 주최자, AI 시스템
**External System**: 알림 시스템, 캘린더 시스템, 회의록 시스템
**커맨드 데이터**: Todo 정보, 담당자, 마감일, 진행 상황
**이벤트 데이터**: Todo 상태, 완료 여부, 리마인더 발송
end note

@enduml
