commit 37b0762921e8597f7bfc0864fab6cafd89d45bcf Author: BACHIR SOULDI Date: Thu Jul 16 14:29:15 2026 +0100 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..b8c39a9 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# Inventory App + +A Flutter mobile app for conducting physical stock inventories against an [Axelor](https://axelor.com/) ERP backend. Warehouse staff scan product QR codes, count stock by zone, and submit inventory lines directly to Axelor's REST API. + +## Features + +- **Login** against the Axelor ERP using session-cookie authentication, with the session persisted locally and re-validated on app start. +- **Inventory counting** — scan a product QR code, pick a zone/stock location, choose a counting type (`Comptage 1`, `Comptage Contrôle`), enter a quantity and condition, and submit the count as an `InventoryLine`. +- **Zone scanning** — scan a location QR code to auto-select the stock location for the current count. +- **Product creation** — create a new product on the fly (name, family/sub-family, serial number, condition) with an initial inventory line, including a picture upload flow. +- **My Scans** — review the inventory lines the current user has already submitted. +- **Bureau inventory** — a dedicated search/review screen for inventory lines at a given location. +- **Panoramic viewer** — 360° image viewer tab. +- **Profile** — view the logged-in user's Axelor profile and log out. +- **Light/dark theme** support. + +## Tech stack + +- [Flutter](https://flutter.dev/) / Dart +- [GetX](https://pub.dev/packages/get) for state management, routing, and dependency injection +- [Dio](https://pub.dev/packages/dio) + [cookie_jar](https://pub.dev/packages/cookie_jar) for HTTP calls and session-cookie handling against Axelor's REST API +- [get_storage](https://pub.dev/packages/get_storage) for local session persistence +- [qr_code_scanner_plus](https://pub.dev/packages/qr_code_scanner_plus) for QR scanning +- [image_picker](https://pub.dev/packages/image_picker) for product photo capture/upload + +## Project structure + +``` +lib/ + controllers/ # GetX controllers (home, user, theme, simple UI state) + models/ # Axelor entity DTOs (Product, Depot, InventoryLine, TrackingNumber, ...) + service/ # AxelorClient (REST API) and product image upload flow + views/ # Screens (login, home, QR scanner, product view, profile, ...) + widgets/ # Shared glassmorphism-style UI components + utils.dart # Local, gitignored config (Axelor endpoints) — see Setup below + constants.dart # App-wide constants and text styles +``` + +## Setup + +### Prerequisites + +- [Flutter SDK](https://flutter.dev/docs/get-started/install) (Dart SDK `^3.7.2`, see `pubspec.yaml`) +- Access to an Axelor ERP instance to point the app at + +### 1. Install dependencies + +```bash +flutter pub get +``` + +### 2. Configure the Axelor endpoint (required — the app will not build without this) + +Two files hold real, environment-specific values and are gitignored so they never get committed. Copy each template and fill in your own values: + +```bash +cp lib/utils.example.dart lib/utils.dart +cp android/app/src/main/res/xml/network_security_config.xml.example android/app/src/main/res/xml/network_security_config.xml +``` + +- **`lib/utils.dart`** — sets `Utils.url` (the Axelor base URL, e.g. `https://your-erp-host.example.com/prod`) and `Utils.ticketUrl` (an external ticketing link opened from the drawer). +- **`android/.../network_security_config.xml`** — Android's cleartext-traffic domain allowlist. Set the `` entry to match the host in `Utils.url` (only needed if your ERP is served over plain HTTP; otherwise this can be left with a dummy value). + +### 3. Run the app + +```bash +flutter run +``` + +## Notes + +- The inventory ID targeted by counts is hardcoded in [`lib/constants.dart`](lib/constants.dart) (`kInventoryId`) — update it to match the active inventory in your Axelor instance. +- Session cookies are persisted via `get_storage` and validated against Axelor on each app start; an invalid/expired session bounces the user back to the login screen.