digraph InventoryManagementSystem { rankdir=TB; node [shape=record, fontname="Arial", fontsize=10]; edge [fontname="Arial", fontsize=9]; // Core Model Classes Address [label="{Address|+ street: String\l+ city: String\l+ state: String\l+ zip: String\l|+ getStreet(): String\l+ setStreet(String): void\l+ getCity(): String\l+ setCity(String): void\l+ getState(): String\l+ setState(String): void\l+ getZip(): String\l+ setZip(String): void\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"]; Customer [label="{Customer|# id: String\l# updated: ZonedDateTime\l- phone: String\l- mailing: Address\l- email: String\l- nameFirst: String\l- nameLast: String\l|+ Customer()\l+ Customer(String, String, String, String)\l+ getId(): String\l+ setId(String): void\l+ getPhone(): String\l+ setPhone(String): void\l+ getMailing(): Address\l+ setMailing(Address): void\l+ getEmail(): String\l+ setEmail(String): void\l+ getNameFirst(): String\l+ setNameFirst(String): void\l+ getNameLast(): String\l+ setNameLast(String): void\l}"]; InventoryPiece [label="{«abstract»\lInventoryPiece|+ id: String\l+ price: float\l+ created: ZonedDateTime\l+ title: String\l+ description: String\l+ Author: String\l- iventoryType: InventoryType\l|+ InventoryPiece()\l+ InventoryPiece(InventoryType)\l+ isArt(InventoryPiece): Boolean\l+ getType(): String\l+ getId(): String\l+ setId(String): void\l+ getPrice(): float\l+ setPrice(float): void\l+ getCreated(): ZonedDateTime\l+ setCreated(ZonedDateTime): void\l+ getTitle(): String\l+ setTitle(String): void\l+ getDescription(): String\l+ setDescription(String): void\l+ getAuthor(): String\l+ setAuthor(String): void\l}"]; Transaction [label="{Transaction|- id: String\l- created: ZonedDateTime\l- completed: ZonedDateTime\l- customerId: String\l- shipToAddress: Address\l- customerInventoryList: InventoryList\l- attributes: JsonArray\l|+ Transaction()\l+ getId(): String\l+ setId(String): void\l+ getCreated(): ZonedDateTime\l+ setCreated(ZonedDateTime): void\l+ getCompleted(): ZonedDateTime\l+ setCompleted(ZonedDateTime): void\l}"]; // Inventory Subclasses Drawing [label="{Drawing|+ style: String\l+ technique: String\l+ category: String\l|+ Drawing()\l}"]; Painting [label="{Painting|- height: int\l- width: int\l- style: String\l- technique: String\l- category: String\l|+ Painting()\l}"]; Print [label="{Print|- openEditionType: String\l- category: String\l|+ Print()\l+ Print(String, String)\l+ getOpenEditionType(): String\l+ setOpenEditionType(String): void\l+ getCategory(): String\l+ setCategory(String): void\l}"]; Sculpture [label="{Sculpture|- material: String\l- weight: float\l|+ Sculpture()\l}"]; // Enums InventoryType [label="{«enumeration»\lInventoryType|PAINTING\lDRAWING\lPRINT\lSCULPTURE\l}"]; TransactionOperationEnum [label="{«enumeration»\lTransactionOperationEnum|Completed\lDraft\lPricing\lRemoved\lShipping\l}"]; // Collections CustomerList [label="{CustomerList|+ CustomerList()\l}"]; InventoryList [label="{InventoryList|+ InventoryList()\l}"]; TransactionList [label="{TransactionList|+ TransactionList()\l+ add(Transaction): boolean\l}"]; // Managers CustomerManager [label="{CustomerManager|- INSTANCE: CustomerManager\l+ CUSTOMERS: CustomerList\l|+ getInstance(): CustomerManager\l+ add(Customer): boolean\l- check(Customer): void\l+ findById(String): Customer\l+ findByEmail(String): Customer\l}"]; InventoryManager [label="{InventoryManager|- INSTANCE: InventoryManager\l+ INVENTORY: InventoryList\l|+ getInstance(): InventoryManager\l+ getArtPieceTypes(): Set\l+ add(InventoryPiece): void\l+ find(String): InventoryPiece\l+ update(InventoryPiece): InventoryPiece\l+ save(): void\l+ loadAll(): void\l+ Remove(InventoryPiece): void\l}"]; TransactionManager [label="{TransactionManager|- INSTANCE: TransactionManager\l+ TRANSACTIONS: TransactionList\l|+ getInstance(): TransactionManager\l+ TransactRequest(Customer, InventoryList, Transaction): Transaction\l+ compute(Transaction, TransactionOperationEnum): void\l+ compute(Transaction): void\l+ complete(Transaction): void\l+ findByCustomerEmail(String): TransactionList\l+ findByTransactionId(String): TransactionList\l+ findByTransactionDate(ZonedDateTime): TransactionList\l+ remove(Transaction): void\l+ save(): void\l}"]; DataRepository [label="{DataRepository|- INSTANCE: DataRepository\l|+ getInstance(): DataRepository\l+ generateRandomID(int): String\l+ generateRandom10DigitID(): String\l+ WalkFileSystemTree(InventoryManager): void\l+ WalkFileSystemTree(CustomerManager): void\l+ WalkFileSystemTree(TransactionManager): void\l+ mapJsonToObjectList(String, Class): List\l}"]; // Exceptions InvalidRecordDataException [label="{InvalidRecordDataException|+ InvalidRecordDataException(String)\l+ InvalidRecordDataException(String, Throwable)\l+ InvalidRecordDataException(Throwable)\l}"]; InvalidArtOperationException [label="{InvalidArtOperationException|+ InvalidArtOperationException(String)\l+ InvalidArtOperationException(String, Throwable)\l+ InvalidArtOperationException(Throwable)\l}"]; InvalidTransactionException [label="{InvalidTransactionException|+ InvalidTransactionException(String)\l+ InvalidTransactionException(String, Throwable)\l+ InvalidTransactionException(Throwable)\l}"]; InvalidTransOperationException [label="{InvalidTransOperationException|+ InvalidTransOperationException(String)\l+ InvalidTransOperationException(String, Throwable)\l+ InvalidTransOperationException(Throwable)\l}"]; // Inheritance relationships Drawing -> InventoryPiece [arrowhead=empty, label="extends"]; Painting -> InventoryPiece [arrowhead=empty, label="extends"]; Print -> InventoryPiece [arrowhead=empty, label="extends"]; Sculpture -> InventoryPiece [arrowhead=empty, label="extends"]; CustomerList -> "ArrayList" [arrowhead=empty, label="extends"]; InventoryList -> "ArrayList" [arrowhead=empty, label="extends"]; TransactionList -> "ArrayList" [arrowhead=empty, label="extends"]; InvalidRecordDataException -> RuntimeException [arrowhead=empty, label="extends"]; InvalidArtOperationException -> RuntimeException [arrowhead=empty, label="extends"]; InvalidTransactionException -> RuntimeException [arrowhead=empty, label="extends"]; InvalidTransOperationException -> RuntimeException [arrowhead=empty, label="extends"]; // Associations Customer -> Address [arrowhead=open, label="mailing"]; Transaction -> Address [arrowhead=open, label="shipToAddress"]; Transaction -> InventoryList [arrowhead=open, label="customerInventoryList"]; CustomerManager -> CustomerList [arrowhead=open, label="CUSTOMERS"]; InventoryManager -> InventoryList [arrowhead=open, label="INVENTORY"]; TransactionManager -> TransactionList [arrowhead=open, label="TRANSACTIONS"]; InventoryPiece -> InventoryType [arrowhead=open, label="iventoryType"]; // Dependencies CustomerManager -> InvalidRecordDataException [style=dashed, arrowhead=open, label="throws"]; DataRepository -> InventoryManager [style=dashed, arrowhead=open]; DataRepository -> CustomerManager [style=dashed, arrowhead=open]; DataRepository -> TransactionManager [style=dashed, arrowhead=open]; TransactionManager -> Customer [style=dashed, arrowhead=open]; TransactionManager -> TransactionOperationEnum [style=dashed, arrowhead=open]; // Invisible nodes for layout "ArrayList" [shape=plaintext, label=""]; "ArrayList" [shape=plaintext, label=""]; "ArrayList" [shape=plaintext, label=""]; RuntimeException [shape=plaintext, label=""]; }