41 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from sqlalchemy import Connection, func
 | 
						|
from sqlalchemy.dialects.postgresql import JSONB
 | 
						|
from sqlalchemy.orm import Mapper
 | 
						|
 | 
						|
import database
 | 
						|
from database import db
 | 
						|
 | 
						|
 | 
						|
class BalanceTransaction(db.Model):
 | 
						|
    __tablename__ = 'balance_transactions'
 | 
						|
 | 
						|
    id = db.Column(db.Integer, primary_key=True, comment='ID транзакции')
 | 
						|
    type = db.Column(db.Integer, nullable=False, comment='Тип транзакции')
 | 
						|
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
 | 
						|
    user = db.relationship('User', backref='transactions')
 | 
						|
    amount = db.Column(db.Double, nullable=False, comment='Сумма транзакции')
 | 
						|
    description = db.Column(db.Text, nullable=False, comment='Описание')
 | 
						|
    json_data = db.Column(JSONB, comment='JSON данные')
 | 
						|
    created_at = db.Column(db.DateTime, nullable=False, comment='Дата и время создания транзакции')
 | 
						|
 | 
						|
 | 
						|
def recalculate_user_balance(user_id: int):
 | 
						|
    user_balance = (database.BalanceTransaction.query.filter_by(user_id=user_id)
 | 
						|
                    .group_by(database.BalanceTransaction.user_id)
 | 
						|
                    .with_entities(func.sum(database.BalanceTransaction.amount))
 | 
						|
                    .scalar()) or 0
 | 
						|
 | 
						|
    (db.session.query(database.User)
 | 
						|
     .filter_by(id=user_id)
 | 
						|
     .update({'balance': user_balance}, synchronize_session='fetch'))
 | 
						|
 | 
						|
 | 
						|
@db.event.listens_for(BalanceTransaction, 'after_insert')
 | 
						|
def after_balance_transaction_insert(mapper: Mapper, connection: Connection, target: BalanceTransaction):
 | 
						|
    recalculate_user_balance(target.user_id)
 | 
						|
 | 
						|
 | 
						|
@db.event.listens_for(BalanceTransaction, 'after_delete')
 | 
						|
def after_balance_transaction_delete(mapper: Mapper, connection: Connection, target: BalanceTransaction):
 | 
						|
    recalculate_user_balance(target.user_id)
 |