System Components Design
After we have designed the user journey, we can proceed to design the system processes.
But before that, let’s take stock of the various components available in the system, because the sequence diagrams will not make sense if we don’t know what are the components that will interact with each other. We also want to list down what are the various actions available on each component, so that later on we will have the verbs to describe the interactions between components.
For convenience, we will use Class Diagram syntax to illustrate the various components, but we need to be aware that not all components correspond exactly to a class each. For example, Invoicing is a relatively complex component that consists of multiple models, which loosely translate to a class each.
WorkLog
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class WorkLog
WorkLog: +list(filters)
WorkLog: +view(id)
WorkLog: +create()
WorkLog: +edit(id)
WorkLog: +delete(id)
WorkLog: +isUsed(id)
WorkLog Component.
Tag
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Tag
Tag: +list()
Tag: +view(id)
Tag: +create()
Tag: +createIfNotExists()
Tag: +edit(id)
Tag: +delete(id)
Tag: +isUsed(id)
Tag Component.
Contact
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Contact
Contact: +list()
Contact: +view(id)
Contact: +create()
Contact: +edit(id)
Contact: +delete(id)
Contact: +isUsed(id)
Contact Component.
Currency
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Currency
Currency: +list()
Currency: +view(id)
Currency: +create()
Currency: +edit(id)
Currency: +delete(id)
Currency: +isUsed(id)
Currency Component.
Transaction
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Transaction
Transaction: +list()
Transaction: +view(id)
Transaction: +create(type, associated_id)
Transaction: +edit(id)
Transaction: +delete(id)
Transaction: +isUsed(id)
Transaction Component.
Template
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Template
Template: +list(types)
Template: +view(id)
Template: +create()
Template: +edit(id)
Template: +delete(id)
Template: +isUsed(id)
Template Component.
Sequence
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Sequence
Sequence: +list()
Sequence: +view(id)
Sequence: +create()
Sequence: +delete(id)
Sequence: +isUsed(id)
Sequence Component.
Invoicing
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Invoicing
Invoicing: +listConfigs()
Invoicing: +viewConfig(configId)
Invoicing: +createConfig()
Invoicing: +editConfig(configId)
Invoicing: +deleteConfig(configId)
Invoicing: +configIsUsed(configId)
Invoicing: +listInvoices()
Invoicing: +viewInvoice(invoiceId)
Invoicing: +previewInvoice(options, workLogs, invoiceLines)
Invoicing: +generateInvoiceFromPreview(tempId)
Invoicing: +generateInvoice(options, workLogs, invoiceLines)
Invoicing: +editInvoice(invoiceId)
Invoicing: +voidInvoice(invoiceId)
Invoicing Component.
Billing
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Billing
Billing: +listConfigs()
Billing: +viewConfig(id)
Billing: +createConfig(id)
Billing: +editConfig(id)
Billing: +deleteConfig(id)
Billing: +isUsed(id)
Billing Component.
Receipt
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Receipt
Receipt: +listConfigs()
Receipt: +viewConfig(configId)
Receipt: +createConfig()
Receipt: +editConfig(configId)
Receipt: +deleteConfig(configId)
Receipt: +configIsUsed(configId)
Receipt: +listIncomeReceipts()
Receipt: +viewIncomeReceipt(receiptId)
Receipt: +previewIncomeReceipt(invoiceId, options)
Receipt: +generateIncomeReceiptFromPreview(tempId)
Receipt: +generateIncomeReceipt(invoiceId, options)
Receipt: +editIncomeReceipt(receiptId)
Receipt: +voidIncomeReceipt(receiptId)
Receipt: +uploadIncomeReceipt()
Receipt: +deleteUploadedIncomeReceipt(id)
Receipt: +listExpenseReceipts()
Receipt: +viewExpenseReceipt(receiptId)
Receipt: +uploadExpenseReceipt()
Receipt: +deleteUploadedExpenseReceipt(id)
Receipt Component.
Document
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Document
Document: +list()
Document: +view(id)
Document: +create()
Document: +tag(id, tags)
Document: +delete(id)
Document: +download(filters)
Document Component.
Taxation
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Taxation
Taxation: +listTaxTables()
Taxation: +viewTaxTable(tableId)
Taxation: +createTaxTable()
Taxation: +editTaxTable(tableId)
Taxation: +deleteTaxTable(tableId)
Taxation: +listTaxTiers(tableId)
Taxation: +viewTaxTier(tierId)
Taxation: +createTaxTier()
Taxation: +editTaxTier(tierId)
Taxation: +deleteTaxTier(tierId)
Taxation: +listTaxDeductibles()
Taxation: +viewTaxDeductible(deductibleId)
Taxation: +createTaxDeductible()
Taxation: +editTaxDeductible(deductibleId)
Taxation: +deleteTaxDeductible(deductibleId)
Taxation: +estimateTaxes(tableId)
Taxation Component.
Chart
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class Chart
Chart: +list()
Chart: +view(id)
Chart: +create(options)
Chart: +edit(id)
Chart: +delete(id)
Chart Component.
RecurringTask
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class RecurringTask
RecurringTask: +listTasks()
RecurringTask: +viewTask(taskId)
RecurringTask: +createTask()
RecurringTask: +editTask(taskId)
RecurringTask: +deleteTask(taskId)
RecurringTask: +disableTask(taskId)
RecurringTask: +endTask(taskId)
RecurringTask: +runTask(taskId)
RecurringTask: +taskIsUsed(taskId)
RecurringTask: +listSteps()
RecurringTask: +viewStep(stepId)
RecurringTask: +createStep()
RecurringTask: +editStep(stepId)
RecurringTask: +deleteStep(stepId)
RecurringTask: +stepIsUsed(taskId)
RecurringTask: +listTaskRuns()
RecurringTask: +viewTaskRun(runId)
RecurringTask: +listStepRuns()
RecurringTask: +viewStepRun(stepRunId)
RecurringTask Component.
SystemConfig
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class SystemConfig
SystemConfig: +list()
SystemConfig: +view(id)
SystemConfig: +viewLatest()
SystemConfig: +create()
SystemConfig: +deactivate(id, effectiveEnd)
SystemConfig Component.
UserProfile
%%{
init: {
'theme': 'base',
'themeVariables': {
"primaryColor": "#f4e3d7",
"primaryTextColor": "#502d16",
"primaryBorderColor": "#784421",
"lineColor": "#784421",
"secondaryColor": "#a05a2c",
"tertiaryColor": "#c87137"
}
}
}%%
classDiagram
class User
User: +view(id)
User: +create(credentials)
User: +authenticate(credentials)
User: +edit(id)
User Component.
We’re Ready
Now that we have the system components in order, we can move on to design the sequence diagrams using these components and their functions. Note that these component functions are what we have identified as the actions available based on the user journey, it is possible that more functions are required behind the scene that the user will not see. In such situations, we just simply revisit the components and add to their functionalities accordingly.