Commit e7d7b98c by Ooh-Ao

borrow

parent 2e116ef0
# myproject/controllers/borrow_controller.py # myproject/controllers/borrow_controller.py
from fastapi import HTTPException
from uuid import UUID from uuid import UUID
from datetime import datetime from datetime import datetime
from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select from sqlalchemy import select
from ..models.borrow_transaction import BorrowTransaction from ..models.borrow_transaction import BorrowTransaction
from ..models.project_equipment import ProjectEquipment from ..models.project_equipment import ProjectEquipment
from ..models.equipments import Equipment from ..models.equipment import Equipment
from ..schemas.borrow_schema import ( from ..models.member import Member # ถ้าต้องเช็คว่ามี member นี้จริงไหม
BorrowCreate, from ..schemas.borrow_schema import BorrowCreate, BorrowUpdate
BorrowUpdate
)
# CREATE # CREATE
# 1) ตรวจสอบ ProjectEquipment (pe_id) มีไหม # - ตรวจสอบ member_id มีจริงไหม (ถ้าต้องการ)
# 2) ตรวจสอบ quantity_in_project >= quantity_borrowed # - ตรวจสอบ project_equipment (pe_id) มีจริง + พอไหม
# 3) ลดจำนวน => update # - ลดจำนวนใน project_equipment
# 4) สร้าง BorrowTransaction (status=borrowed) # - สร้าง record borrow_transaction
async def create_borrow(db: AsyncSession, borrow_in: BorrowCreate): async def create_borrow_transaction(db: AsyncSession, borrow_in: BorrowCreate):
# 1) หา projectEquipment จาก pe_id # (ถ้าต้องการตรวจสอบว่ามี member_id นี้ไหม)
# result_member = await db.execute(select(Member).where(Member.memberId == borrow_in.member_id))
# member_db = result_member.scalar_one_or_none()
# if not member_db:
# raise HTTPException(status_code=404, detail="Member not found")
# 1) หา project_equipments จาก pe_id
result_pe = await db.execute( result_pe = await db.execute(
select(ProjectEquipment).where(ProjectEquipment.pe_id == borrow_in.pe_id) select(ProjectEquipment).where(ProjectEquipment.pe_id == borrow_in.pe_id)
) )
...@@ -39,6 +42,7 @@ async def create_borrow(db: AsyncSession, borrow_in: BorrowCreate): ...@@ -39,6 +42,7 @@ async def create_borrow(db: AsyncSession, borrow_in: BorrowCreate):
# 4) สร้าง BorrowTransaction # 4) สร้าง BorrowTransaction
new_borrow = BorrowTransaction( new_borrow = BorrowTransaction(
member_id=borrow_in.member_id,
pe_id=borrow_in.pe_id, pe_id=borrow_in.pe_id,
quantity_borrowed=borrow_in.quantity_borrowed, quantity_borrowed=borrow_in.quantity_borrowed,
status=borrow_in.status or "borrowed" status=borrow_in.status or "borrowed"
...@@ -47,25 +51,23 @@ async def create_borrow(db: AsyncSession, borrow_in: BorrowCreate): ...@@ -47,25 +51,23 @@ async def create_borrow(db: AsyncSession, borrow_in: BorrowCreate):
await db.commit() await db.commit()
await db.refresh(new_borrow) await db.refresh(new_borrow)
return new_borrow return new_borrow
# UPDATE # UPDATE
# เช่น เปลี่ยน status -> 'returned' => ถ้า is_returnable => +quantity_in_project คืน # - ถ้าเปลี่ยน status เป็น "returned" => เช็ค equipment.is_returnable => บวกจำนวนคืน
async def update_borrow(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpdate): async def update_borrow_transaction(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpdate):
# 1) หา borrow # 1) หา borrowTransaction เดิม
result_borrow = await db.execute( result_bt = await db.execute(
select(BorrowTransaction).where(BorrowTransaction.borrow_id == borrow_id) select(BorrowTransaction).where(BorrowTransaction.borrow_id == borrow_id)
) )
borrowTx = result_borrow.scalar_one_or_none() borrowTx = result_bt.scalar_one_or_none()
if not borrowTx: if not borrowTx:
raise HTTPException(status_code=404, detail="BorrowTransaction not found") raise HTTPException(status_code=404, detail="BorrowTransaction not found")
# ถ้าส่ง status มา
if borrow_up.status: if borrow_up.status:
# 2) ถ้าเปลี่ยนเป็น returned # 2) ถ้าเปลี่ยนเป็น 'returned'
if borrow_up.status == "returned": if borrow_up.status == "returned":
# หา ProjectEquipment # หา projectEquipment
result_pe = await db.execute( result_pe = await db.execute(
select(ProjectEquipment).where(ProjectEquipment.pe_id == borrowTx.pe_id) select(ProjectEquipment).where(ProjectEquipment.pe_id == borrowTx.pe_id)
) )
...@@ -73,7 +75,7 @@ async def update_borrow(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpda ...@@ -73,7 +75,7 @@ async def update_borrow(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpda
if not projectEquipment: if not projectEquipment:
raise HTTPException(status_code=404, detail="ProjectEquipment not found") raise HTTPException(status_code=404, detail="ProjectEquipment not found")
# หา Equipment # หา equipment
result_eq = await db.execute( result_eq = await db.execute(
select(Equipment).where(Equipment.equipment_id == projectEquipment.equipment_id) select(Equipment).where(Equipment.equipment_id == projectEquipment.equipment_id)
) )
...@@ -81,38 +83,37 @@ async def update_borrow(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpda ...@@ -81,38 +83,37 @@ async def update_borrow(db: AsyncSession, borrow_id: UUID, borrow_up: BorrowUpda
if not equipment: if not equipment:
raise HTTPException(status_code=404, detail="Equipment not found") raise HTTPException(status_code=404, detail="Equipment not found")
# ถ้า is_returnable => บวกคื # ถ้า is_returnable => บวกจำนว
if equipment.is_returnable: if equipment.is_returnable:
projectEquipment.quantity_in_project += borrowTx.quantity_borrowed projectEquipment.quantity_in_project += borrowTx.quantity_borrowed
db.add(projectEquipment) db.add(projectEquipment)
# อัปเดต borrowTx: status = returned, returned_date = now
borrowTx.status = "returned" borrowTx.status = "returned"
borrowTx.returned_date = datetime.utcnow() borrowTx.returned_date = datetime.utcnow()
else: else:
# กรณีอัปเดตเป็น status อื่น # เปลี่ยนเป็นสถานะอื่น
borrowTx.status = borrow_up.status borrowTx.status = borrow_up.status
db.add(borrowTx) db.add(borrowTx)
await db.commit() await db.commit()
await db.refresh(borrowTx) await db.refresh(borrowTx)
return borrowTx return borrowTx
# GET ALL # GET ALL
async def get_all_borrows(db: AsyncSession): async def get_all_borrow_transactions(db: AsyncSession):
result = await db.execute(select(BorrowTransaction)) result = await db.execute(select(BorrowTransaction))
return result.scalars().all() return result.scalars().all()
# GET ONE # GET BY ID
async def get_borrow_by_id(db: AsyncSession, borrow_id: UUID): async def get_borrow_transaction_by_id(db: AsyncSession, borrow_id: UUID):
result = await db.execute( result = await db.execute(
select(BorrowTransaction).where(BorrowTransaction.borrow_id == borrow_id) select(BorrowTransaction).where(BorrowTransaction.borrow_id == borrow_id)
) )
return result.scalar_one_or_none() return result.scalar_one_or_none()
# DELETE # DELETE
async def delete_borrow(db: AsyncSession, borrow_id: UUID): async def delete_borrow_transaction(db: AsyncSession, borrow_id: UUID):
borrowTx = await db.get(BorrowTransaction, borrow_id) borrowTx = await db.get(BorrowTransaction, borrow_id)
if not borrowTx: if not borrowTx:
raise HTTPException(status_code=404, detail="BorrowTransaction not found") raise HTTPException(status_code=404, detail="BorrowTransaction not found")
......
# myproject/models/borrow_transaction.py # myproject/models/borrow_transaction.py
import uuid import uuid
from datetime import datetime from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy import Column, Integer, String, DateTime
...@@ -13,7 +14,8 @@ class BorrowTransaction(Base): ...@@ -13,7 +14,8 @@ class BorrowTransaction(Base):
primary_key=True, primary_key=True,
default=uuid.uuid4 default=uuid.uuid4
) )
pe_id = Column(UUID(as_uuid=True), nullable=False) # FK to project_equipments.pe_id pe_id = Column(UUID(as_uuid=True), nullable=False) # FK -> project_equipments.pe_id
member_id = Column(UUID(as_uuid=True), nullable=False) # FK -> member.memberId (ตาม Model Member)
quantity_borrowed = Column(Integer, nullable=False, default=1) quantity_borrowed = Column(Integer, nullable=False, default=1)
status = Column(String(50), nullable=False, default="borrowed") status = Column(String(50), nullable=False, default="borrowed")
returned_date = Column(DateTime, nullable=True) returned_date = Column(DateTime, nullable=True)
......
# myproject/routes/borrow_routes.py # myproject/routes/borrow_routes.py
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from typing import List from typing import List
from uuid import UUID from uuid import UUID
...@@ -6,11 +7,11 @@ from sqlalchemy.ext.asyncio import AsyncSession ...@@ -6,11 +7,11 @@ from sqlalchemy.ext.asyncio import AsyncSession
from ..config.database import get_db from ..config.database import get_db
from ..controllers.borrow_controller import ( from ..controllers.borrow_controller import (
create_borrow, create_borrow_transaction,
update_borrow, update_borrow_transaction,
get_all_borrows, get_all_borrow_transactions,
get_borrow_by_id, get_borrow_transaction_by_id,
delete_borrow delete_borrow_transaction
) )
from ..schemas.borrow_schema import ( from ..schemas.borrow_schema import (
BorrowCreate, BorrowCreate,
...@@ -20,45 +21,45 @@ from ..schemas.borrow_schema import ( ...@@ -20,45 +21,45 @@ from ..schemas.borrow_schema import (
router = APIRouter() router = APIRouter()
# CREATE # CREATE (พนักงานยืมอุปกรณ์)
@router.post("/", response_model=BorrowResponse, status_code=status.HTTP_201_CREATED) @router.post("/", response_model=BorrowResponse, status_code=status.HTTP_201_CREATED)
async def create_borrow_transaction_endpoint( async def create_borrow_endpoint(
borrow_in: BorrowCreate, borrow_in: BorrowCreate,
db: AsyncSession = Depends(get_db) db: AsyncSession = Depends(get_db)
): ):
new_borrow = await create_borrow(db, borrow_in) new_borrow = await create_borrow_transaction(db, borrow_in)
return new_borrow return new_borrow
# UPDATE # UPDATE (เช่น คืนอุปกรณ์)
@router.put("/{borrow_id}", response_model=BorrowResponse) @router.put("/{borrow_id}", response_model=BorrowResponse)
async def update_borrow_transaction_endpoint( async def update_borrow_endpoint(
borrow_id: UUID, borrow_id: UUID,
borrow_up: BorrowUpdate, borrow_up: BorrowUpdate,
db: AsyncSession = Depends(get_db) db: AsyncSession = Depends(get_db)
): ):
updated_borrow = await update_borrow(db, borrow_id, borrow_up) updated_borrow = await update_borrow_transaction(db, borrow_id, borrow_up)
return updated_borrow return updated_borrow
# GET ALL # GET ALL
@router.get("/", response_model=List[BorrowResponse]) @router.get("/", response_model=List[BorrowResponse])
async def get_all_borrows_endpoint(db: AsyncSession = Depends(get_db)): async def get_all_borrows_endpoint(db: AsyncSession = Depends(get_db)):
return await get_all_borrows(db) return await get_all_borrow_transactions(db)
# GET ONE # GET BY ID
@router.get("/{borrow_id}", response_model=BorrowResponse) @router.get("/{borrow_id}", response_model=BorrowResponse)
async def get_borrow_by_id_endpoint( async def get_borrow_by_id_endpoint(
borrow_id: UUID, borrow_id: UUID,
db: AsyncSession = Depends(get_db) db: AsyncSession = Depends(get_db)
): ):
tx = await get_borrow_by_id(db, borrow_id) tx = await get_borrow_transaction_by_id(db, borrow_id)
if not tx: if not tx:
raise HTTPException(status_code=404, detail="BorrowTransaction not found") raise HTTPException(status_code=404, detail="BorrowTransaction not found")
return tx return tx
# DELETE # DELETE
@router.delete("/{borrow_id}") @router.delete("/{borrow_id}")
async def delete_borrow_transaction_endpoint( async def delete_borrow_endpoint(
borrow_id: UUID, borrow_id: UUID,
db: AsyncSession = Depends(get_db) db: AsyncSession = Depends(get_db)
): ):
return await delete_borrow(db, borrow_id) return await delete_borrow_transaction(db, borrow_id)
# myproject/schemas/borrow_schema.py # myproject/schemas/borrow_schema.py
from pydantic import BaseModel from pydantic import BaseModel
from typing import Optional
from uuid import UUID from uuid import UUID
from typing import Optional
from datetime import datetime from datetime import datetime
# สำหรับสร้าง BorrowTransaction # CREATE Borrow (ตอน user กดยืม)
class BorrowCreate(BaseModel): class BorrowCreate(BaseModel):
member_id: UUID
pe_id: UUID pe_id: UUID
quantity_borrowed: int quantity_borrowed: int
status: Optional[str] = "borrowed" status: Optional[str] = "borrowed"
# สำหรับอัปเดต BorrowTransaction (เปลี่ยน status ฯลฯ) # UPDATE Borrow (เปลี่ยนสถานะเป็น returned, canceled ฯลฯ)
class BorrowUpdate(BaseModel): class BorrowUpdate(BaseModel):
status: Optional[str] = None status: Optional[str] = None
# สำหรับแสดงผลลัพธ์ (Response) # RESPONSE
class BorrowResponse(BaseModel): class BorrowResponse(BaseModel):
borrow_id: UUID borrow_id: UUID
pe_id: UUID pe_id: UUID
member_id: UUID
quantity_borrowed: int quantity_borrowed: int
status: str status: str
returned_date: Optional[datetime] = None returned_date: Optional[datetime] = None
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment