mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
update
This commit is contained in:
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user