Most inventory apps assume every product comes in a barcoded package. Real Indian retail doesn't work that way β a huge share of daily sales is loose rice, grain, sugar, and other commodities sold by weight, with no barcode to scan.
ShopEase handles both: packaged products via standard barcode scanning, and loose/unpackaged items via shop-generated barcodes with decimal-quantity tracking β so a shopkeeper can run their entire inventory from one phone.
π 1st Prize, LTCE Mumbai Mini Project Competition (2026)
π² Features Β· ποΈ Architecture Β· ποΈ Firebase Schema Β· π Getting Started Β· πΈ Screenshots
- Add, edit, and view products with full details (name, category, price, stock, barcode)
- Loose item support β shopkeepers generate their own barcodes for unpackaged goods (grain, rice, sugar, pulses) and track stock in decimal weight, not just whole units
- Barcode scanning via CameraX + ML Kit β instant, on-device
- Barcode generation (ZXing) for both packaged products and shop-created loose item labels
- Product images stored as compressed Base64 β no separate storage service needed
- Fast point-of-sale flow for both packaged and loose items
- Offline-first β sales and restocks queue locally and sync automatically when connectivity returns
- Stock updates in real time across staff devices
- Void incorrect sales or restocks directly from history
- Full sales and restock history with Today / This Week / This Month / All Time filters
- Clean, scannable transaction timeline
- π Best Sellers β top-performing products by revenue and quantity
- π’ Slow Movers β surfaces dead stock before it ties up capital
- ποΈ Category Breakdown β revenue by category
- π Trend Chart β sales over time, filterable by range
- Insights exportable straight to Excel
- Low-stock alerts, tuned per product
- Daily end-of-day stock check reminders
- Change password or log out from a dedicated settings screen
- Light/dark theme with persistent preference
- Configurable shop profile (name, type)
- Sales and restock records export to
.xlsx(Apache POI) β a format shop owners and accountants already trust
MVVM with a unidirectional data flow, offline-first by design:
Fragment (UI)
β
βΌ
ViewModel βββββββββββββββ LiveData
β
βΌ
Repository
β
ββββΆ Firebase Firestore (remote source of truth)
ββββΆ Local optimistic state (works offline, syncs when online)
| Layer | Technology |
|---|---|
| Language | Java |
| UI | XML Layouts + ViewBinding |
| Navigation | Android Navigation Component |
| Architecture | MVVM (Fragment β ViewModel β Repository) |
| Database | Firebase Firestore |
| Authentication | Firebase Auth |
| Barcode Scanning | CameraX + ML Kit |
| Barcode Generation | ZXing (CODE_128) |
| Image Storage | Compressed Base64 in Firestore |
| Excel Export | Apache POI |
| Background Tasks | WorkManager |
| Min SDK | 24 (Android 7.0) |
ShopEase/
βββ app/
β βββ src/main/
β βββ java/com/example/inventory/
β β βββ model/ # Product, Sale, Restock, Analytics
β β βββ repository/ # ProductRepository, SalesRepository, AnalyticsRepository
β β βββ viewmodel/ # ProductViewModel, SalesViewModel, DashboardViewModel
β β βββ ui/
β β β βββ auth/ # Login, Register, Splash
β β β βββ dashboard/ # DashboardFragment
β β β βββ product/ # Product list/detail/add/edit + loose item entry
β β β βββ sales/ # Sell, Restock, Sales & Restock history
β β β βββ analytics/ # AnalyticsFragment
β β β βββ alerts/ # Low stock alerts
β β β βββ settings/ # Account & app settings
β β β βββ scanner/ # Barcode scanning
β β βββ notifications/ # Low stock + daily reminder workers
β β βββ utils/ # Category, date, stock-rules helpers
β βββ res/
β βββ layout/ navigation/ values/ drawable/
βββ google-services.json # β οΈ NOT committed β add your own
βββ build.gradle
Firestore
βββ users/
βββ {userId}/
βββ settings/
β βββ shopInfo # { shopName, shopType, theme }
βββ products/
β βββ {barcode} # { name, category, price, stock,
β # unit, lowStockThreshold, image }
βββ sales/
β βββ {saleId} # { barcode, productName, quantity,
β # totalAmount, timestamp, voided }
βββ restocks/
β βββ {restockId} # { barcode, productName, quantity,
β # timestamp, voided }
βββ analytics/
βββ {barcode} # { totalUnitsSold, totalRevenue,
# salesCount, dailySales }
Product images are stored as compressed Base64 strings directly in Firestore β no separate storage service required.
- Android Studio Hedgehog or later
- JDK 17+
- A Firebase project with Firestore and Authentication enabled
- A physical Android device (barcode scanning needs a real rear camera β most emulators won't work)
git clone https://github.com/Vinay0825/ShopEase.git
cd ShopEase- Create a project in the Firebase Console, add an Android app with package name
com.example.inventory. - Download
google-services.jsonand place it inapp/. - Enable Authentication (Email/Password) and Cloud Firestore.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId}/{document=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}./gradlew assembleDebug
β οΈ Barcode scanning requires a physical device with a rear camera.
| Home | Product List | Add Product |
|---|---|---|
![]() |
![]() |
![]() |
| Product Detail | Loose Item Barcode | History |
|---|---|---|
![]() |
![]() |
![]() |
| Analytics | Low Stock Alert |
|---|---|
![]() |
![]() |
| Sales Report | Restock Report |
|---|---|
![]() |
![]() |
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Commit your changes
- Open a Pull Request, keeping the existing MVVM structure and conventions
MIT License β see LICENSE for details.
β Star this repo if you found it useful!









