# imriadh/cofeeshopims architecture

> Architecture diagram of the GitHub repository imriadh/cofeeshopims, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/imriadh/cofeeshopims
- Repository: https://github.com/imriadh/cofeeshopims

## Overview

1. **System type and runtime**
   - This is a **Java desktop application** built with **Swing** and packaged with **Maven**.
   - It runs locally on the user’s machine and does not appear to depend on any remote backend or cloud service.

2. **Primary architectural style**
   - The code is organized as a classic **layered desktop app**:
     - **UI layer** for screens and user interactions
     - **DAO layer** for database access
     - **Model layer** for domain objects
     - **Service layer** for cross-cutting operations like PDF generation and backups
     - **Config layer** for database bootstrap and connection setup

3. **Entry point and application bootstrap**
   - `com.coffeeshop.Main` is the application entry point.
   - Startup likely initializes the UI theme, opens the login screen, and wires the app to the local SQLite database.

4. **User interface subsystem**
   - The UI is split into Swing frames and panels:
     - `LoginFrame` for authentication
     - `MainFrame` as the main shell/dashboard
     - `OrderPanel` for POS order entry
     - `ProductPanel` for inventory management
     - `ReportsPanel` for sales/reporting views
   - `DataUpdateListener` suggests the UI uses callback-style refreshes so panels can notify each other when data changes.

5. **Authentication and role-based access**
   - The readme describes **Admin** and **Staff** roles.
   - `User` and `UserDAO` likely back login and authorization checks.
   - Access control is a major boundary: staff are focused on order entry, while admin users can access inventory and reports.

6. **Domain model**
   - The business objects are simple POJOs in `com.coffeeshop.model`:
     - `User`
     - `Product`
     - `Order`
     - `OrderItem`
   - This model layer represents the core business data that flows between UI, persistence, and services.

7. **Persistence layer and data storage**
   - The app uses **SQLite** as an embedded, local database.
   - `DatabaseConfig` and `DatabaseInitializer` handle database connection setup and schema initialization/update.
   - DAOs (`UserDAO`, `ProductDAO`, `OrderDAO`) isolate SQL access from the UI and services.
   - The repository includes `coffee_db.sqlite` and SQL scripts in `extras/sql`, showing that schema setup and upgrades are first-class concerns.

8. **Operational data flow**
   - Typical flow appears to be:
     - User logs in through the UI
     - UI calls DAO to validate credentials and load state
     - Orders are created in the POS panel
     - `OrderDAO` persists the sale
     - Product stock is updated through `ProductDAO`
     - UI refreshes via the listener mechanism
   - This makes the database the central source of truth for inventory, users, and sales history.

9. **Receipt generation and file outputs**
   - `PdfService` generates **PDF receipts** for completed transactions.
   - Receipts are stored in the local `receipts/` directory, which is part of the project artifacts.
   - This is a second important persistence path besides the database: transaction metadata goes to SQLite, while formatted receipt documents go to the filesystem.

10. **Backup and maintenance**
   - `BackupService` indicates the app supports local backup/export behavior.
   - The presence of release assets and scripts suggests the app is intended to be deployable as a self-contained desktop package, not just run from source.

11. **Packaging and distribution**
   - The `release/` folder contains a prebuilt JAR, launch scripts, and a copy of the SQLite database.
   - The `extras/` directory includes build/run helpers, SQL setup scripts, and distribution documentation.
   - This points to an architecture optimized for **portable installation** and offline use.

12. **Technology boundaries that matter**
   - **Swing + FlatLaf**: desktop UI and theming
   - **SQLite + JDBC**: embedded persistence
   - **OpenPDF**: document generation for receipts
   - **Maven**: build and packaging
   - The app’s major integration points are therefore the local database, local filesystem, and PDF output—not external APIs.

13. **What to show in an architecture diagram**
   - Draw the UI as the top layer with separate screens/panels.
   - Show DAOs as the persistence boundary between UI/services and SQLite.
   - Show model classes as shared domain objects used by all layers.
   - Show `PdfService` and `BackupService` as supporting services that write to the filesystem.
   - Show login/role checks as a cross-cutting control path gating access to inventory, orders, and reports.

Main entry points: [`src/main/java/com/coffeeshop/config/DatabaseConfig.java`](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/config/DatabaseConfig.java) (DB Config), [`src/main/java/com/coffeeshop/ui/OrderPanel.java`](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/OrderPanel.java) (Order Panel), [`src/main/java/com/coffeeshop/dao/OrderDAO.java`](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/OrderDAO.java) (Order DAO), [`src/main/java/com/coffeeshop/dao/ProductDAO.java`](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/ProductDAO.java) (Product DAO)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_group_bootstrap["Bootstrap"]
  node_node_main(("Main<br/>entrypoint<br/>[Main.java]"))
end

