from typing import List, Optional from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.stock_movement import StockMovement, MovementType from app.schemas.stock_movement import StockMovementCreate from app.crud.crud_product import product as product_crud class CRUDStockMovement(CRUDBase[StockMovement, StockMovementCreate, StockMovementCreate]): def create_with_product_update( self, db: Session, *, obj_in: StockMovementCreate, created_by: Optional[str] = None ) -> StockMovement: # Create the stock movement obj_in_data = obj_in.dict() obj_in_data["created_by"] = created_by db_obj = super().create(db, obj_in=obj_in) # Update product stock level quantity = obj_in.quantity if obj_in.movement_type in [MovementType.SALE, MovementType.ADJUSTMENT]: if obj_in.quantity > 0: quantity = -quantity # Negate for outgoing stock product_crud.update_stock(db, product_id=obj_in.product_id, quantity=quantity) return db_obj def get_by_product( self, db: Session, *, product_id: str, skip: int = 0, limit: int = 100 ) -> List[StockMovement]: return ( db.query(StockMovement) .filter(StockMovement.product_id == product_id) .order_by(StockMovement.created_at.desc()) .offset(skip) .limit(limit) .all() ) def get_by_movement_type( self, db: Session, *, movement_type: MovementType, skip: int = 0, limit: int = 100 ) -> List[StockMovement]: return ( db.query(StockMovement) .filter(StockMovement.movement_type == movement_type) .order_by(StockMovement.created_at.desc()) .offset(skip) .limit(limit) .all() ) stock_movement = CRUDStockMovement(StockMovement)