# 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.