from typing import Any, List, Optional from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.api.deps import get_current_active_user, get_db from app.models.transaction import Transaction, TransactionType from app.models.item import Item from app.models.user import User from app.schemas.transaction import Transaction as TransactionSchema, TransactionCreate router = APIRouter() @router.get("/", response_model=List[TransactionSchema]) def read_transactions( db: Session = Depends(get_db), skip: int = 0, limit: int = 100, item_id: Optional[int] = None, transaction_type: Optional[TransactionType] = None, current_user: User = Depends(get_current_active_user), ) -> Any: """ Retrieve transactions. """ query = db.query(Transaction).filter(Transaction.user_id == current_user.id) if item_id: query = query.filter(Transaction.item_id == item_id) if transaction_type: query = query.filter(Transaction.transaction_type == transaction_type) transactions = query.order_by(Transaction.created_at.desc()).offset(skip).limit(limit).all() return transactions @router.post("/", response_model=TransactionSchema) def create_transaction( *, db: Session = Depends(get_db), transaction_in: TransactionCreate, current_user: User = Depends(get_current_active_user), ) -> Any: """ Create new transaction and update item quantity. """ # Check if item exists item = db.query(Item).filter( Item.id == transaction_in.item_id, Item.owner_id == current_user.id ).first() if not item: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Item not found", ) # Update item quantity based on transaction type if transaction_in.transaction_type == TransactionType.STOCK_IN: item.quantity += transaction_in.quantity elif transaction_in.transaction_type == TransactionType.STOCK_OUT: if item.quantity < transaction_in.quantity: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Not enough stock available", ) item.quantity -= transaction_in.quantity elif transaction_in.transaction_type == TransactionType.ADJUSTMENT: item.quantity = transaction_in.quantity # Create transaction record transaction = Transaction( **transaction_in.dict(), user_id=current_user.id ) db.add(transaction) db.add(item) db.commit() db.refresh(transaction) return transaction @router.get("/{transaction_id}", response_model=TransactionSchema) def read_transaction( *, db: Session = Depends(get_db), transaction_id: int, current_user: User = Depends(get_current_active_user), ) -> Any: """ Get transaction by ID. """ transaction = db.query(Transaction).filter( Transaction.id == transaction_id, Transaction.user_id == current_user.id ).first() if not transaction: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Transaction not found", ) return transaction