A full-featured, desktop-based Point of Sale (POS) system developed in Java with JavaFX for small to medium retail businesses.
Store-Mate is designed to manage sales, purchases, inventory, staff, and reporting efficiently. It includes features like Point of Sale (POS) in sales and returns mode, detailed reporting, employee management, and secure user authentication and role-based-access-controls.
Click below to watch a full walkthrough of StoreMate POS:
π Watch the 6-minute Demo Video
Hereβs a visual overview of the major pages and features of Store-Mate POS:
- Overview of sales, purchases, and recent transactions
- Quick links to POS, reports, and management pages
- Sales Mode: Add items, apply discounts, print receipts
- Returns Mode: Process returns and voids
- Track all sales and purchase transactions
- Filter by date, staff, or payment type
- Daily, weekly, and monthly reports
- Process refunds and void sales with proper logging
- Place purchase orders to suppliers
- Track incoming stock
- Add, edit, delete, and view records
- Search and filter functionality
- Each has child pages for detailed CRUD operations
- Add new staff members
- Assign roles (Admin, Cashier)
- Manage shifts
- User Profile: Change username, modify password, set security questions
- Additional settings pages (4 pages in total)
- Java 21+
- JavaFX (for desktop UI)
- JDBC + MySQL
- MVC Architecture
- Custom DAO Layer
- Connection Pooling
- Prepared Statements for security
- MySQL
- 18+ relational tables
- Foreign key constraints
- Indexed queries for performance
- JavaFX Controls, Layouts, Panes
- CSS-based theming
- Custom components (cards, tables, dialogs)
- Icon libraries (Ikonli / Material Design icons)
- Gradle
- IntelliJ IDEA / VS Code
- Git & GitHub for version control
- OneDrive-hosted demo video
- Logging & error handling
Follow these steps to run StoreMate POS on your local machine.
git clone https://github.com/jeet7122/Store-Mate.git
cd Store-MateWhen you run StoreMate POS for the very first time, the application will automatically detect that no database connection is configured.
You will be shown a Database Connection Form, where you must enter your MySQL credentials.
-
Launch the application
- If no DB configuration exists, the DB Setup Window will open automatically.
-
Enter your database details:
- Hostname (e.g.,
localhost) - Port (default:
3306) - Username
- Password
- Database name (e.g.,
storemate_pos)
- Hostname (e.g.,
-
Click βConnectβ
- If the credentials are valid, the app will establish the connection
- Your DB configuration will be saved for future use
- You will not need to enter this again
-
Register your first user
- After DB connection, you will be taken to the Employee Registration screen
- Create your admin/staff account
-
Login using your credentials
- Once registered, you can log in and begin using the system
Once the database connection is stored:
- The app will skip the DB form automatically on next launch
- You can directly log in and use the POS
- DB settings can be updated later from Settings β Database Configuration (if you include this feature)
Store-Mate/
β
βββ src/
β βββ main/
β βββ java/
β β βββ org/
β β βββ storemate/
β β βββ pos/
β β βββ dao/ # Data Access Objects (DB operations)
β β β βββ ProductDAO.java
β β β βββ EmployeeDAO.java
β β β βββ PurchaseDAO.java
β β β βββ ...
β β β
β β βββ database/ # DB connection classes
β β β βββ Config.java
β β β βββ DBConnection.java
β β β βββ TableConstants.java
β β β
β β βββ dto/ # Data Transfer Objects
β β β βββ ProductDTO.java
β β β βββ SecurityQuestionsDTO.java
β β β βββ ...
β β β
β β βββ models/ # POJO models
β β β βββ Product.java
β β β βββ Employee.java
β β β βββ Role.java (enum)
β β β βββ ...
β β β
β β βββ routing/ # Custom navigation system
β β β βββ Router.java
β β β
β β βββ services/ # Business logic
β β β βββ AuthService.java
β β β βββ POSService.java
β β β βββ PurchaseService.java
β β β βββ ...
β β β
β β βββ user_interface/
β β β βββ pages/ # Main application pages
β β β β βββ DashboardPage.java
β β β β βββ POSPage.java
β β β β βββ ReportsPage.java
β β β β βββ ...
β β β β
β β β βββ views/ # Reusable UI components
β β β β βββ EmployeeRegistrationFormView.java
β β β β βββ LoginFormView.java
β β β β βββ TableViewCard.java
β β β β βββ ...
β β β β
β β β βββ settingspages/ # Settings subpages
β β β βββ UserProfilePage.java
β β β βββ ChangePasswordPage.java
β β β βββ SecurityQuestionsPage.java
β β β βββ ModifyUsername.java
β β β
β β βββ utils/ # Helpers & utilities
β β β βββ Alerts.java
β β β βββ Session.java
β β β βββ TransitionUtil.java
β β β βββ SceneManager.java
β β β
β β βββ HelloApplication.java # JavaFX main class
β β βββ Launcher.java # Fixes runtime issues for JavaFX
β β βββ module-info.java
β β
β βββ resources/
β βββ css/ # Stylesheets
β βββ audio/ # UI sounds
β βββ icons/ # Material Icons / Ikonli logo
β βββ assets/ # App images, logos
β
βββ .gitignore
βββ README.md
Handles all direct database operations (CRUD queries). Keeps database logic separate from UI and business logic.
Contains DB configuration and table constants. Centralizes all DB connection logic.
Objects used for safe data transfer between layers without exposing raw models.
Entity classes (POJOs), mapping to database tables.
Your custom Router that switches pages (since you arenβt using FXML).
All business logic (authentication, POS calculations, inventory updates, etc.)
Each JavaFX additional pages (CRUD PAGES for [Products, Categories]) lives here.
JavaFX main pages stays here(DASHBOARD, POS, SETTINGS)
Pages related to user identity, credentials, security questions.
Reusable helpers for alerts, validation, sessions, music, etc.
Reusable components like (Cards, Tables, Graphs)
Images, icons, audio, CSS.
Once installed and set up, hereβs how you can navigate and use the system effectively:
- Launch the application.
- Enter your username and password created during the initial setup.
- If credentials are valid, youβll land on the Dashboard.
- Quick view of sales, purchases, and recent transactions.
- Access buttons for:
- POS (Sales / Returns)
- Reports (Sales, Purchases, Transactions)
- Staff & Inventory Management
- Sales Mode
- Add products by scanning or selecting from the list.
- Apply discounts if applicable.
- Print receipts after completing sales.
- Returns Mode
- Select past transactions.
- Process returns or void sales.
- Update inventory automatically.
- Add, edit, delete records with a simple form.
- Use search or filter to quickly locate items.
- Detailed CRUD for each entity ensures database integrity.
- Admins can create, edit, or deactivate staff accounts.
- Assign roles: Admin, Cashier.
- Track staff shifts and working hours.
- Generate daily, weekly, or monthly sales reports.
- Filter by date, staff, or payment type.
- Export reports if needed (feature can be added via CSV/PDF).
- User Profile: Update username, change password.
- Security Questions: Manage recovery options.
- Database Configuration: Update credentials if server or DB changes.
- Audio / Theme Settings: Customize UI look & feel (if implemented).
- Ensure MySQL server is running before launching the app.
- Keep JDBC driver compatible with your MySQL version.
- Avoid using reserved SQL keywords for table or column names.
- Use UTF-8 encoding to prevent character issues in product names or customer data.
- For large datasets, enable indexed queries in MySQL for faster performance.
- User authentication is role-based; only admins can modify sensitive data.
- Prepared statements are used to prevent SQL injection.
- Passwords should be stored hashed in the database (feature can be added if plain-text currently).
Contributions are welcome! If you want to:
- Fork the repository.
- Create a new branch for your feature/fix.
- Submit a pull request describing your changes.
- Follow the existing MVC structure and coding conventions.
LICENSE MIT Β© 2025 Team Store-Mate











