## Architecture Diagram ```plantuml !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml title Transaction Notifications - Architecture Diagram Person(brand_admin, "Brand / Stockiest Admin") System_Boundary(brand_web_system, "Brand Administration Web Application") { Container(brand_web, "Browser", "Software System", "All supported browser") Container(brand_app, "Brand Administration Web Application", "Nuxt.js", "Provides brand management functionalities to brand admin via their web browser") } System_Boundary(brand_mobile_system, "Brand Administration Mobile Application") { Container(brand_mobile, "Mobile Device", "Software System", "All supported device") Container(brand_mobile_app, "Brand Administration Mobile Application", "Flutter", "Provides brand management functionalities to brand admin via their mobile application") } System_Boundary(api_endpoint, "API Endpoint") { Container(evm_brand, "evm-brand API", "Golang", "Provides brand management functionalities via HTTPS / REST / JSON API") Container(evm_disbursement, "evm-disbursement API", "Golang", "Provides notifications functionalities via HTTPS / REST / JSON API") Container(external_flip_service, "external-flip-service API", "", "Provides notifications functionalities via HTTPS / REST / JSON API") } ContainerDb(db_evm, "Database", "MySQL", "evm schema") ContainerDb(db_evm_disbursement, "Database", "MySQL", "evm_disbursement schema") Rel(brand_admin, brand_web, "Withdraw Balance", "Client Device") Rel(brand_admin, brand_mobile, "Withdraw Balance", "Client Device") Rel_R(brand_web, brand_app, "Access", "HTTPS") Rel_L(brand_mobile, brand_mobile_app, "Access", "HTTPS") Rel(brand_app, evm_brand, "Makes API calls to", "HTTPS / REST / JSON") Rel(brand_mobile_app, evm_brand, "Makes API calls to", "HTTPS / REST / JSON") Rel_R(evm_brand, evm_disbursement, "Makes API calls to", "HTTPS / REST / JSON") Rel(evm_brand, db_evm, "Reads from & Writes to", "TCP/IP") Rel(evm_disbursement, db_evm_disbursement, "Reads from & Writes to", "TCP/IP") Rel_R(evm_disbursement, external_flip_service,"Makes API calls to", "HTTPS / REST / JSON") ``` ## Database Design ```plantuml hide circle 'skinparam linetype ortho skinparam class { ArrowColor #FF7878 BackgroundColor #FFF89A BorderColor #694E4E } title Database Schema entity "[evm] brand" as b { *id: bigint(20) -- brandParentId: bigint(20) <<FK>> warehouseShelfId: bigint(20) <<FK>> warehouseZoneId: bigint(20) <<FK>> partnershipId: bigint(20) <<FK>> code: varchar(20) slug: text name: varchar(100) type: enum logoUrl: text coverImageUrl: text commissionPercentage: float commissionPrice: float vendorCommissionPercentage: float vendorCommissionPrice: float courierFee: bigint(20) picName: varchar(255) picPhone: varchar(255) picAddress: varchar(255) stockLocation: int(11) ... createdTime: datetime updatedTime: datetime updatedBy: bigint(20) isActive: boolean isRemoved: boolean } entity "[evm] brand_bank" as b_bank { *id: bigint(20) -- brandId: bigint(20) <<FK>> bankId: bigint(20) bankCode: char(5) bankName: varchar(100) accountName: varchar(150) accountNumber: varchar(75) createdTime: timestamp createdBy: bigint(20) updatedTime: timestamp updatedBy: bigint(20) removedTime: timestamp removedBy: bigint(20) } entity "[disbursement] disbursement" as disbursement { *id: varchar(36) -- account_name: varchar(100) account_number: varchar(20) amount: decimal(5) reference_id: varchar(30) <<FK>> bank_name: varchar(150) channel_bank_code: varchar(30) <<FK>> ... created_at: timestamp created_by: varchar(36) updated_at: timestamp updated_by: varchar(36) } entity "[disbursement] disbursement_bank" as disbursement_bank { *id: varchar(36) -- channel: varchar(100) bank_code: varchar(10) channel_bank_code: varchar(30) channel_bank_name: varchar(30) bank_name: varchar(150) channel_bank_code: varchar(30) ... created_at: timestamp created_by: varchar(36) updated_at: timestamp updated_by: varchar(36) } b ||--|{ b_bank b ||--|{ disbursement disbursement_bank ||--|{ disbursement ``` ## evm-brand ### Brand Create Withdrawal ```plantuml skinparam responseMessageBelowArrow true title Existing Interaction Diagram participant "client" as c participant "evm-brand" as eb participant "evm-disbursement" as ed database "evm" as evm database "disbursement" as d database "flip-service" as fs c -> eb : process create withdrawal activate eb alt if client unauthorized eb -> c : error unauthorized end eb -> evm : get & check brand_balance activate evm return brand_balance data eb->ed : get & check withdrawal limit activate ed ed->d : get data withdrawal limit activate d return withdrawal limit data return withdrawal limit data eb -> evm : update brand balance eb -> ed : create disbursement activate ed ed -> fs : process disbursement activate fs return disbursement_data ed -> d : insert disbursement data activate d return disbursement data return disbursement data return disbursement data ``` ```plantuml skinparam responseMessageBelowArrow true title Proposed Interaction Diagram participant "client" as c participant "evm-brand" as eb participant "evm-disbursement" as ed database "evm" as evm database "disbursement" as d database "flip-service" as fs c -> eb : process create withdrawal activate eb alt if client unauthorized eb -> c : error unauthorized end eb -> evm : get & check brand_balance activate evm return brand_balance data eb -> ed : bank account number validation activate ed ed -> fs : check general bank + account number activate fs return account number validation data return account number validation data eb->ed : get & check withdrawal limit activate ed ed->d : get data withdrawal limit activate d return withdrawal limit data return withdrawal limit data eb -> evm : update brand balance eb -> ed : create disbursement activate ed ed -> fs : process disbursement activate fs return disbursement_data ed -> d : insert disbursement data activate d return disbursement data return disbursement data return disbursement data ``` ## evm-disbursement ### Create Disbursement ```plantuml skinparam responseMessageBelowArrow true title Existing Interaction Diagram participant "client" as c participant "evm-disbursement" as ed database "disbursement" as d database "flip-service" as fs c -> ed : process create disbursement activate ed alt if client unauthorized ed -> c : error unauthorized end ed -> fs : process disbursement activate fs return disbursement_data ed -> d : insert disbursement data activate d return disbursement data return disbursement data ``` ```plantuml skinparam responseMessageBelowArrow true title Proposed Interaction Diagram participant "client" as c participant "evm-disbursement" as ed database "disbursement" as d database "flip-service" as fs c -> ed : process create disbursement activate ed alt if client unauthorized ed -> c : error unauthorized end ed -> fs : check general bank + bank account number validation activate fs return account number validation data ed -> fs : process disbursement activate fs return disbursement_data ed -> d : insert disbursement data activate d return disbursement data return disbursement data ```