This commit is contained in:
2026-03-01 14:19:05 +03:00
parent 8f7b8df096
commit aff088723a
13 changed files with 495 additions and 9 deletions
@@ -0,0 +1,42 @@
from sqlalchemy import select, update, delete
from sqlalchemy.ext.asyncio import AsyncSession
from dutylog.infrastructure.database.models.reporting_period import ReportingPeriod
class ReportingPeriodsDAO:
def __init__(self, session: AsyncSession):
self.session = session
async def get_by_id(self, period_id: int) -> ReportingPeriod | None:
result = await self.session.execute(
select(ReportingPeriod).where(ReportingPeriod.id == period_id)
)
return result.scalar_one_or_none()
async def get_all(self) -> list[ReportingPeriod]:
result = await self.session.execute(select(ReportingPeriod))
return list(result.scalars().all())
async def get_active_period(self) -> ReportingPeriod | None:
result = await self.session.execute(
select(ReportingPeriod).where(ReportingPeriod.end_date.is_(None))
)
return result.scalar_one_or_none()
async def create(self, period: ReportingPeriod) -> ReportingPeriod:
self.session.add(period)
await self.session.commit()
await self.session.refresh(period)
return period
async def update(self, period_id: int, **kwargs) -> ReportingPeriod | None:
await self.session.execute(
update(ReportingPeriod).where(ReportingPeriod.id == period_id).values(**kwargs)
)
await self.session.commit()
return await self.get_by_id(period_id)
async def delete(self, period_id: int) -> None:
await self.session.execute(delete(ReportingPeriod).where(ReportingPeriod.id == period_id))
await self.session.commit()
@@ -4,5 +4,6 @@ from dutylog.infrastructure.database.models.hours_transaction import HoursTransa
from dutylog.infrastructure.database.models.room import Room
from dutylog.infrastructure.database.models.resident import Resident
from dutylog.infrastructure.database.models.floor import Floor
from dutylog.infrastructure.database.models.reporting_period import ReportingPeriod
__all__ = ["Base", "User", "HoursTransaction", "Room", "Resident", "Floor"]
__all__ = ["Base", "User", "HoursTransaction", "Room", "Resident", "Floor", "ReportingPeriod"]
@@ -25,6 +25,7 @@ class HoursTransaction(Base):
admin_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("users.id", ondelete="SET NULL"), nullable=True
)
remark: Mapped[str | None] = mapped_column(String(500), nullable=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=msk_now
)
@@ -0,0 +1,14 @@
from datetime import date
from sqlalchemy import Integer, Date
from sqlalchemy.orm import Mapped, mapped_column
from dutylog.infrastructure.database.models.base import Base
class ReportingPeriod(Base):
__tablename__ = "reporting_periods"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
start_date: Mapped[date] = mapped_column(Date, nullable=False)
end_date: Mapped[date | None] = mapped_column(Date, nullable=True)
@@ -24,12 +24,14 @@ class HoursTransactionsRepository:
amount: int,
admin_id: int | None = None,
is_active: bool = True,
remark: str | None = None,
) -> tuple[HoursTransaction, Resident | None]:
transaction = HoursTransaction(
resident_id=resident_id,
transaction_type=TransactionType.INCREASE.value,
amount=amount,
admin_id=admin_id,
remark=remark,
)
transaction = await self.transactions_dao.create(transaction)
@@ -54,12 +56,14 @@ class HoursTransactionsRepository:
amount: int,
admin_id: int | None = None,
is_active: bool = True,
remark: str | None = None,
) -> tuple[HoursTransaction, Resident | None]:
transaction = HoursTransaction(
resident_id=resident_id,
transaction_type=TransactionType.DECREASE.value,
amount=amount,
admin_id=admin_id,
remark=remark,
)
transaction = await self.transactions_dao.create(transaction)
@@ -83,6 +87,7 @@ class HoursTransactionsRepository:
resident_id: int,
amount: int,
admin_id: int | None = None,
remark: str | None = None,
) -> tuple[HoursTransaction, Resident | None]:
"""Перемещает часы из неотработанных в отработанные"""
transaction = HoursTransaction(
@@ -90,6 +95,7 @@ class HoursTransactionsRepository:
transaction_type=TransactionType.DECREASE.value,
amount=amount,
admin_id=admin_id,
remark=remark,
)
transaction = await self.transactions_dao.create(transaction)
@@ -0,0 +1,28 @@
from datetime import date
from dutylog.infrastructure.database.dao.reporting_periods_dao import ReportingPeriodsDAO
from dutylog.infrastructure.database.models.reporting_period import ReportingPeriod
class ReportingPeriodsRepository:
def __init__(self, reporting_periods_dao: ReportingPeriodsDAO):
self.reporting_periods_dao = reporting_periods_dao
async def create_period(self, start_date: date) -> ReportingPeriod:
period = ReportingPeriod(start_date=start_date)
return await self.reporting_periods_dao.create(period)
async def close_period(self, period_id: int, end_date: date) -> ReportingPeriod | None:
return await self.reporting_periods_dao.update(period_id, end_date=end_date)
async def get_period_by_id(self, period_id: int) -> ReportingPeriod | None:
return await self.reporting_periods_dao.get_by_id(period_id)
async def get_all_periods(self) -> list[ReportingPeriod]:
return await self.reporting_periods_dao.get_all()
async def get_active_period(self) -> ReportingPeriod | None:
return await self.reporting_periods_dao.get_active_period()
async def delete_period(self, period_id: int) -> None:
await self.reporting_periods_dao.delete(period_id)
+16
View File
@@ -11,6 +11,9 @@ from dutylog.infrastructure.database.dao.hours_transactions_dao import (
from dutylog.infrastructure.database.dao.rooms_dao import RoomsDAO
from dutylog.infrastructure.database.dao.residents_dao import ResidentsDAO
from dutylog.infrastructure.database.dao.floors_dao import FloorsDAO
from dutylog.infrastructure.database.dao.reporting_periods_dao import (
ReportingPeriodsDAO,
)
from dutylog.infrastructure.database.repositories.users_repository import (
UsersRepository,
)
@@ -26,6 +29,9 @@ from dutylog.infrastructure.database.repositories.residents_repository import (
from dutylog.infrastructure.database.repositories.floors_repository import (
FloorsRepository,
)
from dutylog.infrastructure.database.repositories.reporting_periods_repository import (
ReportingPeriodsRepository,
)
from dutylog.infrastructure.utils.config import Config, load_config
@@ -75,6 +81,10 @@ class DAOProvider(Provider):
def get_floors_dao(self, session: AsyncSession) -> FloorsDAO:
return FloorsDAO(session)
@provide(scope=Scope.REQUEST)
def get_reporting_periods_dao(self, session: AsyncSession) -> ReportingPeriodsDAO:
return ReportingPeriodsDAO(session)
class RepositoryProvider(Provider):
@provide(scope=Scope.REQUEST)
@@ -102,3 +112,9 @@ class RepositoryProvider(Provider):
@provide(scope=Scope.REQUEST)
def get_floors_repository(self, floors_dao: FloorsDAO) -> FloorsRepository:
return FloorsRepository(floors_dao)
@provide(scope=Scope.REQUEST)
def get_reporting_periods_repository(
self, reporting_periods_dao: ReportingPeriodsDAO
) -> ReportingPeriodsRepository:
return ReportingPeriodsRepository(reporting_periods_dao)