from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from app.db.session import get_db from app.crud import inventory_transaction, inventory_item from app.schemas.inventory_transaction import InventoryTransaction, InventoryTransactionCreate from app.models.inventory_transaction import TransactionType from app.auth.auth_handler import get_current_active_user from app.models.user import User router = APIRouter() @router.post("/", response_model=InventoryTransaction) def create_inventory_transaction( *, db: Session = Depends(get_db), transaction_in: InventoryTransactionCreate, current_user: User = Depends(get_current_active_user) ): # Verify the item exists db_item = inventory_item.get(db, id=transaction_in.item_id) if not db_item: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Inventory item not found" ) # Create the transaction db_transaction = inventory_transaction.create_with_user( db, obj_in=transaction_in, user_id=current_user.id ) # Update inventory quantities based on transaction type if transaction_in.transaction_type == TransactionType.IN: new_quantity = db_item.quantity_in_stock + transaction_in.quantity elif transaction_in.transaction_type == TransactionType.OUT: new_quantity = db_item.quantity_in_stock - transaction_in.quantity if new_quantity < 0: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Insufficient stock for this transaction" ) else: # ADJUSTMENT new_quantity = transaction_in.quantity # Update the item's stock quantity inventory_item.update( db, db_obj=db_item, obj_in={"quantity_in_stock": new_quantity} ) return db_transaction @router.get("/", response_model=List[InventoryTransaction]) def read_inventory_transactions( db: Session = Depends(get_db), skip: int = 0, limit: int = 100, item_id: Optional[int] = Query(None, description="Filter by item ID"), transaction_type: Optional[TransactionType] = Query(None, description="Filter by transaction type"), current_user: User = Depends(get_current_active_user) ): if item_id: return inventory_transaction.get_by_item(db, item_id=item_id, skip=skip, limit=limit) elif transaction_type: return inventory_transaction.get_by_type(db, transaction_type=transaction_type, skip=skip, limit=limit) else: return inventory_transaction.get_multi(db, skip=skip, limit=limit) @router.get("/{transaction_id}", response_model=InventoryTransaction) def read_inventory_transaction( transaction_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): db_transaction = inventory_transaction.get(db, id=transaction_id) if not db_transaction: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Transaction not found" ) return db_transaction