# Small Business Inventory System A comprehensive inventory management system for small businesses built with Python and FastAPI. ## Features - **User Management**: Secure authentication with JWT tokens and role-based access control - **Inventory Management**: Complete CRUD operations for inventory items with SKU and barcode support - **Category Management**: Organize inventory items by categories - **Supplier Management**: Track supplier information and relationships - **Stock Tracking**: Real-time stock levels with low stock alerts - **Transaction History**: Track all inventory movements (in/out/adjustments) - **Search & Filter**: Advanced search and filtering capabilities - **RESTful API**: Well-documented API endpoints with automatic OpenAPI documentation ## Tech Stack - **Framework**: FastAPI - **Database**: SQLite with SQLAlchemy ORM - **Authentication**: JWT tokens with bcrypt password hashing - **Migrations**: Alembic for database schema management - **Documentation**: Automatic API documentation with Swagger UI ## Installation & Setup 1. Install dependencies: ```bash pip install -r requirements.txt ``` 2. Set up environment variables (optional): ```bash export SECRET_KEY="your-secret-key-here" export ADMIN_EMAIL="admin@yourcompany.com" export ADMIN_PASSWORD="secure-admin-password" ``` 3. Run the application: ```bash uvicorn main:app --host 0.0.0.0 --port 8000 --reload ``` ## Environment Variables The following environment variables can be set: - `SECRET_KEY`: JWT secret key (defaults to development key - change in production!) - `ADMIN_EMAIL`: Initial admin user email (default: admin@example.com) - `ADMIN_PASSWORD`: Initial admin user password (default: admin123) **⚠️ Important**: Change the `SECRET_KEY`, `ADMIN_EMAIL`, and `ADMIN_PASSWORD` environment variables in production! ## API Documentation Once the application is running, you can access: - **Swagger UI**: http://localhost:8000/docs - **ReDoc**: http://localhost:8000/redoc - **OpenAPI JSON**: http://localhost:8000/openapi.json - **Health Check**: http://localhost:8000/health ## API Endpoints ### Authentication - `POST /api/v1/auth/login` - Login and get access token ### Users - `GET /api/v1/users/me` - Get current user info - `GET /api/v1/users/` - List all users (admin only) - `POST /api/v1/users/` - Create new user (admin only) ### Categories - `GET /api/v1/categories/` - List all categories - `POST /api/v1/categories/` - Create new category - `PUT /api/v1/categories/{id}` - Update category - `DELETE /api/v1/categories/{id}` - Delete category ### Suppliers - `GET /api/v1/suppliers/` - List all suppliers - `POST /api/v1/suppliers/` - Create new supplier - `PUT /api/v1/suppliers/{id}` - Update supplier - `DELETE /api/v1/suppliers/{id}` - Delete supplier ### Inventory - `GET /api/v1/inventory/` - List inventory items (with search/filter options) - `GET /api/v1/inventory/low-stock` - Get low stock items - `POST /api/v1/inventory/` - Create new inventory item - `GET /api/v1/inventory/{id}` - Get inventory item by ID - `GET /api/v1/inventory/sku/{sku}` - Get inventory item by SKU - `PUT /api/v1/inventory/{id}` - Update inventory item - `DELETE /api/v1/inventory/{id}` - Delete inventory item ### Transactions - `GET /api/v1/transactions/` - List inventory transactions - `POST /api/v1/transactions/` - Create new transaction (updates stock levels) - `GET /api/v1/transactions/{id}` - Get transaction by ID ## Database Schema The system uses SQLite with the following main entities: - **Users**: System users with authentication - **Categories**: Item categories for organization - **Suppliers**: Supplier information and contacts - **InventoryItems**: Main inventory items with pricing and stock info - **InventoryTransactions**: Track all stock movements ## Development - **Linting**: The project uses Ruff for code linting and formatting - **Database**: SQLite database stored in `/app/storage/db/` - **Migrations**: Use Alembic for database schema changes ## Default Admin User The system creates a default admin user on first run: - **Email**: admin@example.com (or value from `ADMIN_EMAIL` env var) - **Password**: admin123 (or value from `ADMIN_PASSWORD` env var) **⚠️ Security Note**: Change the default admin credentials immediately in production!