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.