'!includeurl https://raw.githubusercontent.com/xuanye/plantuml-style-c4/c4.puml
' uncomment the following line and comment the first to use locally
!include c4.puml

' Scope: A single software system.
' Primary elements: The software system in scope.
' Supporting elements: People and software systems directly connected to the software system in scope.
' Intended audience: Everybody, both technical and non-technical people, inside and outside of the software development team.




' Actors
' ##################################
skinparam actor<<person>> {
  BorderColor ACTOR_BORDER_COLOR
  BackgroundColor ACTOR_BG_COLOR
}

skinparam actor<<internal_person>> {
  BorderColor INTERNAL_ACTOR_BORDER_COLOR
  BackgroundColor INTERNAL_ACTOR_BG_COLOR
}


' Styling
' ##################################


skinparam rectangle<<person>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor PERSON_BG_COLOR
    BorderColor PERSON_BORDER_COLOR
}

skinparam rectangle<<external_person>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor EXTERNAL_PERSON_BG_COLOR
    BorderColor #8A8A8A
}

skinparam rectangle<<system>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor SYSTEM_BG_COLOR
    BorderColor #3C7FC0
}

skinparam rectangle<<external_system>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor EXTERNAL_SYSTEM_BG_COLOR
    BorderColor #8A8A8A
}

skinparam database<<system>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor SYSTEM_BG_COLOR
    BorderColor #3C7FC0
}

skinparam database<<external_system>> {
    StereotypeFontColor ELEMENT_FONT_COLOR
    FontColor ELEMENT_FONT_COLOR
    BackgroundColor EXTERNAL_SYSTEM_BG_COLOR
    BorderColor #8A8A8A
}

' Layout
' ##################################
!definelong LAYOUT_WITH_LEGEND_CN
hide stereotype
legend right
|=   颜色           |= 类型 |
|<PERSON_BG_COLOR>      | 用户 |
|<EXTERNAL_PERSON_BG_COLOR>      | 外部用户 |
|<SYSTEM_BG_COLOR>   | 系统 |
|<EXTERNAL_SYSTEM_BG_COLOR>      | 外部系统 |
endlegend
!enddefinelong

!definelong LAYOUT_WITH_LEGEND
hide stereotype
legend right
|=    color          |= Type |
|<PERSON_BG_COLOR>      | person |
|<EXTERNAL_PERSON_BG_COLOR>      | external person |
|<SYSTEM_BG_COLOR>   | system |
|<EXTERNAL_SYSTEM_BG_COLOR>      | external system |
endlegend
!enddefinelong

' Elements
' ##################################

!define Actor(e_alias, e_label) actor "==e_label" <<person>> as e_alias
!define Actor(e_alias, e_label, e_descr) actor "==e_label\n\n e_descr" <<person>> as e_alias

!define Actor_Ext(e_alias, e_label) actor "==e_label" <<internal_person>> as e_alias
!define Actor_Ext(e_alias, e_label, e_descr) actor "==e_label\n\n e_descr" <<internal_person>> as e_alias


!define Person(e_alias, e_label) rectangle "==e_label" <<person>> as e_alias
!define Person(e_alias, e_label, e_descr) rectangle "==e_label\n\n e_descr" <<person>> as e_alias

!define Person_Ext(e_alias, e_label) rectangle "==e_label" <<external_person>> as e_alias
!define Person_Ext(e_alias, e_label, e_descr) rectangle "==e_label\n\n e_descr" <<external_person>> as e_alias

!define System(e_alias, e_label) rectangle "==e_label" <<system>> as e_alias
!define System(e_alias, e_label, e_descr) rectangle "==e_label\n\n e_descr" <<system>> as e_alias

!define System_Ext(e_alias, e_label) rectangle "==e_label" <<external_system>> as e_alias
!define System_Ext(e_alias, e_label, e_descr) rectangle "==e_label\n\n e_descr" <<external_system>> as e_alias

!define SystemDb(e_alias, e_label) database "==e_label" <<system>> as e_alias
!define SystemDb(e_alias, e_label, e_descr) database "==e_label\n\n e_descr" <<system>> as e_alias

!define SystemDb_Ext(e_alias, e_label) database "==e_label" <<external_system>> as e_alias
!define SystemDb_Ext(e_alias, e_label, e_descr) database "==e_label\n\n e_descr" <<external_system>> as e_alias

' Boundaries
' ##################################

!define Enterprise_Boundary(e_alias, e_label) Boundary(e_alias, e_label, "Enterprise")
!define System_Boundary(e_alias, e_label) Boundary(e_alias, e_label, "System")