2026-05-06 17:43:47 +08:00
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
2026-05-06 22:23:42 +08:00
|
|
|
from app.core.logging import get_logger
|
2026-05-06 17:43:47 +08:00
|
|
|
from app.models.reimbursement import ReimbursementRequest
|
|
|
|
|
from app.repositories.reimbursement import ReimbursementRepository
|
|
|
|
|
from app.schemas.reimbursement import ReimbursementCreate
|
2026-05-29 14:11:06 +08:00
|
|
|
from app.services.pagination import PageResult
|
2026-05-06 17:43:47 +08:00
|
|
|
|
2026-05-06 22:23:42 +08:00
|
|
|
logger = get_logger("app.services.reimbursement")
|
|
|
|
|
|
2026-05-06 17:43:47 +08:00
|
|
|
|
|
|
|
|
class ReimbursementService:
|
|
|
|
|
def __init__(self, db: Session) -> None:
|
|
|
|
|
self.repository = ReimbursementRepository(db)
|
|
|
|
|
|
|
|
|
|
def list_reimbursements(self) -> list[ReimbursementRequest]:
|
2026-05-06 22:23:42 +08:00
|
|
|
items = self.repository.list()
|
|
|
|
|
logger.info("Listed reimbursements (count=%d)", len(items))
|
|
|
|
|
return items
|
2026-05-06 17:43:47 +08:00
|
|
|
|
2026-05-29 14:11:06 +08:00
|
|
|
def list_reimbursements_page(
|
|
|
|
|
self,
|
|
|
|
|
*,
|
|
|
|
|
page: int | None,
|
|
|
|
|
page_size: int | None,
|
|
|
|
|
) -> PageResult[ReimbursementRequest]:
|
|
|
|
|
result = self.repository.list_page(page=page, page_size=page_size)
|
|
|
|
|
logger.info(
|
|
|
|
|
"Listed reimbursements page (count=%d, total=%d, page=%d, page_size=%d)",
|
|
|
|
|
len(result.items),
|
|
|
|
|
result.total,
|
|
|
|
|
result.page,
|
|
|
|
|
result.page_size,
|
|
|
|
|
)
|
|
|
|
|
return result
|
|
|
|
|
|
2026-05-06 17:43:47 +08:00
|
|
|
def get_reimbursement(self, request_id: str) -> ReimbursementRequest | None:
|
2026-05-06 22:23:42 +08:00
|
|
|
request = self.repository.get(request_id)
|
|
|
|
|
if request:
|
|
|
|
|
logger.info("Fetched reimbursement id=%s no=%s", request_id, request.request_no)
|
|
|
|
|
else:
|
|
|
|
|
logger.warning("Reimbursement not found id=%s", request_id)
|
|
|
|
|
return request
|
2026-05-06 17:43:47 +08:00
|
|
|
|
|
|
|
|
def create_reimbursement(self, payload: ReimbursementCreate) -> ReimbursementRequest:
|
|
|
|
|
request = ReimbursementRequest(**payload.model_dump(), status="draft")
|
2026-05-06 22:23:42 +08:00
|
|
|
created = self.repository.create(request)
|
|
|
|
|
logger.info(
|
|
|
|
|
"Created reimbursement id=%s no=%s amount=%s",
|
|
|
|
|
created.id,
|
|
|
|
|
created.request_no,
|
|
|
|
|
created.amount,
|
|
|
|
|
)
|
|
|
|
|
return created
|