subgraph group_group_ui["UI"]
  node_node_login["Login<br/>swing frame<br/>[LoginFrame.java]"]
  node_node_main_frame["Main Frame<br/>swing shell<br/>[MainFrame.java]"]
  node_node_order_panel["Order Panel<br/>pos panel<br/>[OrderPanel.java]"]
  node_node_product_panel["Product Panel<br/>inventory panel<br/>[ProductPanel.java]"]
  node_node_reports_panel["Reports Panel<br/>reporting panel<br/>[ReportsPanel.java]"]
  node_node_listener{{"Refresh Listener<br/>ui callback"}}
end

subgraph group_group_domain["Domain"]
  node_node_user["User<br/>domain model<br/>[User.java]"]
  node_node_product["Product<br/>domain model<br/>[Product.java]"]
  node_node_order["Order<br/>domain model<br/>[Order.java]"]
  node_node_order_item["Order Item<br/>domain model<br/>[OrderItem.java]"]
end

subgraph group_group_data["Data"]
  node_node_db_config["DB Config<br/>sqlite setup"]
  node_node_db_init["DB Init<br/>schema init"]
  node_node_user_dao["User DAO<br/>auth persistence<br/>[UserDAO.java]"]
  node_node_product_dao["Product DAO<br/>inventory persistence<br/>[ProductDAO.java]"]
  node_node_order_dao["Order DAO<br/>sales persistence<br/>[OrderDAO.java]"]
end

subgraph group_group_services["Services"]
  node_node_pdf["Pdf Service<br/>receipt generation<br/>[PdfService.java]"]
  node_node_backup["Backup Service<br/>maintenance<br/>[BackupService.java]"]
end

node_node_main -->|"init db"| node_node_db_config
node_node_main -->|"prepare schema"| node_node_db_init
node_node_main -->|"open"| node_node_login
node_node_login -->|"validate"| node_node_user_dao
node_node_login -->|"enter app"| node_node_main_frame
node_node_main_frame -->|"host"| node_node_order_panel
node_node_main_frame -->|"host"| node_node_product_panel
node_node_main_frame -->|"host"| node_node_reports_panel
node_node_order_panel -->|"save sale"| node_node_order_dao
node_node_order_panel -->|"update stock"| node_node_product_dao
node_node_order_panel -->|"receipt"| node_node_pdf
node_node_product_panel -->|"edit stock"| node_node_product_dao
node_node_reports_panel -->|"query sales"| node_node_order_dao
node_node_reports_panel -->|"query inventory"| node_node_product_dao
node_node_order_dao -->|"jdbc"| node_node_db_config
node_node_product_dao -->|"jdbc"| node_node_db_config
node_node_user_dao -->|"jdbc"| node_node_db_config
node_node_db_init -->|"bootstrap"| node_node_db_config
node_node_user_dao -->|"maps"| node_node_user
node_node_product_dao -->|"maps"| node_node_product
node_node_order_dao -->|"maps"| node_node_order
node_node_order_dao -->|"maps"| node_node_order_item
node_node_order_panel -.->|"notify"| node_node_listener
node_node_product_panel -.->|"notify"| node_node_listener
node_node_reports_panel -.->|"refresh"| node_node_listener
node_node_backup -->|"backup data"| node_node_db_config
node_node_backup -.->|"files"| node_node_pdf

