Add app/services/stock_service.py
This commit is contained in:
54
app/services/stock_service.py
Normal file
54
app/services/stock_service.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from sqlalchemy.orm import Session
|
||||
from app.models.product import Product
|
||||
from app.models.stock_movement import StockMovement, MovementType
|
||||
from app.schemas.stock_movement import StockMoveRequest
|
||||
|
||||
|
||||
def register_movement(db: Session, data: StockMoveRequest) -> tuple[StockMovement | None, str]:
|
||||
prod = db.query(Product).filter(Product.id == data.product_id).first()
|
||||
if not prod:
|
||||
return None, "Producto no encontrado"
|
||||
|
||||
movement_type = MovementType(data.type)
|
||||
|
||||
# Validate stock for OUT movements
|
||||
if movement_type == MovementType.OUT and prod.current_stock < data.quantity:
|
||||
return None, "Stock insuficiente"
|
||||
|
||||
# Update product stock
|
||||
if movement_type == MovementType.IN:
|
||||
prod.current_stock += data.quantity
|
||||
elif movement_type == MovementType.OUT:
|
||||
prod.current_stock -= data.quantity
|
||||
else: # ADJUST
|
||||
prod.current_stock = data.quantity
|
||||
|
||||
# Record movement
|
||||
movement = StockMovement(
|
||||
product_id=data.product_id,
|
||||
type=movement_type,
|
||||
quantity=data.quantity,
|
||||
reason=data.reason,
|
||||
)
|
||||
db.add(movement)
|
||||
db.commit()
|
||||
db.refresh(movement)
|
||||
return movement, ""
|
||||
|
||||
|
||||
def get_product_history(db: Session, product_id: str):
|
||||
return db.query(StockMovement).filter(StockMovement.product_id == product_id).all()
|
||||
|
||||
|
||||
def get_stock_summary(db: Session):
|
||||
products = db.query(Product).all()
|
||||
return [
|
||||
{
|
||||
"product_id": p.id,
|
||||
"product_name": p.name,
|
||||
"current_stock": p.current_stock,
|
||||
"min_stock": p.min_stock,
|
||||
"is_low_stock": p.current_stock < p.min_stock,
|
||||
}
|
||||
for p in products
|
||||
]
|
||||
Reference in New Issue
Block a user