File size: 1,910 Bytes
a4ef0c7
 
 
 
 
 
 
 
 
 
4761dd9
a4ef0c7
 
 
 
 
 
 
 
 
 
 
 
 
4761dd9
 
 
a4ef0c7
4761dd9
 
 
 
 
a4ef0c7
 
 
 
 
 
4761dd9
5edc2d7
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from datetime import datetime
from typing import Any, Dict, List
from sqlalchemy import ForeignKey
from sqlalchemy.sql import expression as sql
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.dialects.postgresql import JSON

from app.model.base import BaseModel
from app.engine.postgresdb import Base
from app.schema.index import IncomeStatement as IncomeStatementSchema


class IncomeStatement(Base, BaseModel):
    __tablename__ = "income_statement"

    date_from: Mapped[datetime]
    date_to: Mapped[datetime]
    income: Mapped[Dict] = mapped_column(JSON, nullable=True)
    expenses: Mapped[Dict] = mapped_column(JSON, nullable=True)

    user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
    user = relationship("User", back_populates="income_statements")

    def __str__(self) -> str:
        return f"IncomeStatement(id={self.id}, user_id={self.user_id}, date_from={self.date_from}, date_to={self.date_to}, income={self.income}, expenses={self.expenses})"

    @classmethod
    async def create(cls: "type[IncomeStatement]", db: AsyncSession, **kwargs: IncomeStatementSchema) -> "IncomeStatement":
        income_statement = cls(**kwargs)
        db.add(income_statement)
        await db.commit()
        await db.refresh(income_statement)
        return income_statement

    @classmethod
    async def get_by_user(cls: "type[IncomeStatement]", db: AsyncSession, user_id: int) -> "List[IncomeStatement]":
        query = sql.select(cls).where(cls.user_id == user_id)
        income_statements = await db.scalars(query)
        return income_statements.all()

    @classmethod
    async def get(cls: "type[IncomeStatement]", db: AsyncSession, id: int) -> "IncomeStatement":
        query = sql.select(cls).where(cls.id == id)
        income_statement = await db.scalar(query)
        return income_statement