diff --git a/alembic/versions/5ea1426af0d0_transaction_refact.py b/alembic/versions/5ea1426af0d0_transaction_refact.py new file mode 100644 index 0000000..30d1189 --- /dev/null +++ b/alembic/versions/5ea1426af0d0_transaction_refact.py @@ -0,0 +1,52 @@ +"""transaction refact + +Revision ID: 5ea1426af0d0 +Revises: 3b61a6fbc6b2 +Create Date: 2026-05-17 11:34:08.045462 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = "5ea1426af0d0" +down_revision: Union[str, Sequence[str], None] = "3b61a6fbc6b2" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "aps_transaction", + sa.Column("_total_amount", sa.Numeric(precision=10, scale=2), nullable=True), + ) + # copy data from total_amount to _total_amount + conn = op.get_bind() + transactions = conn.execute( + sa.text("SELECT id, total_amount FROM aps_transaction") + ).fetchall() + for transaction in transactions: + conn.execute( + sa.text( + "UPDATE aps_transaction SET _total_amount = :total_amount WHERE id = :id" + ), + {"total_amount": transaction.total_amount, "id": transaction.id}, + ) + op.drop_column("aps_transaction", "total_amount") + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "aps_transaction", + sa.Column("total_amount", sa.NUMERIC(precision=10, scale=2), nullable=False), + ) + op.drop_column("aps_transaction", "_total_amount") + # ### end Alembic commands ### diff --git a/src/allmende_payment_system/cli.py b/src/allmende_payment_system/cli.py index f7fd0bf..42dbb18 100644 --- a/src/allmende_payment_system/cli.py +++ b/src/allmende_payment_system/cli.py @@ -1,6 +1,8 @@ import argparse +from collections import defaultdict import csv from datetime import datetime, time +from decimal import Decimal import sys from sqlalchemy import select @@ -75,6 +77,10 @@ def import_csv(filepath: str): "Error: 'Essen Kind' product not found in database. Please create it before importing." ) + orders_by_account_and_date = defaultdict( + lambda: defaultdict(lambda: Order(user_id=1)) + ) + for row in rows: transaction_type = row["typ"].lower() if transaction_type not in [ @@ -107,7 +113,7 @@ def import_csv(filepath: str): timestamp = datetime.combine(row["datum"], time(18, 30, 0)) - order = Order(user_id=1) + order = orders_by_account_and_date[account.id][row["datum"]] order.items.append( OrderItem( @@ -121,21 +127,22 @@ def import_csv(filepath: str): quantity=quantity, ) ) - - transaction = Transaction( - type="order", - timestamp=timestamp, - total_amount=row["betrag"], - quantity=quantity, - account_id=account.id, - order=order, - ) - db.add(transaction) + if not order.transaction: + transaction = Transaction( + type="order", + timestamp=timestamp, + quantity=quantity, + account_id=account.id, + order=order, + ) + db.add(transaction) + else: + order.transaction._total_amount = Decimal(order.total_amount) elif transaction_type == "einzahlung" or transaction_type == "einkauf": transaction = Transaction( type="deposit", timestamp=datetime.combine(row["datum"], time(12, 0, 0)), - total_amount=row["betrag"], + _total_amount=row["betrag"], account_id=account.id, ) db.add(transaction) @@ -143,7 +150,7 @@ def import_csv(filepath: str): transaction = Transaction( type="withdrawal", timestamp=datetime.combine(row["datum"], time(12, 0, 0)), - total_amount=row["betrag"], + _total_amount=row["betrag"], account_id=account.id, ) db.add(transaction) diff --git a/src/allmende_payment_system/models.py b/src/allmende_payment_system/models.py index fbec213..a3214d2 100644 --- a/src/allmende_payment_system/models.py +++ b/src/allmende_payment_system/models.py @@ -281,8 +281,8 @@ class Transaction(Base): timestamp: Mapped[datetime.datetime] = mapped_column( nullable=False, default=datetime.datetime.now ) - total_amount: Mapped[decimal.Decimal] = mapped_column( - Numeric(10, 2), nullable=False + _total_amount: Mapped[decimal.Decimal] = mapped_column( + Numeric(10, 2), nullable=True ) order_id: Mapped[int] = mapped_column( @@ -292,3 +292,9 @@ class Transaction(Base): account_id: Mapped[int] = mapped_column(ForeignKey(TABLE_PREFIX + "account.id")) account: Mapped["Account"] = relationship("Account", back_populates="transactions") + + @property + def total_amount(self): + if self.type == "order" and self.order is not None: + return self.order.total_amount + return self._total_amount diff --git a/src/allmende_payment_system/templates/account_details.html.jinja b/src/allmende_payment_system/templates/account_details.html.jinja index 2158fd7..a8281a8 100644 --- a/src/allmende_payment_system/templates/account_details.html.jinja +++ b/src/allmende_payment_system/templates/account_details.html.jinja @@ -50,9 +50,6 @@ {{ transaction.total_amount | format_number }} € - {% if transaction.quantity %} -
{{ transaction.quantity }}
- {% endif %} {% endfor %}