mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-03-20 00:24:16 +01:00
109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
from decimal import Decimal
|
|
|
|
from django.db.models import Sum
|
|
|
|
|
|
def calculate_sum(queryset, transaction_type, is_paid):
|
|
return (
|
|
queryset.filter(type=transaction_type, is_paid=is_paid)
|
|
.values(
|
|
"account__currency__name",
|
|
"account__currency__suffix",
|
|
"account__currency__prefix",
|
|
"account__currency__decimal_places",
|
|
)
|
|
.annotate(total=Sum("amount"))
|
|
.order_by("account__currency__name")
|
|
)
|
|
|
|
|
|
# Helper function to format currency sums
|
|
def format_currency_sum(queryset):
|
|
return [
|
|
{
|
|
"currency": item["account__currency__name"],
|
|
"suffix": item["account__currency__suffix"],
|
|
"prefix": item["account__currency__prefix"],
|
|
"decimal_places": item["account__currency__decimal_places"],
|
|
"amount": item["total"],
|
|
}
|
|
for item in queryset
|
|
]
|
|
|
|
|
|
# Calculate totals
|
|
def calculate_total(income, expenses):
|
|
totals = {}
|
|
|
|
# Process income
|
|
for item in income:
|
|
currency = item["account__currency__name"]
|
|
totals[currency] = totals.get(currency, Decimal("0")) + item["total"]
|
|
|
|
# Subtract expenses
|
|
for item in expenses:
|
|
currency = item["account__currency__name"]
|
|
totals[currency] = totals.get(currency, Decimal("0")) - item["total"]
|
|
|
|
return [
|
|
{
|
|
"currency": currency,
|
|
"suffix": next(
|
|
(
|
|
item["account__currency__suffix"]
|
|
for item in list(income) + list(expenses)
|
|
if item["account__currency__name"] == currency
|
|
),
|
|
"",
|
|
),
|
|
"prefix": next(
|
|
(
|
|
item["account__currency__prefix"]
|
|
for item in list(income) + list(expenses)
|
|
if item["account__currency__name"] == currency
|
|
),
|
|
"",
|
|
),
|
|
"decimal_places": next(
|
|
(
|
|
item["account__currency__decimal_places"]
|
|
for item in list(income) + list(expenses)
|
|
if item["account__currency__name"] == currency
|
|
),
|
|
2,
|
|
),
|
|
"amount": amount,
|
|
}
|
|
for currency, amount in totals.items()
|
|
]
|
|
|
|
|
|
# Calculate total final
|
|
def sum_totals(total1, total2):
|
|
totals = {}
|
|
for item in total1 + total2:
|
|
currency = item["currency"]
|
|
totals[currency] = totals.get(currency, Decimal("0")) + item["amount"]
|
|
return [
|
|
{
|
|
"currency": currency,
|
|
"suffix": next(
|
|
item["suffix"]
|
|
for item in total1 + total2
|
|
if item["currency"] == currency
|
|
),
|
|
"prefix": next(
|
|
item["prefix"]
|
|
for item in total1 + total2
|
|
if item["currency"] == currency
|
|
),
|
|
"decimal_places": next(
|
|
item["decimal_places"]
|
|
for item in total1 + total2
|
|
if item["currency"] == currency
|
|
),
|
|
"amount": amount,
|
|
}
|
|
for currency, amount in totals.items()
|
|
]
|