click node_node_main "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/Main.java"
click node_node_db_config "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/config/DatabaseConfig.java"
click node_node_db_init "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/config/DatabaseInitializer.java"
click node_node_user_dao "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/UserDAO.java"
click node_node_product_dao "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/ProductDAO.java"
click node_node_order_dao "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/OrderDAO.java"
click node_node_user "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/User.java"
click node_node_product "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/Product.java"
click node_node_order "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/Order.java"
click node_node_order_item "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/OrderItem.java"
click node_node_login "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/LoginFrame.java"
click node_node_main_frame "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/MainFrame.java"
click node_node_order_panel "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/OrderPanel.java"
click node_node_product_panel "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/ProductPanel.java"
click node_node_reports_panel "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/ReportsPanel.java"
click node_node_listener "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/DataUpdateListener.java"
click node_node_pdf "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/service/PdfService.java"
click node_node_backup "https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/service/BackupService.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_node_main toneBlue
class node_node_login,node_node_main_frame,node_node_order_panel,node_node_product_panel,node_node_reports_panel,node_node_listener toneAmber
class node_node_user,node_node_product,node_node_order,node_node_order_item toneMint
class node_node_db_config,node_node_db_init,node_node_user_dao,node_node_product_dao,node_node_order_dao toneRose
class node_node_pdf,node_node_backup toneIndigo
```

## Components

### Bootstrap

Application entrypoint and startup wiring

- [Main](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/Main.java): entrypoint · Starts the desktop app and bootstraps the UI · `src/main/java/com/coffeeshop/Main.java`

### UI

Swing screens and panels

- [Login](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/LoginFrame.java): swing frame · Authentication screen · `src/main/java/com/coffeeshop/ui/LoginFrame.java`
- [Main Frame](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/MainFrame.java): swing shell · Primary window and navigation shell · `src/main/java/com/coffeeshop/ui/MainFrame.java`
- [Order Panel](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/OrderPanel.java): pos panel · Order entry and checkout workflow · `src/main/java/com/coffeeshop/ui/OrderPanel.java`
- [Product Panel](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/ProductPanel.java): inventory panel · Product management and stock updates · `src/main/java/com/coffeeshop/ui/ProductPanel.java`
- [Reports Panel](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/ReportsPanel.java): reporting panel · Sales and reporting views · `src/main/java/com/coffeeshop/ui/ReportsPanel.java`
- [Refresh Listener](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/ui/DataUpdateListener.java): ui callback · Notifies panels when data changes · `src/main/java/com/coffeeshop/ui/DataUpdateListener.java`

### Domain

Core business objects

- [User](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/User.java): domain model · Login identity and role data · `src/main/java/com/coffeeshop/model/User.java`
- [Product](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/Product.java): domain model · Inventory item and pricing data · `src/main/java/com/coffeeshop/model/Product.java`
- [Order](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/Order.java): domain model · Sale header and transaction summary · `src/main/java/com/coffeeshop/model/Order.java`
- [Order Item](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/model/OrderItem.java): domain model · Line item within an order · `src/main/java/com/coffeeshop/model/OrderItem.java`

### Data

Database configuration and DAOs

- [DB Config](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/config/DatabaseConfig.java): sqlite setup · Creates and configures the local database connection · `src/main/java/com/coffeeshop/config/DatabaseConfig.java`
- [DB Init](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/config/DatabaseInitializer.java): schema init · Initializes or updates the SQLite schema · `src/main/java/com/coffeeshop/config/DatabaseInitializer.java`
- [User DAO](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/UserDAO.java): auth persistence · Validates users and loads account data · `src/main/java/com/coffeeshop/dao/UserDAO.java`
- [Product DAO](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/ProductDAO.java): inventory persistence · Reads and updates product stock records · `src/main/java/com/coffeeshop/dao/ProductDAO.java`
- [Order DAO](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/dao/OrderDAO.java): sales persistence · Stores orders and order items in SQLite · `src/main/java/com/coffeeshop/dao/OrderDAO.java`

### Services

Supporting filesystem output and maintenance

- [Pdf Service](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/service/PdfService.java): receipt generation · Creates PDF receipts for completed transactions · `src/main/java/com/coffeeshop/service/PdfService.java`
- [Backup Service](https://github.com/imriadh/cofeeshopims/blob/main/src/main/java/com/coffeeshop/service/BackupService.java): maintenance · Supports local backup and export operations · `src/main/java/com/coffeeshop/service/BackupService.java`

## Connections

- Main → DB Config: init db · Startup wires the app to the local database
- Main → DB Init: prepare schema · Ensures schema exists before the UI opens
- Main → Login: open · Launches the authentication screen
- Login → User DAO: validate · Checks credentials against persisted users
- Login → Main Frame: enter app · Opens the main shell after successful login
- Main Frame → Order Panel: host · Embeds the order entry workflow
- Main Frame → Product Panel: host · Embeds inventory management
- Main Frame → Reports Panel: host · Embeds reporting views
- Order Panel → Order DAO: save sale · Persists completed orders
- Order Panel → Product DAO: update stock · Adjusts inventory after checkout
- Order Panel → Pdf Service: receipt · Generates a PDF receipt for the transaction
- Product Panel → Product DAO: edit stock · Reads and updates product records
- Reports Panel → Order DAO: query sales · Loads sales data for reporting
- Reports Panel → Product DAO: query inventory · Uses product data for summaries
- Order DAO → DB Config: jdbc · Uses the configured SQLite connection
- Product DAO → DB Config: jdbc · Uses the configured SQLite connection
- User DAO → DB Config: jdbc · Uses the configured SQLite connection
- DB Init → DB Config: bootstrap · Runs schema setup through the database connection
- User DAO → User: maps · Converts rows to user objects
- Product DAO → Product: maps · Converts rows to product objects
- Order DAO → Order: maps · Converts rows to order objects
- Order DAO → Order Item: maps · Handles order line items
- Order Panel → Refresh Listener: notify · Signals other views after order changes
- Product Panel → Refresh Listener: notify · Signals refresh after inventory edits
- Reports Panel → Refresh Listener: refresh · Responds to data change callbacks
- Backup Service → DB Config: backup data · Copies or exports local database state
- Backup Service → Pdf Service: files · Shares local filesystem output concerns
