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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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.