Compare commits

..

26 Commits

Author SHA1 Message Date
Herculino Trotta
64b32316ca fix(accounts): unable to update accounts
due to wrong currency queryset
2025-09-08 09:19:17 -03:00
Herculino Trotta
efe020efb3 fix(rules): duplicating transactions when ran outside of test mode 2025-09-07 22:14:40 -03:00
Herculino Trotta
8c133f92ce fix(rules): add .exclude() to transactions() function 2025-09-07 21:30:03 -03:00
Herculino Trotta
f3c9d8faea feat(rules): add .exclude() to transactions() function 2025-09-07 21:24:53 -03:00
Herculino Trotta
8f5204a17b feat(rules): add .exclude() to transactions() function 2025-09-07 20:41:09 -03:00
Herculino Trotta
2235bdeabb changes 2025-09-02 23:17:04 -03:00
Herculino Trotta
d724300513 changes 2025-09-02 15:54:45 -03:00
Herculino Trotta
eacafa1def changes 2025-09-02 09:47:35 -03:00
Herculino Trotta
c738f5ee29 changes 2025-09-02 09:47:27 -03:00
Herculino Trotta
72904266bf feat(rules): add optional rules ordering 2025-08-31 09:06:48 -03:00
Herculino Trotta
670bee4325 feat(rules): add rule function to fetch transactions totals and balance 2025-08-30 15:36:07 -03:00
Herculino Trotta
3e2c1184ce Merge pull request #354
fix(yearly-overview): display total for archived accounts
2025-08-30 11:13:05 -03:00
Herculino Trotta
731f351eef fix(yearly-overview): display total for archived accounts 2025-08-30 11:12:47 -03:00
eitchtee
b7056e7aa1 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2025-08-30 02:09:21 +00:00
Herculino Trotta
accceed630 Merge pull request #353
feat(insights:category-overview): add "No entity" totals
2025-08-29 23:08:34 -03:00
Herculino Trotta
76346cb503 feat(insights:category-overview): add "No entity" totals 2025-08-29 23:08:16 -03:00
eitchtee
3df8952ea2 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2025-08-30 01:48:37 +00:00
Herculino Trotta
9bd067da96 Merge pull request #352
feat(currencies): allow archiving
2025-08-29 22:47:26 -03:00
Herculino Trotta
1abe9e9f62 feat(currencies): allow archiving 2025-08-29 22:47:00 -03:00
eitchtee
1a86b5dea4 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2025-08-28 02:18:45 +00:00
Herculino Trotta
8f2f5a16c2 Merge pull request #349
fix(transactions:quick-transactions): error when saving due to wrong field definition
2025-08-27 23:17:09 -03:00
Herculino Trotta
4565dc770b fix(transactions:quick-transactions): error when saving due to wrong field definition 2025-08-27 23:16:06 -03:00
Herculino Trotta
23673def09 Merge pull request #346
fix(common:tasks): remove_old_jobs always failing
2025-08-24 10:41:48 -03:00
Herculino Trotta
dd2b9ead7e fix(common:tasks): remove_old_jobs always failing 2025-08-24 10:41:26 -03:00
Rhesa Daiva Bremana
2078e9f3e4 locale((Indonesian)): added translation using Weblate 2025-08-23 12:43:54 +00:00
eitchtee
e6bab57ab4 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2025-08-22 20:36:08 +00:00
47 changed files with 6252 additions and 1530 deletions

View File

@@ -3,6 +3,7 @@ from crispy_forms.bootstrap import FormActions
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Column, Row
from django import forms
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
from apps.accounts.models import Account
@@ -15,6 +16,7 @@ from apps.common.widgets.crispy.submit import NoClassSubmit
from apps.common.widgets.tom_select import TomSelect
from apps.transactions.models import TransactionCategory, TransactionTag
from apps.common.widgets.decimal import ArbitraryDecimalDisplayNumberInput
from apps.currencies.models import Currency
class AccountGroupForm(forms.ModelForm):
@@ -79,6 +81,18 @@ class AccountForm(forms.ModelForm):
self.fields["group"].queryset = AccountGroup.objects.all()
if self.instance.id:
qs = Currency.objects.filter(
Q(is_archived=False) | Q(accounts=self.instance.id)
).distinct()
self.fields["currency"].queryset = qs
self.fields["exchange_currency"].queryset = qs
else:
qs = Currency.objects.filter(Q(is_archived=False))
self.fields["currency"].queryset = qs
self.fields["exchange_currency"].queryset = qs
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.form_method = "post"

View File

@@ -1,3 +1,5 @@
from copy import deepcopy
from rest_framework import viewsets
from apps.api.custom.pagination import CustomPageNumberPagination
@@ -30,8 +32,9 @@ class TransactionViewSet(viewsets.ModelViewSet):
transaction_created.send(sender=instance)
def perform_update(self, serializer):
old_data = deepcopy(Transaction.objects.get(pk=serializer.data["pk"]))
instance = serializer.save()
transaction_updated.send(sender=instance)
transaction_updated.send(sender=instance, old_data=old_data)
def partial_update(self, request, *args, **kwargs):
kwargs["partial"] = True

View File

@@ -9,5 +9,8 @@ def truncate_decimal(value, decimal_places):
:param decimal_places: The number of decimal places to keep
:return: Truncated Decimal value
"""
if isinstance(value, (int, float)):
value = Decimal(str(value))
multiplier = Decimal(10**decimal_places)
return (value * multiplier).to_integral_value(rounding=ROUND_DOWN) / multiplier

View File

@@ -23,7 +23,7 @@ async def remove_old_jobs(context, timestamp):
return await builtin_tasks.remove_old_jobs(
context,
max_hours=744,
remove_error=True,
remove_failed=True,
remove_cancelled=True,
remove_aborted=True,
)

View File

@@ -26,6 +26,7 @@ class CurrencyForm(forms.ModelForm):
"suffix",
"code",
"exchange_currency",
"is_archived",
]
widgets = {
"exchange_currency": TomSelect(),
@@ -40,6 +41,7 @@ class CurrencyForm(forms.ModelForm):
self.helper.layout = Layout(
"code",
"name",
Switch("is_archived"),
"decimal_places",
"prefix",
"suffix",

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-08-30 00:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('currencies', '0021_alter_exchangerateservice_service_type'),
]
operations = [
migrations.AddField(
model_name='currency',
name='is_archived',
field=models.BooleanField(default=False, verbose_name='Archived'),
),
]

View File

@@ -32,6 +32,11 @@ class Currency(models.Model):
help_text=_("Default currency for exchange calculations"),
)
is_archived = models.BooleanField(
default=False,
verbose_name=_("Archived"),
)
def __str__(self):
return self.name

View File

@@ -40,12 +40,6 @@ class CurrencyTests(TestCase):
with self.assertRaises(ValidationError):
currency.full_clean()
def test_currency_unique_code(self):
"""Test that currency codes must be unique"""
Currency.objects.create(code="USD", name="US Dollar", decimal_places=2)
with self.assertRaises(IntegrityError):
Currency.objects.create(code="USD", name="Another Dollar", decimal_places=2)
def test_currency_unique_name(self):
"""Test that currency names must be unique"""
Currency.objects.create(code="USD", name="US Dollar", decimal_places=2)

View File

@@ -12,7 +12,10 @@ from apps.currencies.utils.convert import convert
def get_categories_totals(
transactions_queryset, ignore_empty=False, show_entities=False
):
# First get the category totals as before
# Step 1: Aggregate transaction data by category and currency.
# This query calculates the total current and projected income/expense for each
# category by grouping transactions and summing up their amounts based on their
# type (income/expense) and payment status (paid/unpaid).
category_currency_metrics = (
transactions_queryset.values(
"category",
@@ -76,7 +79,10 @@ def get_categories_totals(
.order_by("category__name")
)
# Get tag totals within each category with currency details
# Step 2: Aggregate transaction data by tag, category, and currency.
# This is similar to the category metrics but adds tags to the grouping,
# allowing for a breakdown of totals by tag within each category. It also
# handles untagged transactions, where the 'tags' field is None.
tag_metrics = transactions_queryset.values(
"category",
"tags",
@@ -131,10 +137,12 @@ def get_categories_totals(
),
)
# Process the results to structure by category
# Step 3: Initialize the main dictionary to structure the final results.
# The data will be organized hierarchically: category -> currency -> tags -> entities.
result = {}
# Process category totals first
# Step 4: Process the aggregated category metrics to build the initial result structure.
# This loop iterates through each category's metrics and populates the `result` dict.
for metric in category_currency_metrics:
# Skip empty categories if ignore_empty is True
if ignore_empty and all(
@@ -185,7 +193,7 @@ def get_categories_totals(
"total_final": total_final,
}
# Add exchanged values if exchange_currency exists
# Step 4a: Handle currency conversion for category totals if an exchange currency is defined.
if metric["account__currency__exchange_currency"]:
from_currency = Currency.objects.get(id=currency_id)
exchange_currency = Currency.objects.get(
@@ -224,7 +232,7 @@ def get_categories_totals(
result[category_id]["currencies"][currency_id] = currency_data
# Process tag totals and add them to the result, including untagged
# Step 5: Process the aggregated tag metrics and integrate them into the result structure.
for tag_metric in tag_metrics:
category_id = tag_metric["category"]
tag_id = tag_metric["tags"] # Will be None for untagged transactions
@@ -281,7 +289,7 @@ def get_categories_totals(
"total_final": tag_total_final,
}
# Add exchange currency support for tags
# Step 5a: Handle currency conversion for tag totals.
if tag_metric["account__currency__exchange_currency"]:
from_currency = Currency.objects.get(id=currency_id)
exchange_currency = Currency.objects.get(
@@ -322,6 +330,7 @@ def get_categories_totals(
currency_id
] = tag_currency_data
# Step 6: If requested, aggregate and process entity-level data.
if show_entities:
entity_metrics = transactions_queryset.values(
"category",
@@ -389,14 +398,15 @@ def get_categories_totals(
tag_id = entity_metric["tags"]
entity_id = entity_metric["entities"]
if not entity_id:
continue
if category_id in result:
tag_key = tag_id if tag_id is not None else "untagged"
if tag_key in result[category_id]["tags"]:
entity_key = entity_id
entity_name = entity_metric["entities__name"]
entity_key = entity_id if entity_id is not None else "no_entity"
entity_name = (
entity_metric["entities__name"]
if entity_id is not None
else None
)
if "entities" not in result[category_id]["tags"][tag_key]:
result[category_id]["tags"][tag_key]["entities"] = {}

View File

@@ -102,4 +102,6 @@ def get_transactions(
account__in=request.user.untracked_accounts.all()
)
transactions = transactions.exclude(account__currency__is_archived=True)
return transactions

View File

@@ -30,6 +30,7 @@ def calculate_historical_currency_net_worth(queryset):
| Q(accounts__visibility="private", accounts__owner=None),
accounts__is_archived=False,
accounts__isnull=False,
is_archived=False,
)
.values_list("name", flat=True)
.distinct()

View File

@@ -1,15 +1,19 @@
from crispy_bootstrap5.bootstrap5 import Switch, BS5Accordion
from crispy_forms.bootstrap import FormActions, AccordionGroup
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Row, Column
from crispy_forms.layout import Layout, Field, Row, Column, HTML
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from apps.common.widgets.crispy.submit import NoClassSubmit
from apps.common.widgets.tom_select import TomSelect
from apps.common.widgets.crispy.submit import NoClassSubmit
from apps.common.widgets.tom_select import TomSelect, TransactionSelect
from apps.rules.models import TransactionRule, UpdateOrCreateTransactionRuleAction
from apps.rules.models import TransactionRuleAction
from apps.common.fields.forms.dynamic_select import DynamicModelChoiceField
from apps.transactions.forms import BulkEditTransactionForm
from apps.transactions.models import Transaction
class TransactionRuleForm(forms.ModelForm):
@@ -40,6 +44,8 @@ class TransactionRuleForm(forms.ModelForm):
Column(Switch("on_create")),
Column(Switch("on_delete")),
),
"order",
Switch("sequenced"),
"description",
"trigger",
)
@@ -65,10 +71,11 @@ class TransactionRuleForm(forms.ModelForm):
class TransactionRuleActionForm(forms.ModelForm):
class Meta:
model = TransactionRuleAction
fields = ("value", "field")
fields = ("value", "field", "order")
labels = {
"field": _("Set field"),
"value": _("To"),
"order": _("Order"),
}
widgets = {"field": TomSelect(clear_button=False)}
@@ -82,6 +89,7 @@ class TransactionRuleActionForm(forms.ModelForm):
self.helper.form_method = "post"
# TO-DO: Add helper with available commands
self.helper.layout = Layout(
"order",
"field",
"value",
)
@@ -147,9 +155,11 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_category_operator": TomSelect(clear_button=False),
"search_internal_note_operator": TomSelect(clear_button=False),
"search_internal_id_operator": TomSelect(clear_button=False),
"search_mute_operator": TomSelect(clear_button=False),
}
labels = {
"order": _("Order"),
"search_account_operator": _("Operator"),
"search_type_operator": _("Operator"),
"search_is_paid_operator": _("Operator"),
@@ -163,6 +173,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_internal_id_operator": _("Operator"),
"search_tags_operator": _("Operator"),
"search_entities_operator": _("Operator"),
"search_mute_operator": _("Operator"),
"search_account": _("Account"),
"search_type": _("Type"),
"search_is_paid": _("Paid"),
@@ -176,6 +187,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_internal_id": _("Internal ID"),
"search_tags": _("Tags"),
"search_entities": _("Entities"),
"search_mute": _("Mute"),
"set_account": _("Account"),
"set_type": _("Type"),
"set_is_paid": _("Paid"),
@@ -189,6 +201,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"set_category": _("Category"),
"set_internal_note": _("Internal Note"),
"set_internal_id": _("Internal ID"),
"set_mute": _("Mute"),
}
def __init__(self, *args, **kwargs):
@@ -200,6 +213,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
self.helper.form_method = "post"
self.helper.layout = Layout(
"order",
BS5Accordion(
AccordionGroup(
_("Search Criteria"),
@@ -224,6 +238,16 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
css_class="form-group col-md-8",
),
),
Row(
Column(
Field("search_mute_operator"),
css_class="form-group col-md-4",
),
Column(
Field("search_mute", rows=1),
css_class="form-group col-md-8",
),
),
Row(
Column(
Field("search_account_operator"),
@@ -340,6 +364,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
_("Set Values"),
Field("set_type", rows=1),
Field("set_is_paid", rows=1),
Field("set_mute", rows=1),
Field("set_account", rows=1),
Field("set_entities", rows=1),
Field("set_date", rows=1),
@@ -381,3 +406,112 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
if commit:
instance.save()
return instance
class DryRunCreatedTransacion(forms.Form):
transaction = DynamicModelChoiceField(
model=Transaction,
to_field_name="id",
label=_("Transaction"),
required=True,
queryset=Transaction.objects.none(),
widget=TransactionSelect(clear_button=False, income=True, expense=True),
help_text=_("Type to search for a transaction"),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.layout = Layout(
"transaction",
FormActions(
NoClassSubmit(
"submit", _("Test"), css_class="btn btn-outline-primary w-100"
),
),
)
if self.data.get("transaction"):
try:
transaction = Transaction.objects.get(id=self.data.get("transaction"))
except Transaction.DoesNotExist:
transaction = None
if transaction:
self.fields["transaction"].queryset = Transaction.objects.filter(
id=transaction.id
)
class DryRunDeletedTransacion(forms.Form):
transaction = DynamicModelChoiceField(
model=Transaction,
to_field_name="id",
label=_("Transaction"),
required=True,
queryset=Transaction.objects.none(),
widget=TransactionSelect(clear_button=False, income=True, expense=True),
help_text=_("Type to search for a transaction"),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.layout = Layout(
"transaction",
FormActions(
NoClassSubmit(
"submit", _("Test"), css_class="btn btn-outline-primary w-100"
),
),
)
if self.data.get("transaction"):
try:
transaction = Transaction.objects.get(id=self.data.get("transaction"))
except Transaction.DoesNotExist:
transaction = None
if transaction:
self.fields["transaction"].queryset = Transaction.objects.filter(
id=transaction.id
)
class DryRunUpdatedTransactionForm(BulkEditTransactionForm):
transaction = DynamicModelChoiceField(
model=Transaction,
to_field_name="id",
label=_("Transaction"),
required=True,
queryset=Transaction.objects.none(),
widget=TransactionSelect(clear_button=False, income=True, expense=True),
help_text=_("Type to search for a transaction"),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper.layout.insert(0, "transaction")
self.helper.layout.insert(1, HTML("<hr/>"))
# Change submit button
self.helper.layout[-1] = FormActions(
NoClassSubmit(
"submit", _("Test"), css_class="btn btn-outline-primary w-100"
)
)
if self.data.get("transaction"):
try:
transaction = Transaction.objects.get(id=self.data.get("transaction"))
except Transaction.DoesNotExist:
transaction = None
if transaction:
self.fields["transaction"].queryset = Transaction.objects.filter(
id=transaction.id
)

View File

@@ -0,0 +1,39 @@
# Generated by Django 5.2 on 2025-08-30 18:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("rules", "0014_alter_transactionrule_owner_and_more"),
]
operations = [
migrations.AlterModelOptions(
name="transactionruleaction",
options={
"ordering": ["order"],
"verbose_name": "Edit transaction action",
"verbose_name_plural": "Edit transaction actions",
},
),
migrations.AlterModelOptions(
name="updateorcreatetransactionruleaction",
options={
"ordering": ["order"],
"verbose_name": "Update or create transaction action",
"verbose_name_plural": "Update or create transaction actions",
},
),
migrations.AddField(
model_name="transactionruleaction",
name="order",
field=models.PositiveIntegerField(default=0, verbose_name="Order"),
),
migrations.AddField(
model_name="updateorcreatetransactionruleaction",
name="order",
field=models.PositiveIntegerField(default=0, verbose_name="Order"),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-08-31 18:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rules', '0015_alter_transactionruleaction_options_and_more'),
]
operations = [
migrations.AddField(
model_name='transactionrule',
name='sequenced',
field=models.BooleanField(default=False, verbose_name='Sequenced'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.2.5 on 2025-08-31 19:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rules', '0016_transactionrule_sequenced'),
]
operations = [
migrations.AddField(
model_name='updateorcreatetransactionruleaction',
name='search_mute',
field=models.TextField(blank=True, verbose_name='Search Mute'),
),
migrations.AddField(
model_name='updateorcreatetransactionruleaction',
name='search_mute_operator',
field=models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Mute Operator'),
),
migrations.AddField(
model_name='updateorcreatetransactionruleaction',
name='set_mute',
field=models.TextField(blank=True, verbose_name='Mute'),
),
migrations.AlterField(
model_name='transactionruleaction',
name='field',
field=models.CharField(choices=[('account', 'Account'), ('type', 'Type'), ('is_paid', 'Paid'), ('date', 'Date'), ('reference_date', 'Reference Date'), ('mute', 'Mute'), ('amount', 'Amount'), ('description', 'Description'), ('notes', 'Notes'), ('category', 'Category'), ('tags', 'Tags'), ('entities', 'Entities'), ('internal_nome', 'Internal Note'), ('internal_id', 'Internal ID')], max_length=50, verbose_name='Field'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-09-02 14:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rules', '0017_updateorcreatetransactionruleaction_search_mute_and_more'),
]
operations = [
migrations.AddField(
model_name='transactionrule',
name='order',
field=models.PositiveIntegerField(default=0, verbose_name='Order'),
),
]

View File

@@ -13,6 +13,11 @@ class TransactionRule(SharedObject):
name = models.CharField(max_length=100, verbose_name=_("Name"))
description = models.TextField(blank=True, null=True, verbose_name=_("Description"))
trigger = models.TextField(verbose_name=_("Trigger"))
sequenced = models.BooleanField(
verbose_name=_("Sequenced"),
default=False,
)
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
objects = SharedObjectManager()
all_objects = models.Manager() # Unfiltered manager
@@ -32,12 +37,15 @@ class TransactionRuleAction(models.Model):
is_paid = "is_paid", _("Paid")
date = "date", _("Date")
reference_date = "reference_date", _("Reference Date")
mute = "mute", _("Mute")
amount = "amount", _("Amount")
description = "description", _("Description")
notes = "notes", _("Notes")
category = "category", _("Category")
tags = "tags", _("Tags")
entities = "entities", _("Entities")
internal_note = "internal_nome", _("Internal Note")
internal_id = "internal_id", _("Internal ID")
rule = models.ForeignKey(
TransactionRule,
@@ -51,6 +59,7 @@ class TransactionRuleAction(models.Model):
verbose_name=_("Field"),
)
value = models.TextField(verbose_name=_("Value"))
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
def __str__(self):
return f"{self.rule} - {self.field} - {self.value}"
@@ -59,6 +68,11 @@ class TransactionRuleAction(models.Model):
verbose_name = _("Edit transaction action")
verbose_name_plural = _("Edit transaction actions")
unique_together = (("rule", "field"),)
ordering = ["order"]
@property
def action_type(self):
return "edit_transaction"
class UpdateOrCreateTransactionRuleAction(models.Model):
@@ -237,6 +251,17 @@ class UpdateOrCreateTransactionRuleAction(models.Model):
verbose_name="Internal ID Operator",
)
search_mute = models.TextField(
verbose_name="Search Mute",
blank=True,
)
search_mute_operator = models.CharField(
max_length=10,
choices=SearchOperator.choices,
default=SearchOperator.EXACT,
verbose_name="Mute Operator",
)
# Set fields
set_account = models.TextField(
verbose_name=_("Account"),
@@ -290,10 +315,21 @@ class UpdateOrCreateTransactionRuleAction(models.Model):
verbose_name=_("Tags"),
blank=True,
)
set_mute = models.TextField(
verbose_name=_("Mute"),
blank=True,
)
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
class Meta:
verbose_name = _("Update or create transaction action")
verbose_name_plural = _("Update or create transaction actions")
ordering = ["order"]
@property
def action_type(self):
return "update_or_create_transaction"
def __str__(self):
return f"Update or create transaction action for {self.rule}"
@@ -325,6 +361,10 @@ class UpdateOrCreateTransactionRuleAction(models.Model):
value = simple.eval(self.search_is_paid)
search_query &= add_to_query("is_paid", value, self.search_is_paid_operator)
if self.search_mute:
value = simple.eval(self.search_mute)
search_query &= add_to_query("mute", value, self.search_mute_operator)
if self.search_date:
value = simple.eval(self.search_date)
search_query &= add_to_query("date", value, self.search_date_operator)

View File

@@ -9,40 +9,17 @@ from apps.transactions.models import (
)
from apps.rules.tasks import check_for_transaction_rules
from apps.common.middleware.thread_local import get_current_user
from apps.rules.utils.transactions import serialize_transaction
@receiver(transaction_created)
@receiver(transaction_updated)
@receiver(transaction_deleted)
def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
old_data = kwargs.get("old_data")
if signal is transaction_deleted:
# Serialize transaction data for processing
transaction_data = {
"id": sender.id,
"account": (sender.account.id, sender.account.name),
"account_group": (
sender.account.group.id if sender.account.group else None,
sender.account.group.name if sender.account.group else None,
),
"type": str(sender.type),
"is_paid": sender.is_paid,
"is_asset": sender.account.is_asset,
"is_archived": sender.account.is_archived,
"category": (
sender.category.id if sender.category else None,
sender.category.name if sender.category else None,
),
"date": sender.date.isoformat(),
"reference_date": sender.reference_date.isoformat(),
"amount": str(sender.amount),
"description": sender.description,
"notes": sender.notes,
"tags": list(sender.tags.values_list("id", "name")),
"entities": list(sender.entities.values_list("id", "name")),
"deleted": True,
"internal_note": sender.internal_note,
"internal_id": sender.internal_id,
}
transaction_data = serialize_transaction(sender, deleted=True)
check_for_transaction_rules.defer(
transaction_data=transaction_data,
@@ -59,6 +36,9 @@ def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
dca_entry.amount_received = sender.amount
dca_entry.save()
if signal is transaction_updated and old_data:
old_data = serialize_transaction(old_data, deleted=False)
check_for_transaction_rules.defer(
instance_id=sender.id,
user_id=get_current_user().id,
@@ -67,4 +47,5 @@ def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
if signal is transaction_created
else "transaction_updated"
),
old_data=old_data,
)

File diff suppressed because it is too large Load Diff

View File

@@ -42,6 +42,21 @@ urlpatterns = [
views.transaction_rule_take_ownership,
name="transaction_rule_take_ownership",
),
path(
"rules/transaction/<int:pk>/dry-run/created/",
views.dry_run_rule_created,
name="transaction_rule_dry_run_created",
),
path(
"rules/transaction/<int:pk>/dry-run/deleted/",
views.dry_run_rule_deleted,
name="transaction_rule_dry_run_deleted",
),
path(
"rules/transaction/<int:pk>/dry-run/updated/",
views.dry_run_rule_updated,
name="transaction_rule_dry_run_updated",
),
path(
"rules/transaction/<int:pk>/share/",
views.transaction_rule_share,

View File

View File

@@ -0,0 +1,93 @@
import logging
from decimal import Decimal
from django.db.models import Sum, Value, DecimalField, Case, When, F
from django.db.models.functions import Coalesce
from apps.transactions.models import (
Transaction,
)
logger = logging.getLogger(__name__)
class TransactionsGetter:
def __init__(self, **filters):
self.__queryset = Transaction.objects.filter(**filters)
def exclude(self, **exclude_filters):
self.__queryset = self.__queryset.exclude(**exclude_filters)
return self
@property
def sum(self):
return self.__queryset.aggregate(
total=Coalesce(
Sum("amount"), Value(Decimal("0")), output_field=DecimalField()
)
)["total"]
@property
def balance(self):
return abs(
self.__queryset.aggregate(
balance=Coalesce(
Sum(
Case(
When(type=Transaction.Type.EXPENSE, then=-F("amount")),
default=F("amount"),
output_field=DecimalField(),
)
),
Value(Decimal("0")),
output_field=DecimalField(),
)
)["balance"]
)
@property
def raw_balance(self):
return self.__queryset.aggregate(
balance=Coalesce(
Sum(
Case(
When(type=Transaction.Type.EXPENSE, then=-F("amount")),
default=F("amount"),
output_field=DecimalField(),
)
),
Value(Decimal("0")),
output_field=DecimalField(),
)
)["balance"]
def serialize_transaction(sender: Transaction, deleted: bool):
return {
"id": sender.id,
"account": (sender.account.id, sender.account.name),
"account_group": (
sender.account.group.id if sender.account.group else None,
sender.account.group.name if sender.account.group else None,
),
"type": str(sender.type),
"is_paid": sender.is_paid,
"is_asset": sender.account.is_asset,
"is_archived": sender.account.is_archived,
"category": (
sender.category.id if sender.category else None,
sender.category.name if sender.category else None,
),
"date": sender.date.isoformat(),
"reference_date": sender.reference_date.isoformat(),
"amount": str(sender.amount),
"description": sender.description,
"notes": sender.notes,
"tags": list(sender.tags.values_list("id", "name")),
"entities": list(sender.entities.values_list("id", "name")),
"deleted": deleted,
"internal_note": sender.internal_note,
"internal_id": sender.internal_id,
"mute": sender.mute,
}

View File

@@ -1,5 +1,10 @@
from itertools import chain
from copy import deepcopy
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.utils.translation import gettext_lazy as _
@@ -10,6 +15,9 @@ from apps.rules.forms import (
TransactionRuleForm,
TransactionRuleActionForm,
UpdateOrCreateTransactionRuleActionForm,
DryRunCreatedTransacion,
DryRunDeletedTransacion,
DryRunUpdatedTransactionForm,
)
from apps.rules.models import (
TransactionRule,
@@ -19,6 +27,11 @@ from apps.rules.models import (
from apps.common.models import SharedObject
from apps.common.forms import SharedObjectForm
from apps.common.decorators.demo import disabled_on_demo
from apps.rules.tasks import check_for_transaction_rules
from apps.common.middleware.thread_local import get_current_user
from apps.rules.signals import transaction_created, transaction_updated
from apps.rules.utils.transactions import serialize_transaction
from apps.transactions.models import Transaction
@login_required
@@ -36,7 +49,7 @@ def rules_index(request):
@disabled_on_demo
@require_http_methods(["GET"])
def rules_list(request):
transaction_rules = TransactionRule.objects.all().order_by("id")
transaction_rules = TransactionRule.objects.all().order_by("order", "id")
return render(
request,
"rules/fragments/list.html",
@@ -140,10 +153,20 @@ def transaction_rule_edit(request, transaction_rule_id):
def transaction_rule_view(request, transaction_rule_id):
transaction_rule = get_object_or_404(TransactionRule, id=transaction_rule_id)
edit_actions = transaction_rule.transaction_actions.all()
update_or_create_actions = (
transaction_rule.update_or_create_transaction_actions.all()
)
all_actions = sorted(
chain(edit_actions, update_or_create_actions),
key=lambda a: a.order,
)
return render(
request,
"rules/fragments/transaction_rule/view.html",
{"transaction_rule": transaction_rule},
{"transaction_rule": transaction_rule, "all_actions": all_actions},
)
@@ -406,3 +429,156 @@ def update_or_create_transaction_rule_action_delete(request, pk):
"HX-Trigger": "updated, hide_offcanvas",
},
)
@only_htmx
@login_required
@disabled_on_demo
@require_http_methods(["GET", "POST"])
def dry_run_rule_created(request, pk):
rule = get_object_or_404(TransactionRule, id=pk)
logs = None
results = None
if request.method == "POST":
form = DryRunCreatedTransacion(request.POST)
if form.is_valid():
try:
with transaction.atomic():
logs, results = check_for_transaction_rules(
instance_id=form.cleaned_data["transaction"].id,
signal="transaction_created",
dry_run=True,
rule_id=rule.id,
user_id=get_current_user().id,
)
logs = "\n".join(logs)
response = render(
request,
"rules/fragments/transaction_rule/dry_run/created.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)
raise Exception("ROLLBACK")
except Exception:
pass
return response
else:
form = DryRunCreatedTransacion()
return render(
request,
"rules/fragments/transaction_rule/dry_run/created.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)
@only_htmx
@login_required
@disabled_on_demo
@require_http_methods(["GET", "POST"])
def dry_run_rule_deleted(request, pk):
rule = get_object_or_404(TransactionRule, id=pk)
logs = None
results = None
if request.method == "POST":
form = DryRunDeletedTransacion(request.POST)
if form.is_valid():
try:
with transaction.atomic():
logs, results = check_for_transaction_rules(
instance_id=form.cleaned_data["transaction"].id,
signal="transaction_deleted",
dry_run=True,
rule_id=rule.id,
user_id=get_current_user().id,
)
logs = "\n".join(logs)
response = render(
request,
"rules/fragments/transaction_rule/dry_run/created.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)
raise Exception("ROLLBACK")
except Exception:
pass
return response
else:
form = DryRunDeletedTransacion()
return render(
request,
"rules/fragments/transaction_rule/dry_run/deleted.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)
@only_htmx
@login_required
@disabled_on_demo
@require_http_methods(["GET", "POST"])
def dry_run_rule_updated(request, pk):
rule = get_object_or_404(TransactionRule, id=pk)
logs = None
results = None
if request.method == "POST":
form = DryRunUpdatedTransactionForm(request.POST)
if form.is_valid():
base_transaction = Transaction.objects.get(
id=request.POST.get("transaction")
)
old_data = deepcopy(base_transaction)
try:
with transaction.atomic():
for field_name, value in form.cleaned_data.items():
if value or isinstance(
value, bool
): # Only update fields that have been filled in the form
if field_name == "tags":
base_transaction.tags.set(value)
elif field_name == "entities":
base_transaction.entities.set(value)
else:
setattr(base_transaction, field_name, value)
base_transaction.save()
logs, results = check_for_transaction_rules(
instance_id=base_transaction.id,
signal="transaction_updated",
dry_run=True,
rule_id=rule.id,
user_id=get_current_user().id,
old_data=old_data,
)
logs = "\n".join(logs) if logs else ""
response = render(
request,
"rules/fragments/transaction_rule/dry_run/created.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)
# This will rollback the transaction
raise Exception("ROLLBACK")
except Exception:
pass
return response
else:
form = DryRunUpdatedTransactionForm(initial={"is_paid": None, "type": None})
return render(
request,
"rules/fragments/transaction_rule/dry_run/updated.html",
{"form": form, "rule": rule, "logs": logs, "results": results},
)

View File

@@ -1,3 +1,5 @@
from copy import deepcopy
from crispy_bootstrap5.bootstrap5 import Switch, BS5Accordion
from crispy_forms.bootstrap import FormActions, AccordionGroup, AppendedText
from crispy_forms.helper import FormHelper
@@ -239,11 +241,16 @@ class TransactionForm(forms.ModelForm):
def save(self, **kwargs):
is_new = not self.instance.id
if not is_new:
old_data = deepcopy(Transaction.objects.get(pk=self.instance.id))
else:
old_data = None
instance = super().save(**kwargs)
if is_new:
transaction_created.send(sender=instance)
else:
transaction_updated.send(sender=instance)
transaction_updated.send(sender=instance, old_data=old_data)
return instance
@@ -347,11 +354,6 @@ class QuickTransactionForm(forms.ModelForm):
Column("entities", css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
Row(
Column(Field("date"), css_class="form-group col-md-6 mb-0"),
Column(Field("reference_date"), css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
"description",
Field("amount", inputmode="decimal"),
Row(
@@ -387,35 +389,115 @@ class QuickTransactionForm(forms.ModelForm):
)
class BulkEditTransactionForm(TransactionForm):
is_paid = forms.NullBooleanField(required=False)
class BulkEditTransactionForm(forms.Form):
type = forms.ChoiceField(
choices=(Transaction.Type.choices),
required=False,
label=_("Type"),
)
is_paid = forms.NullBooleanField(
required=False,
label=_("Paid"),
)
account = DynamicModelChoiceField(
model=Account,
required=False,
label=_("Account"),
queryset=Account.objects.filter(is_archived=False),
widget=TomSelect(clear_button=False, group_by="group"),
)
date = forms.DateField(
label=_("Date"),
required=False,
widget=AirDatePickerInput(clear_button=False),
)
reference_date = forms.DateField(
widget=AirMonthYearPickerInput(),
label=_("Reference Date"),
required=False,
)
amount = forms.DecimalField(
max_digits=42,
decimal_places=30,
required=False,
label=_("Amount"),
widget=ArbitraryDecimalDisplayNumberInput(),
)
description = forms.CharField(
max_length=500, required=False, label=_("Description")
)
notes = forms.CharField(
required=False,
widget=forms.Textarea(attrs={"rows": 3}),
label=_("Notes"),
)
category = DynamicModelChoiceField(
create_field="name",
model=TransactionCategory,
required=False,
label=_("Category"),
queryset=TransactionCategory.objects.filter(active=True),
)
tags = DynamicModelMultipleChoiceField(
model=TransactionTag,
to_field_name="name",
create_field="name",
required=False,
label=_("Tags"),
queryset=TransactionTag.objects.filter(active=True),
)
entities = DynamicModelMultipleChoiceField(
model=TransactionEntity,
to_field_name="name",
create_field="name",
required=False,
label=_("Entities"),
queryset=TransactionEntity.objects.all(),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Make all fields optional
for field_name, field in self.fields.items():
field.required = False
del self.helper.layout[-1] # Remove button
del self.helper.layout[0:2] # Remove type, is_paid field
self.fields["account"].queryset = Account.objects.filter(
is_archived=False,
)
self.helper.layout.insert(
0,
self.fields["category"].queryset = TransactionCategory.objects.filter(
active=True
)
self.fields["tags"].queryset = TransactionTag.objects.filter(active=True)
self.fields["entities"].queryset = TransactionEntity.objects.all()
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.form_method = "post"
self.helper.layout = Layout(
Field(
"type",
template="transactions/widgets/unselectable_income_expense_toggle_buttons.html",
),
)
self.helper.layout.insert(
1,
Field(
"is_paid",
template="transactions/widgets/unselectable_paid_toggle_button.html",
),
)
self.helper.layout.append(
Row(
Column("account", css_class="form-group col-md-6 mb-0"),
Column("entities", css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
Row(
Column(Field("date"), css_class="form-group col-md-6 mb-0"),
Column(Field("reference_date"), css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
"description",
Field("amount", inputmode="decimal"),
Row(
Column("category", css_class="form-group col-md-6 mb-0"),
Column("tags", css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
"notes",
FormActions(
NoClassSubmit(
"submit", _("Update"), css_class="btn btn-outline-primary w-100"
@@ -423,6 +505,9 @@ class BulkEditTransactionForm(TransactionForm):
),
)
self.fields["amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.fields["date"].widget = AirDatePickerInput(clear_button=False)
class TransferForm(forms.Form):
from_account = forms.ModelChoiceField(

View File

@@ -1,4 +1,5 @@
import logging
from copy import deepcopy
from dateutil.relativedelta import relativedelta
from django.conf import settings
@@ -33,13 +34,13 @@ transaction_deleted = Signal()
class SoftDeleteQuerySet(models.QuerySet):
@staticmethod
def _emit_signals(instances, created=False):
def _emit_signals(instances, created=False, old_data=None):
"""Helper to emit signals for multiple instances"""
for instance in instances:
for i, instance in enumerate(instances):
if created:
transaction_created.send(sender=instance)
else:
transaction_updated.send(sender=instance)
transaction_updated.send(sender=instance, old_data=old_data[i])
def bulk_create(self, objs, emit_signal=True, **kwargs):
instances = super().bulk_create(objs, **kwargs)
@@ -50,22 +51,25 @@ class SoftDeleteQuerySet(models.QuerySet):
return instances
def bulk_update(self, objs, fields, emit_signal=True, **kwargs):
old_data = deepcopy(objs)
result = super().bulk_update(objs, fields, **kwargs)
if emit_signal:
self._emit_signals(objs, created=False)
self._emit_signals(objs, created=False, old_data=old_data)
return result
def update(self, emit_signal=True, **kwargs):
# Get instances before update
instances = list(self)
old_data = deepcopy(instances)
result = super().update(**kwargs)
if emit_signal:
# Refresh instances to get new values
refreshed = self.model.objects.filter(pk__in=[obj.pk for obj in instances])
self._emit_signals(refreshed, created=False)
self._emit_signals(refreshed, created=False, old_data=old_data)
return result
@@ -376,7 +380,7 @@ class Transaction(OwnedObject):
db_table = "transactions"
default_manager_name = "objects"
def save(self, *args, **kwargs):
def clean_fields(self, *args, **kwargs):
self.amount = truncate_decimal(
value=self.amount, decimal_places=self.account.currency.decimal_places
)
@@ -386,6 +390,11 @@ class Transaction(OwnedObject):
elif not self.reference_date and self.date:
self.reference_date = self.date.replace(day=1)
super().clean_fields(*args, **kwargs)
def save(self, *args, **kwargs):
# This is not recommended as it will run twice on some cases like form and API saves.
# We only do this here because we forgot to independently call it on multiple places.
self.full_clean()
super().save(*args, **kwargs)
@@ -443,12 +452,58 @@ class Transaction(OwnedObject):
type_display = self.get_type_display()
frmt_date = date(self.date, "SHORT_DATE_FORMAT")
account = self.account
tags = ", ".join([x.name for x in self.tags.all()]) or _("No tags")
tags = (
", ".join([x.name for x in self.tags.all()])
if self.id
else None or _("No tags")
)
category = self.category or _("No category")
amount = localize_number(drop_trailing_zeros(self.amount))
description = self.description or _("No description")
return f"[{frmt_date}][{type_display}][{account}] {description}{category}{tags}{amount}"
def deepcopy(self, memo=None):
"""
Creates a deep copy of the transaction instance.
This method returns a new, unsaved Transaction instance with the same
values as the original, including its many-to-many relationships.
The primary key and any other unique fields are reset to avoid
database integrity errors upon saving.
"""
if memo is None:
memo = {}
# Create a new instance of the class
new_obj = self.__class__()
memo[id(self)] = new_obj
# Copy all concrete fields from the original to the new object
for field in self._meta.concrete_fields:
# Skip the primary key to allow the database to generate a new one
if field.primary_key:
continue
# Reset any unique fields to None to avoid constraint violations
if field.unique and field.name == "internal_id":
setattr(new_obj, field.name, None)
continue
# Copy the value of the field
setattr(new_obj, field.name, getattr(self, field.name))
# Save the new object to the database to get a primary key
new_obj.save()
# Copy the many-to-many relationships
for field in self._meta.many_to_many:
source_manager = getattr(self, field.name)
destination_manager = getattr(new_obj, field.name)
# Set the M2M relationships for the new object
destination_manager.set(source_manager.all())
return new_obj
class InstallmentPlan(models.Model):
class Recurrence(models.TextChoices):

View File

@@ -175,6 +175,6 @@ class RecurringTransactionTests(TestCase):
recurrence_type=RecurringTransaction.RecurrenceType.MONTH,
recurrence_interval=1,
)
self.assertFalse(recurring.paused)
self.assertFalse(recurring.is_paused)
self.assertEqual(recurring.recurrence_interval, 1)
self.assertEqual(recurring.account.currency.code, "USD")

View File

@@ -213,6 +213,7 @@ def transactions_bulk_edit(request):
if form.is_valid():
# Apply changes from the form to all selected transactions
for transaction in transactions:
old_data = deepcopy(transaction)
for field_name, value in form.cleaned_data.items():
if value or isinstance(
value, bool
@@ -225,7 +226,7 @@ def transactions_bulk_edit(request):
setattr(transaction, field_name, value)
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
messages.success(
request,
@@ -373,10 +374,13 @@ def transactions_transfer(request):
@require_http_methods(["GET"])
def transaction_pay(request, transaction_id):
transaction = get_object_or_404(Transaction, pk=transaction_id)
old_data = deepcopy(transaction)
new_is_paid = False if transaction.is_paid else True
transaction.is_paid = new_is_paid
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
response = render(
request,
@@ -394,11 +398,12 @@ def transaction_pay(request, transaction_id):
@require_http_methods(["GET"])
def transaction_mute(request, transaction_id):
transaction = get_object_or_404(Transaction, pk=transaction_id)
old_data = deepcopy(transaction)
new_mute = False if transaction.mute else True
transaction.mute = new_mute
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
response = render(
request,
@@ -414,19 +419,20 @@ def transaction_mute(request, transaction_id):
@require_http_methods(["GET"])
def transaction_change_month(request, transaction_id, change_type):
transaction: Transaction = get_object_or_404(Transaction, pk=transaction_id)
old_data = deepcopy(transaction)
if change_type == "next":
transaction.reference_date = transaction.reference_date + relativedelta(
months=1
)
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
elif change_type == "previous":
transaction.reference_date = transaction.reference_date - relativedelta(
months=1
)
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
return HttpResponse(
status=204,
@@ -440,9 +446,11 @@ def transaction_change_month(request, transaction_id, change_type):
def transaction_move_to_today(request, transaction_id):
transaction: Transaction = get_object_or_404(Transaction, pk=transaction_id)
old_data = deepcopy(transaction)
transaction.date = timezone.localdate(timezone.now())
transaction.save()
transaction_updated.send(sender=transaction)
transaction_updated.send(sender=transaction, old_data=old_data)
return HttpResponse(
status=204,

View File

@@ -79,7 +79,7 @@ def yearly_overview_by_currency(request, year: int):
currency = request.GET.get("currency")
# Base query filter
filter_params = {"reference_date__year": year, "account__is_archived": False}
filter_params = {"reference_date__year": year}
# Add month filter if provided
if month:

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-07-22 06:17+0000\n"
"Last-Translator: seraphblade2010 <marc.butenhoff@web.de>\n"
"Language-Team: German <https://translations.herculino.com/projects/wygiwyh/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Gruppe Name"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Aktualisierung"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Aktualisierung"
msgid "Add"
msgstr "Hinzufügen"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Gruppe"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Neuer Saldo"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Kategorie"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Kontengruppe"
msgid "Account Groups"
msgstr "Kontengruppen"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -159,8 +159,10 @@ msgstr ""
"Vermögenskonten werden in deinem Nettovermögen berücksichtigt, aber nicht in "
"deiner Monatsübersicht."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -174,7 +176,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -498,9 +500,9 @@ msgstr "Präfix"
msgid "Suffix"
msgstr "Suffix"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -520,7 +522,7 @@ msgstr "Währungsname"
msgid "Decimal Places"
msgstr "Dezimalstellen"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -532,63 +534,63 @@ msgstr "Dezimalstellen"
msgid "Currencies"
msgstr "Währungen"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "Die Währung kann nicht ihre eigene Umrechnungswährung sein."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "Startwährung"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "Zielwährung"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Umrechnungskurs"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Datum und Uhrzeit"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr "Automatisch"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Umrechnungskurse"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "Start- und Zielwährung dürfen nicht identisch sein."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "An"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "Alle X Stunden"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Nicht an"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Dienstname"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Diensttyp"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -597,31 +599,31 @@ msgstr "Diensttyp"
msgid "Active"
msgstr "Aktiv"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "API-Schlüssel"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "API-Schlüssel für den Dienst (falls benötigt)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Intervalltyp"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Intervall"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Letzter erfolgreicher Abruf"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr "Zielwährungen"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
@@ -629,11 +631,11 @@ msgstr ""
"Währung auswählen, dessen Umrechnungskurs abgerufen werden sollen. Für jede "
"Währung wird der Kurs der entsprechenden Umrechnungs-Währung abgerufen."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr "Zielkonten"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
@@ -641,33 +643,33 @@ msgstr ""
"Konten auswählen, für die Umrechungskurse abgerufen werden solen. Für jedes "
"Konto wird der Kurs der entsprechenden Umrechnungs-Währung abgerufen."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
#, fuzzy
#| msgid "Edit exchange rate"
msgid "Single exchange rate"
msgstr "Umrechnungskurs bearbeiten"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr "Umrechnungskurs-Dienst"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr "Umrechnungskurs-Dienste"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr "\"Jede X Stunden\"-Intervalltyp benötigt eine positive Ganzzahl."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "\"Jede X Stunden\"-Intervall muss zwischen 1 und 24 liegen."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
@@ -675,7 +677,7 @@ msgstr ""
"Ungültiges Stundenformat. Nutze kommagetrennte Stunden (0-23) und/oder "
"Zeiträume (z.B. \"1-5,8,10-12\")."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -727,11 +729,11 @@ msgstr "Dienst erfolgreich in die Warteschlange eingereiht"
msgid "Create transaction"
msgstr "Erstelle Transaktion"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr "Startkonto"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr "Zielkonto"
@@ -758,7 +760,7 @@ msgstr "Verknüpfe Transaktion"
msgid "You must provide an account."
msgstr "Du musst ein Konto angeben."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr "Start- und Zielkonten müssen unterschiedlich sein."
@@ -777,7 +779,7 @@ msgstr "Startwährung"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -862,7 +864,7 @@ msgstr "Kategorien"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1039,8 +1041,8 @@ msgstr "Vorgang erfolgreich gelöscht"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr "Unkategorisiert"
@@ -1140,7 +1142,7 @@ msgstr "Bezahlt"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1158,7 +1160,7 @@ msgstr "Betrag"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1364,6 +1366,7 @@ msgid "Any entity"
msgstr "Entität hinzufügen"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
#, fuzzy
#| msgid "No entities"
msgid "No entity"
@@ -1381,56 +1384,56 @@ msgstr "Speichern und ähnliches hinzufügen"
msgid "Save and add another"
msgstr "Speichern und etwas neu hinzufügen"
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
"Stummgeschaltete Transaktionen werden nicht in der monatlichen Übersicht "
"berücksichtigt"
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr "Startbetrag"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr "Zielbetrag"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr "Deaktivieren"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr "Transfer"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr "Tagname"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr "Entitätsname"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr "Kategoriename"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
#, fuzzy
#| msgid "Muted categories won't count towards your monthly total"
msgid "Muted categories won't be displayed on monthly summaries"
msgstr "Ausgeblendete Kategorien zählen nicht zu deiner Monatsübersicht"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
#, fuzzy
#| msgid "Filter transactions"
msgid "future transactions"
msgstr "Transaktionen filtern"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr "Enddatum sollte hinter dem Startdatum liegen"
@@ -1725,11 +1728,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Ratenzahlungs-Plan erfolgreich gelöscht"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr "Objekt erfolgreich hinzugefügt"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr "Objekt erfolgreich aktualisiert"
@@ -2004,7 +2007,7 @@ msgstr "Kontogruppe bearbeiten"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2025,7 +2028,7 @@ msgstr "Aktionen"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2051,7 +2054,7 @@ msgstr "Bearbeiten"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2078,7 +2081,7 @@ msgstr "Löschen"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2108,7 +2111,7 @@ msgstr "Bist du sicher?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2128,7 +2131,7 @@ msgstr "Dies kann nicht rückgängig gemacht werden!"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2274,7 +2277,7 @@ msgid "Muted"
msgstr "Ausgeblendet"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr "Keine Kategorien"
@@ -2477,7 +2480,7 @@ msgstr "Währung bearbeiten"
msgid "Code"
msgstr "Code"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr "Keine Währungen"
@@ -2946,7 +2949,7 @@ msgstr "Gesamtbilanz"
msgid "Total"
msgstr "Gesamt"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
#, fuzzy
#| msgid "final total"
msgid "Final Total"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,32 +18,32 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr ""
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr ""
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -65,34 +65,34 @@ msgstr ""
msgid "Add"
msgstr ""
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr ""
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr ""
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr ""
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -131,7 +131,7 @@ msgstr ""
msgid "Account Groups"
msgstr ""
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -156,8 +156,10 @@ msgid ""
"Asset accounts count towards your Net Worth, but not towards your month."
msgstr ""
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -170,7 +172,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -486,9 +488,9 @@ msgstr ""
msgid "Suffix"
msgstr ""
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -508,7 +510,7 @@ msgstr ""
msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -520,63 +522,63 @@ msgstr ""
msgid "Currencies"
msgstr ""
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr ""
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr ""
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr ""
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr ""
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr ""
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr ""
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr ""
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr ""
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -585,77 +587,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -705,11 +707,11 @@ msgstr ""
msgid "Create transaction"
msgstr ""
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr ""
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr ""
@@ -734,7 +736,7 @@ msgstr ""
msgid "You must provide an account."
msgstr ""
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr ""
@@ -753,7 +755,7 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -838,7 +840,7 @@ msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1013,8 +1015,8 @@ msgstr ""
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr ""
@@ -1114,7 +1116,7 @@ msgstr ""
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1132,7 +1134,7 @@ msgstr ""
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1325,6 +1327,7 @@ msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr ""
@@ -1340,50 +1343,50 @@ msgstr ""
msgid "Save and add another"
msgstr ""
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr ""
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr ""
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr ""
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr ""
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr ""
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr ""
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr ""
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr ""
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr ""
@@ -1671,11 +1674,11 @@ msgid "Installment Plan deleted successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr ""
@@ -1945,7 +1948,7 @@ msgstr ""
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -1966,7 +1969,7 @@ msgstr ""
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -1992,7 +1995,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2019,7 +2022,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2049,7 +2052,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2069,7 +2072,7 @@ msgstr ""
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2215,7 +2218,7 @@ msgid "Muted"
msgstr ""
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr ""
@@ -2416,7 +2419,7 @@ msgstr ""
msgid "Code"
msgstr ""
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr ""
@@ -2869,7 +2872,7 @@ msgstr ""
msgid "Total"
msgstr ""
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-07-21 18:17+0000\n"
"Last-Translator: afermar <adrian.fm@protonmail.com>\n"
"Language-Team: Spanish <https://translations.herculino.com/projects/wygiwyh/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Nombre del Grupo"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Actualizar"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Actualizar"
msgid "Add"
msgstr "Agregar"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Grupo"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Nuevo balance"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Categoría"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Grupo de Cuenta"
msgid "Account Groups"
msgstr "Grupos de Cuentas"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -158,8 +158,10 @@ msgid ""
msgstr ""
"Las cuentas de activos computan para su patrimonio neto, pero no para su mes."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -172,7 +174,7 @@ msgstr "Las cuentas archivadas no aparecen ni cuentan para su patrimonio neto"
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -507,9 +509,9 @@ msgstr "Prefijo"
msgid "Suffix"
msgstr "Sufijo"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -529,7 +531,7 @@ msgstr "Nombre de la Moneda"
msgid "Decimal Places"
msgstr "Cantidad de decimales"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -541,64 +543,64 @@ msgstr "Cantidad de decimales"
msgid "Currencies"
msgstr "Monedas"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "La moneda no puede tenerse a sí misma como moneda de cambio."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "De Moneda"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "A Moneda"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Tipo de cambio"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Fecha y Hora"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
#, fuzzy
msgid "Auto"
msgstr "Auto"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Tipos de cambio"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "Las monedas de origen y destino no pueden ser la misma."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "Encendido"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "Cada X horas"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "No Encendido"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Nombre del Servicio"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Tipo de Servicio"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -607,37 +609,37 @@ msgstr "Tipo de Servicio"
msgid "Active"
msgstr "Activo"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
#, fuzzy
msgid "API Key"
msgstr "API Key"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
#, fuzzy
msgid "API key for the service (if required)"
msgstr "API key for the service (if required)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
#, fuzzy
msgid "Interval Type"
msgstr "Interval Type"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
#, fuzzy
msgid "Interval"
msgstr "Interval"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
#, fuzzy
msgid "Last Successful Fetch"
msgstr "Last Successful Fetch"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
#, fuzzy
msgid "Target Currencies"
msgstr "Target Currencies"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
#, fuzzy
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
@@ -646,12 +648,12 @@ msgstr ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
#, fuzzy
msgid "Target Accounts"
msgstr "Target Accounts"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
#, fuzzy
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
@@ -660,36 +662,36 @@ msgstr ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
#, fuzzy
msgid "Single exchange rate"
msgstr "Edit exchange rate"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
#, fuzzy
msgid "Exchange Rate Service"
msgstr "Exchange Rate Service"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
#, fuzzy
msgid "Exchange Rate Services"
msgstr "Exchange Rate Services"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
#, fuzzy
msgid "'Every X hours' interval type requires a positive integer."
msgstr "'Every X hours' interval type requires a positive integer."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
#, fuzzy
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "'Every X hours' interval must be between 1 and 24."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
#, fuzzy
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
@@ -698,7 +700,7 @@ msgstr ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
#, fuzzy
msgid ""
"Invalid format. Please check the requirements for your selected interval "
@@ -762,12 +764,12 @@ msgstr "Services queued successfully"
msgid "Create transaction"
msgstr "Create transaction"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
#, fuzzy
msgid "From Account"
msgstr "From Account"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
#, fuzzy
msgid "To Account"
msgstr "To Account"
@@ -798,7 +800,7 @@ msgstr "Link transaction"
msgid "You must provide an account."
msgstr "You must provide an account."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
#, fuzzy
msgid "From and To accounts must be different."
msgstr "From and To accounts must be different."
@@ -820,7 +822,7 @@ msgstr "Payment Currency"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
#, fuzzy
@@ -922,7 +924,7 @@ msgstr "Categories"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1132,8 +1134,8 @@ msgstr "Run deleted successfully"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
#, fuzzy
msgid "Uncategorized"
msgstr "Uncategorized"
@@ -1249,7 +1251,7 @@ msgstr "Paid"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
#, fuzzy
@@ -1269,7 +1271,7 @@ msgstr "Amount"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
#, fuzzy
@@ -1507,6 +1509,7 @@ msgid "Any entity"
msgstr "Add entity"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
#, fuzzy
msgid "No entity"
msgstr "No entities"
@@ -1524,61 +1527,61 @@ msgstr "Guardar y añadir similar"
msgid "Save and add another"
msgstr "Guardar y añadir otro"
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
"Las transacciones silenciadas no se mostrarán en los resúmenes mensuales"
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
#, fuzzy
msgid "From Amount"
msgstr "From Amount"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
#, fuzzy
msgid "To Amount"
msgstr "To Amount"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
#, fuzzy
msgid "Mute"
msgstr "Mute"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
#, fuzzy
msgid "Transfer"
msgstr "Transfer"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
#, fuzzy
msgid "Tag name"
msgstr "Tag name"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
#, fuzzy
msgid "Entity name"
msgstr "Entity name"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
#, fuzzy
msgid "Category name"
msgstr "Category name"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
#, fuzzy
msgid "Muted categories won't be displayed on monthly summaries"
msgstr "Muted categories won't count towards your monthly total"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
#, fuzzy
#| msgid "Filter transactions"
msgid "future transactions"
msgstr "Filtrar transacciones"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
#, fuzzy
msgid "End date should be after the start date"
msgstr "End date should be after the start date"
@@ -1923,12 +1926,12 @@ msgid "Installment Plan deleted successfully"
msgstr "Installment Plan deleted successfully"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
#, fuzzy
msgid "Item added successfully"
msgstr "Rule added successfully"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
#, fuzzy
msgid "Item updated successfully"
msgstr "Rule updated successfully"
@@ -2253,7 +2256,7 @@ msgstr "Edit account group"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2275,7 +2278,7 @@ msgstr "Actions"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2302,7 +2305,7 @@ msgstr "Edit"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2330,7 +2333,7 @@ msgstr "Delete"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2361,7 +2364,7 @@ msgstr "Are you sure?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2382,7 +2385,7 @@ msgstr "You won't be able to revert this!"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2554,7 +2557,7 @@ msgid "Muted"
msgstr "Muted"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
#, fuzzy
msgid "No categories"
msgstr "No categories"
@@ -2791,7 +2794,7 @@ msgstr "Edit currency"
msgid "Code"
msgstr "Code"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
#, fuzzy
msgid "No currencies"
msgstr "No currencies"
@@ -3341,7 +3344,7 @@ msgstr "final total"
msgid "Total"
msgstr "Total"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
#, fuzzy
msgid "Final Total"
msgstr "final total"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-08-18 08:17+0000\n"
"Last-Translator: sorcierwax <freakywax@gmail.com>\n"
"Language-Team: French <https://translations.herculino.com/projects/wygiwyh/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.12.2\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Nom de groupe"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Mise à jour"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Mise à jour"
msgid "Add"
msgstr "Ajouter"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Groupe"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Nouveau solde"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Catégorie"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Groupe de comptes"
msgid "Account Groups"
msgstr "Groupes de comptes"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -158,8 +158,10 @@ msgid ""
msgstr ""
"Les comptes d'actifs contribue à votre Valeur Nette mais pas à votre mois."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -174,7 +176,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -497,9 +499,9 @@ msgstr "Préfixe"
msgid "Suffix"
msgstr "Suffixe"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -519,7 +521,7 @@ msgstr "Nom de devise"
msgid "Decimal Places"
msgstr "Décimales"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -531,63 +533,63 @@ msgstr "Décimales"
msgid "Currencies"
msgstr "Devises"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "La devise ne peut pas être identique à la devise d'échange."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "Devise de départ"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "Devise d'arrivée"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Taux de change"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Date et Heure"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr "Auto"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Taux de changes"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "Les devises de départ et d'arrivée ne peuvent pas être identiques."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "Le"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "Toutes les X heures"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Pas le"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Nom du Service"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Type de Service"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -596,31 +598,31 @@ msgstr "Type de Service"
msgid "Active"
msgstr "Actif"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "Clé API"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "Clé API pour le service (si nécessaire)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Type d'intervalle"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Intervalle"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Dernière récupération avec succès"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr "Devises cibles"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
@@ -628,11 +630,11 @@ msgstr ""
"Sélectionnez les devises pour récupérer leur taux de changes. Les taux "
"seront récupérés pour chaque devises par rapport à leur devise d'échange."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr "Comptes cibles"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
@@ -640,33 +642,33 @@ msgstr ""
"Sélectionnez les comptes pour récupérer leur taux de change. Les taux seront "
"récupérés pour chaque compte par rapport à leur devise d'échange."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
msgid "Single exchange rate"
msgstr "Taux de change unique"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
"Ne créer qu'un seul taux de change et le mettre à jour. Evite d'engorger la "
"base de donnée."
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr "Service de taux de change"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr "Services de taux de change"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr "'Toutes les X heures' l'intervalle requiert un entier positif."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "'Toutes les X heures' l'intervalle doit être compris entre 1 et 24."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
@@ -674,7 +676,7 @@ msgstr ""
"Format d'heure invalide. Utilisez les heures séparé par virgule (0-23) et/ou "
"une plage (ex : '1-5,8,10-12')."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -726,11 +728,11 @@ msgstr "Services ajouté à la file avec succès"
msgid "Create transaction"
msgstr "Créer une transaction"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr "Compte originateur"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr "Compte bénéficiaire"
@@ -755,7 +757,7 @@ msgstr "Lié transaction"
msgid "You must provide an account."
msgstr "Vous devez fournir un compte."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr ""
"Le compte originateur et le compte bénéficiaire doivent être différent."
@@ -775,7 +777,7 @@ msgstr "Devise de paiement"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -860,7 +862,7 @@ msgstr "Catégories"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1037,8 +1039,8 @@ msgstr "Exécution supprimé avec succès"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr "Sans catégorie"
@@ -1138,7 +1140,7 @@ msgstr "Payé"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1156,7 +1158,7 @@ msgstr "Montant"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1353,6 +1355,7 @@ msgid "Any entity"
msgstr "N'importe quelle entité"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr "Pas d'entité"
@@ -1368,52 +1371,52 @@ msgstr "Enregistrer et ajouter des semblables"
msgid "Save and add another"
msgstr "Enregistrer et ajouter un autre"
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
"Les transactions silencieuses ne sont pas affichées dans les résumés mensuels"
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr "Montant de départ"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr "Montant d'arrivée"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr "Silencieux"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr "Virement"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr "Libellé de l'étiquette"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr "Nom d'entité"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr "Nom de catégorie"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr ""
"Les catégories silencieuses ne compteront pas dans votre résumé mensuel"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr "Transactions à venir"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr "La date de fin doit être ultérieure à la date de début"
@@ -1707,11 +1710,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Paiement en plusieurs fois supprimé avec succès"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr "Item ajouté avec succès"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr "Item mis à jour avec succès"
@@ -1994,7 +1997,7 @@ msgstr "Editer un groupe de comptes"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2015,7 +2018,7 @@ msgstr "Actions"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2041,7 +2044,7 @@ msgstr "Editer"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2068,7 +2071,7 @@ msgstr "Supprimer"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2098,7 +2101,7 @@ msgstr "Êtes-vous sûr ?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2118,7 +2121,7 @@ msgstr "Cette opération est irréversible, vous ne pourrez pas l'annuler !"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2264,7 +2267,7 @@ msgid "Muted"
msgstr "Muet"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr "Pas de catégories"
@@ -2465,7 +2468,7 @@ msgstr "Modifier une devise"
msgid "Code"
msgstr "Code"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr "Pas de devises"
@@ -2930,7 +2933,7 @@ msgstr "Total final"
msgid "Total"
msgstr "Total"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr "Total final"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-08-17 08:17+0000\n"
"Last-Translator: Dimitri Decrock <dj.flashpower@gmail.com>\n"
"Language-Team: Dutch <https://translations.herculino.com/projects/wygiwyh/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Groepsnaam"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Bijwerken"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Bijwerken"
msgid "Add"
msgstr "Toevoegen"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Groep"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Nieuw saldo"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Categorie"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Accountgroep"
msgid "Account Groups"
msgstr "Accountgroepen"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -159,8 +159,10 @@ msgstr ""
"Vermogensrekeningen tellen mee voor je 'Netto Waarde', maar niet voor je "
"maand."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -175,7 +177,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -497,9 +499,9 @@ msgstr "Voorvoegsel"
msgid "Suffix"
msgstr "Achtervoegsel"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -519,7 +521,7 @@ msgstr "Munteenheids Naam"
msgid "Decimal Places"
msgstr "Cijfers na de komma"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -531,63 +533,63 @@ msgstr "Cijfers na de komma"
msgid "Currencies"
msgstr "Munteenheden"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "Munteenheid kan zichzelf niet als ruilmiddel hebben."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "Van Munteenheid"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "Naar Munteenheid"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Wisselkoers"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Datum en Tijd"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr "Automatisch"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Wisselkoersen"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "Van en Naar munteenheid kunnen niet dezelfde zijn."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "Op"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "Elke X Uren"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Niet op"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Dienstnaam"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Soort Dienst"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -596,31 +598,31 @@ msgstr "Soort Dienst"
msgid "Active"
msgstr "Actief"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "API Sleutel"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "API sleutel voor de dienst (indien verplicht)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Soort Interval"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Interval"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Laatste Succesvolle Ophaling"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr "Doel Munteenheden"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
@@ -628,11 +630,11 @@ msgstr ""
"Selecteer munteenheden om wisselkoersen voor op te halen. De koersen worden "
"voor elke munteenheid opgehaald ten opzichte van de ingestelde wisselkoers."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr "Naar rekeningen"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
@@ -641,33 +643,33 @@ msgstr ""
"opgehaald voor de munteenheid van elke rekening ten opzichte van de "
"ingestelde wisselkoers."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
msgid "Single exchange rate"
msgstr "Enkele Wisselkoers"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
"Maak één wisselkoers aan en houd deze bijgewerkt. Voorkomt een overvolle "
"database."
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr "Wisselkoersdienst"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr "Wisselkoersdiensten"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr "Voor het intervaltype Elke X uur is een positief geheel getal nodig."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "Het interval Elke X uur moet tussen 1 en 24 liggen."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
@@ -675,7 +677,7 @@ msgstr ""
"Ongeldige urennotatie. Gebruik door komma's gescheiden uren (0-23) en/of "
"reeksen (bijv. 1-5,8,10-12)."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -727,11 +729,11 @@ msgstr "Diensten succesvol in de wachtrij geplaatst"
msgid "Create transaction"
msgstr "Maak verrichtingen"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr "Van rekening"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr "Naar rekening"
@@ -757,7 +759,7 @@ msgstr "Koppel verrichting"
msgid "You must provide an account."
msgstr "Je moet een account opgeven."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr "Van en Naar rekening moeten verschillend zijn."
@@ -776,7 +778,7 @@ msgstr "Betaal Munteenheid"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -861,7 +863,7 @@ msgstr "Categorieën"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1038,8 +1040,8 @@ msgstr "Run met succes verwijderd"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr "Ongecategoriseerd"
@@ -1139,7 +1141,7 @@ msgstr "Betaald"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1157,7 +1159,7 @@ msgstr "Bedrag"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1352,6 +1354,7 @@ msgid "Any entity"
msgstr "Elk bedrijf"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr "Geen bedrijf"
@@ -1367,50 +1370,50 @@ msgstr "Opslaan en vergelijkbaar toevoegen"
msgid "Save and add another"
msgstr "Opslaan en een andere toevoegen"
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr "Gedempte transacties worden niet weergegeven in maandoverzichten"
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr "Van Bedrag"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr "Naar Bedrag"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr "Dempen"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr "Overschrijving"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr "Labelnaam"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr "Naam van bedrijf"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr "Naam van categorie"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr "Gedempte categorieën worden niet weergegeven in maandoverzichten"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr "toekomstige verrichtingen"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr "De einddatum moet na de begindatum vallen"
@@ -1704,11 +1707,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Afbetalingsplan succesvol verwijderd"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr "Item succesvol toegevoegd"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr "Item succesvol bijgewerkt"
@@ -1985,7 +1988,7 @@ msgstr "Rekeningsgroep bewerken"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2006,7 +2009,7 @@ msgstr "Acties"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2032,7 +2035,7 @@ msgstr "Bewerken"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2059,7 +2062,7 @@ msgstr "Verwijderen"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2089,7 +2092,7 @@ msgstr "Weet je het zeker?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2109,7 +2112,7 @@ msgstr "Je kunt dit niet meer terugdraaien!"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2255,7 +2258,7 @@ msgid "Muted"
msgstr "Gedempt"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr "Geen categorieën"
@@ -2456,7 +2459,7 @@ msgstr "Munteenheid bewerken"
msgid "Code"
msgstr "Code"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr "Geen munteenheden"
@@ -2918,7 +2921,7 @@ msgstr "Eindtotaal"
msgid "Total"
msgstr "Totaal"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr "Eindtotaal"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-04-13 08:16+0000\n"
"Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n"
"Language-Team: Portuguese <https://translations.herculino.com/projects/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.10.4\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Nome do grupo"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Atualizar"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Atualizar"
msgid "Add"
msgstr "Adicionar"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Grupo da Conta"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Novo saldo"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Categoria"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Grupo da Conta"
msgid "Account Groups"
msgstr "Grupos da Conta"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -159,8 +159,10 @@ msgstr ""
"As contas de ativos contam para o seu patrimônio líquido, mas não para o seu "
"mês."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -174,7 +176,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -497,9 +499,9 @@ msgstr "Prefixo"
msgid "Suffix"
msgstr "Sufixo"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -519,7 +521,7 @@ msgstr "Nome da Moeda"
msgid "Decimal Places"
msgstr "Casas Decimais"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -531,63 +533,63 @@ msgstr "Casas Decimais"
msgid "Currencies"
msgstr "Moedas"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "A moeda não pode ter a si mesma como moeda de câmbio."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "Moeda de origem"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "Moeda de destino"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Taxa de Câmbio"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Data e Tempo"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr "Automático"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Taxas de Câmbio"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "As moedas De e Para não podem ser as mesmas."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "Em"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "A cada X horas"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Não em"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Nome do Serviço"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Tipo de Serviço"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -596,31 +598,31 @@ msgstr "Tipo de Serviço"
msgid "Active"
msgstr "Ativo"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "Chave de API"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "Chave de API para o serviço (se necessário)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Tipo de Intervalo"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Intervalo"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Última execução bem-sucedida"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr "Moedas-alvo"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
@@ -628,11 +630,11 @@ msgstr ""
"Selecione as moedas para as quais deseja obter as taxas de câmbio. As taxas "
"serão obtidas para cada moeda em relação à moeda de câmbio definida."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr "Contas-alvo"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
@@ -641,34 +643,34 @@ msgstr ""
"serão obtidas para a moeda de cada conta em relação à moeda de câmbio "
"definida."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
#, fuzzy
#| msgid "Edit exchange rate"
msgid "Single exchange rate"
msgstr "Editar taxa de câmbio"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr "Serviço de Taxa de Câmbio"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr "Serviços de Taxa de Câmbio"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
"Intervalo do tipo 'A cada X horas' requerer um número inteiro positivo."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "Intervalo do tipo 'A cada X horas' requerer um número entre 1 e 24."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
@@ -676,7 +678,7 @@ msgstr ""
"Formato inválido de hora. Use uma lista de horas separada por vírgulas "
"(0-23) e/ou uma faixa (ex.: '1-5,8,10-12')."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -728,11 +730,11 @@ msgstr "Serviços marcados para execução com sucesso"
msgid "Create transaction"
msgstr "Criar transação"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr "Conta de origem"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr "Conta de destino"
@@ -757,7 +759,7 @@ msgstr "Conectar transação"
msgid "You must provide an account."
msgstr "Você deve informar uma conta."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr "As contas De e Para devem ser diferentes."
@@ -776,7 +778,7 @@ msgstr "Moeda de pagamento"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -861,7 +863,7 @@ msgstr "Categorias"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1038,8 +1040,8 @@ msgstr "Importação apagada com sucesso"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr "Sem categoria"
@@ -1139,7 +1141,7 @@ msgstr "Pago"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1157,7 +1159,7 @@ msgstr "Quantia"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1356,6 +1358,7 @@ msgid "Any entity"
msgstr "Adicionar entidade"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
#, fuzzy
#| msgid "No entities"
msgid "No entity"
@@ -1373,54 +1376,54 @@ msgstr ""
msgid "Save and add another"
msgstr ""
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr "Quantia de origem"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr "Quantia de destino"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr "Silenciada"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr "Transferir"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr "Nome da Tag"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr "Nome da entidade"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr "Nome da Categoria"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
#, fuzzy
#| msgid "Muted categories won't count towards your monthly total"
msgid "Muted categories won't be displayed on monthly summaries"
msgstr "As categorias silenciadas não serão contabilizadas em seu total mensal"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
#, fuzzy
#| msgid "Filter transactions"
msgid "future transactions"
msgstr "Filtrar transações"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr "Data final deve ser após data inicial"
@@ -1717,13 +1720,13 @@ msgid "Installment Plan deleted successfully"
msgstr "Parcelamento apagado com sucesso"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
#, fuzzy
#| msgid "Rule added successfully"
msgid "Item added successfully"
msgstr "Regra adicionada com sucesso"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
#, fuzzy
#| msgid "Rule updated successfully"
msgid "Item updated successfully"
@@ -2004,7 +2007,7 @@ msgstr "Editar grupo de conta"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2025,7 +2028,7 @@ msgstr "Ações"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2051,7 +2054,7 @@ msgstr "Editar"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2078,7 +2081,7 @@ msgstr "Apagar"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2108,7 +2111,7 @@ msgstr "Tem certeza?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2128,7 +2131,7 @@ msgstr "Você não será capaz de reverter isso!"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2274,7 +2277,7 @@ msgid "Muted"
msgstr "Silenciada"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr "Nenhum categoria"
@@ -2481,7 +2484,7 @@ msgstr "Editar moeda"
msgid "Code"
msgstr "Código"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr "Nenhuma moeda"
@@ -2943,7 +2946,7 @@ msgstr "total final"
msgid "Total"
msgstr "Total"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr "Total Final"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-08-17 08:17+0000\n"
"Last-Translator: Herculino Trotta <netotrotta@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translations.herculino.com/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.12.2\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Nome do grupo"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Atualizar"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Atualizar"
msgid "Add"
msgstr "Adicionar"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Grupo"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Novo saldo"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Categoria"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr "Grupo da Conta"
msgid "Account Groups"
msgstr "Grupos da Conta"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -159,8 +159,10 @@ msgstr ""
"As contas de ativos contam para o seu patrimônio líquido, mas não para o seu "
"mês."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -174,7 +176,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -495,9 +497,9 @@ msgstr "Prefixo"
msgid "Suffix"
msgstr "Sufixo"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -517,7 +519,7 @@ msgstr "Nome da Moeda"
msgid "Decimal Places"
msgstr "Casas Decimais"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -529,63 +531,63 @@ msgstr "Casas Decimais"
msgid "Currencies"
msgstr "Moedas"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "A moeda não pode ter a si mesma como moeda de câmbio."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "Moeda de origem"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "Moeda de destino"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Taxa de Câmbio"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Data e Tempo"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr "Automático"
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Taxas de Câmbio"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "As moedas De e Para não podem ser as mesmas."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "Em"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "A cada X horas"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Não em"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Nome do Serviço"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Tipo de Serviço"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -594,31 +596,31 @@ msgstr "Tipo de Serviço"
msgid "Active"
msgstr "Ativo"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "Chave de API"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "Chave de API para o serviço (se necessário)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Tipo de Intervalo"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Intervalo"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Última execução bem-sucedida"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr "Moedas-alvo"
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
@@ -626,11 +628,11 @@ msgstr ""
"Selecione as moedas para as quais deseja obter as taxas de câmbio. As taxas "
"serão obtidas para cada moeda em relação à moeda de câmbio definida."
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr "Contas-alvo"
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
@@ -639,34 +641,34 @@ msgstr ""
"serão obtidas para a moeda de cada conta em relação à moeda de câmbio "
"definida."
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
msgid "Single exchange rate"
msgstr "Taxa de câmbio única"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
"Cria uma taxa de câmbio e mantenha-a atualizada. Evita a poluição do banco "
"de dados."
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr "Serviço de Taxa de Câmbio"
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr "Serviços de Taxa de Câmbio"
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
"Intervalo do tipo 'A cada X horas' requerer um número inteiro positivo."
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr "Intervalo do tipo 'A cada X horas' requerer um número entre 1 e 24."
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
@@ -674,7 +676,7 @@ msgstr ""
"Formato inválido de hora. Use uma lista de horas separada por vírgulas "
"(0-23) e/ou uma faixa (ex.: '1-5,8,10-12')."
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -726,11 +728,11 @@ msgstr "Serviços marcados para execução com sucesso"
msgid "Create transaction"
msgstr "Criar transação"
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr "Conta de origem"
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr "Conta de destino"
@@ -755,7 +757,7 @@ msgstr "Conectar transação"
msgid "You must provide an account."
msgstr "Você deve informar uma conta."
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr "As contas De e Para devem ser diferentes."
@@ -774,7 +776,7 @@ msgstr "Moeda de pagamento"
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -859,7 +861,7 @@ msgstr "Categorias"
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1036,8 +1038,8 @@ msgstr "Importação apagada com sucesso"
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr "Sem categoria"
@@ -1137,7 +1139,7 @@ msgstr "Pago"
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1155,7 +1157,7 @@ msgstr "Quantia"
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1350,6 +1352,7 @@ msgid "Any entity"
msgstr "Qualquer entidade"
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr "Sem entidade"
@@ -1365,50 +1368,50 @@ msgstr "Salvar e adicionar similar"
msgid "Save and add another"
msgstr "Salvar e adicionar outra"
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr "Transações silenciadas não apareceram nos sumários mensais"
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr "Quantia de origem"
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr "Quantia de destino"
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr "Silenciada"
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr "Transferir"
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr "Nome da Tag"
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr "Nome da entidade"
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr "Nome da Categoria"
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr "Categorias silenciadas não apareceram nos sumários mensais"
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr "transações futuras"
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr "Data final deve ser após data inicial"
@@ -1701,11 +1704,11 @@ msgid "Installment Plan deleted successfully"
msgstr "Parcelamento apagado com sucesso"
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr "Item adicionado com sucesso"
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr "Item atualizado com sucesso"
@@ -1984,7 +1987,7 @@ msgstr "Editar grupo de conta"
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -2005,7 +2008,7 @@ msgstr "Ações"
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2031,7 +2034,7 @@ msgstr "Editar"
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2058,7 +2061,7 @@ msgstr "Apagar"
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2088,7 +2091,7 @@ msgstr "Tem certeza?"
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2108,7 +2111,7 @@ msgstr "Você não será capaz de reverter isso!"
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2254,7 +2257,7 @@ msgid "Muted"
msgstr "Silenciada"
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr "Nenhum categoria"
@@ -2455,7 +2458,7 @@ msgstr "Editar moeda"
msgid "Code"
msgstr "Código"
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr "Nenhuma moeda"
@@ -2917,7 +2920,7 @@ msgstr "Total final"
msgid "Total"
msgstr "Total"
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr "Total Final"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-04-14 06:16+0000\n"
"Last-Translator: Emil <emil.bjorkroth@gmail.com>\n"
"Language-Team: Swedish <https://translations.herculino.com/projects/wygiwyh/"
@@ -19,32 +19,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr ""
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Uppdatera"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -66,34 +66,34 @@ msgstr "Uppdatera"
msgid "Add"
msgstr ""
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr ""
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr ""
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr ""
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -132,7 +132,7 @@ msgstr ""
msgid "Account Groups"
msgstr ""
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -157,8 +157,10 @@ msgid ""
"Asset accounts count towards your Net Worth, but not towards your month."
msgstr ""
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -171,7 +173,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -487,9 +489,9 @@ msgstr ""
msgid "Suffix"
msgstr ""
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -509,7 +511,7 @@ msgstr ""
msgid "Decimal Places"
msgstr ""
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -521,63 +523,63 @@ msgstr ""
msgid "Currencies"
msgstr ""
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr ""
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr ""
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr ""
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr ""
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr ""
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr ""
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr ""
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr ""
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr ""
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr ""
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr ""
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr ""
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr ""
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -586,77 +588,77 @@ msgstr ""
msgid "Active"
msgstr ""
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr ""
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr ""
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr ""
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr ""
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr ""
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
msgid "Single exchange rate"
msgstr ""
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -706,11 +708,11 @@ msgstr ""
msgid "Create transaction"
msgstr ""
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr ""
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr ""
@@ -735,7 +737,7 @@ msgstr ""
msgid "You must provide an account."
msgstr ""
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr ""
@@ -754,7 +756,7 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -839,7 +841,7 @@ msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1014,8 +1016,8 @@ msgstr ""
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr ""
@@ -1115,7 +1117,7 @@ msgstr ""
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1133,7 +1135,7 @@ msgstr ""
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1326,6 +1328,7 @@ msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr ""
@@ -1341,50 +1344,50 @@ msgstr ""
msgid "Save and add another"
msgstr ""
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr ""
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr ""
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr ""
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr ""
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr ""
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr ""
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr ""
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr ""
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr ""
@@ -1672,11 +1675,11 @@ msgid "Installment Plan deleted successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr ""
@@ -1946,7 +1949,7 @@ msgstr ""
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -1967,7 +1970,7 @@ msgstr ""
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -1993,7 +1996,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2020,7 +2023,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2050,7 +2053,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2070,7 +2073,7 @@ msgstr ""
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2216,7 +2219,7 @@ msgid "Muted"
msgstr ""
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr ""
@@ -2417,7 +2420,7 @@ msgstr ""
msgid "Code"
msgstr ""
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr ""
@@ -2870,7 +2873,7 @@ msgstr ""
msgid "Total"
msgstr ""
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-22 20:16+0000\n"
"POT-Creation-Date: 2025-08-30 02:09+0000\n"
"PO-Revision-Date: 2025-05-12 14:16+0000\n"
"Last-Translator: Felix <xnovaua@gmail.com>\n"
"Language-Team: Ukrainian <https://translations.herculino.com/projects/"
@@ -20,32 +20,32 @@ msgstr ""
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.3\n"
#: apps/accounts/forms.py:24
#: apps/accounts/forms.py:26
msgid "Group name"
msgstr "Назва групи"
#: apps/accounts/forms.py:40 apps/accounts/forms.py:98
#: apps/currencies/forms.py:53 apps/currencies/forms.py:91
#: apps/currencies/forms.py:144 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/accounts/forms.py:42 apps/accounts/forms.py:118
#: apps/currencies/forms.py:55 apps/currencies/forms.py:93
#: apps/currencies/forms.py:146 apps/dca/forms.py:49 apps/dca/forms.py:224
#: apps/import_app/forms.py:34 apps/rules/forms.py:51 apps/rules/forms.py:93
#: apps/rules/forms.py:365 apps/transactions/forms.py:204
#: apps/transactions/forms.py:374 apps/transactions/forms.py:421
#: apps/transactions/forms.py:793 apps/transactions/forms.py:836
#: apps/transactions/forms.py:868 apps/transactions/forms.py:903
#: apps/transactions/forms.py:1057 apps/users/forms.py:217
#: apps/transactions/forms.py:369 apps/transactions/forms.py:416
#: apps/transactions/forms.py:788 apps/transactions/forms.py:831
#: apps/transactions/forms.py:863 apps/transactions/forms.py:898
#: apps/transactions/forms.py:1052 apps/users/forms.py:217
#: apps/users/forms.py:379
msgid "Update"
msgstr "Оновлення"
#: apps/accounts/forms.py:48 apps/accounts/forms.py:106
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:61
#: apps/currencies/forms.py:99 apps/currencies/forms.py:152
#: apps/accounts/forms.py:50 apps/accounts/forms.py:126
#: apps/common/widgets/tom_select.py:13 apps/currencies/forms.py:63
#: apps/currencies/forms.py:101 apps/currencies/forms.py:154
#: apps/dca/forms.py:57 apps/dca/forms.py:232 apps/import_app/forms.py:42
#: apps/rules/forms.py:59 apps/rules/forms.py:101 apps/rules/forms.py:373
#: apps/transactions/forms.py:189 apps/transactions/forms.py:213
#: apps/transactions/forms.py:383 apps/transactions/forms.py:801
#: apps/transactions/forms.py:844 apps/transactions/forms.py:876
#: apps/transactions/forms.py:911 apps/transactions/forms.py:1065
#: apps/transactions/forms.py:378 apps/transactions/forms.py:796
#: apps/transactions/forms.py:839 apps/transactions/forms.py:871
#: apps/transactions/forms.py:906 apps/transactions/forms.py:1060
#: apps/users/forms.py:225 apps/users/forms.py:387
#: templates/account_groups/fragments/list.html:9
#: templates/accounts/fragments/list.html:9
@@ -67,34 +67,34 @@ msgstr "Оновлення"
msgid "Add"
msgstr "Додати"
#: apps/accounts/forms.py:57 templates/accounts/fragments/list.html:26
#: apps/accounts/forms.py:59 templates/accounts/fragments/list.html:26
msgid "Group"
msgstr "Група"
#: apps/accounts/forms.py:115
#: apps/accounts/forms.py:135
msgid "New balance"
msgstr "Новий баланс"
#: apps/accounts/forms.py:121 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/accounts/forms.py:141 apps/dca/forms.py:85 apps/dca/forms.py:92
#: apps/insights/forms.py:118 apps/rules/forms.py:174 apps/rules/forms.py:189
#: apps/rules/models.py:38 apps/rules/models.py:286
#: apps/transactions/forms.py:42 apps/transactions/forms.py:256
#: apps/transactions/forms.py:455 apps/transactions/forms.py:462
#: apps/transactions/forms.py:674 apps/transactions/forms.py:935
#: apps/transactions/forms.py:450 apps/transactions/forms.py:457
#: apps/transactions/forms.py:669 apps/transactions/forms.py:930
#: apps/transactions/models.py:318 apps/transactions/models.py:501
#: apps/transactions/models.py:701 apps/transactions/models.py:951
#: templates/insights/fragments/category_overview/index.html:78
#: templates/insights/fragments/category_overview/index.html:528
#: templates/insights/fragments/category_overview/index.html:530
msgid "Category"
msgstr "Категорія"
#: apps/accounts/forms.py:128 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/accounts/forms.py:148 apps/dca/forms.py:101 apps/dca/forms.py:109
#: apps/export_app/forms.py:44 apps/export_app/forms.py:135
#: apps/rules/forms.py:177 apps/rules/forms.py:186 apps/rules/models.py:39
#: apps/rules/models.py:290 apps/transactions/filters.py:69
#: apps/transactions/forms.py:50 apps/transactions/forms.py:264
#: apps/transactions/forms.py:471 apps/transactions/forms.py:479
#: apps/transactions/forms.py:667 apps/transactions/forms.py:928
#: apps/transactions/forms.py:466 apps/transactions/forms.py:474
#: apps/transactions/forms.py:662 apps/transactions/forms.py:923
#: apps/transactions/models.py:324 apps/transactions/models.py:503
#: apps/transactions/models.py:705 apps/transactions/models.py:957
#: templates/includes/navbar.html:111 templates/includes/sidebar.html:192
@@ -133,7 +133,7 @@ msgstr "Група рахунків"
msgid "Account Groups"
msgstr "Групи рахунків"
#: apps/accounts/models.py:39 apps/currencies/models.py:39
#: apps/accounts/models.py:39 apps/currencies/models.py:44
#: templates/accounts/fragments/list.html:27
#: templates/yearly_overview/pages/overview_by_account.html:18
#: templates/yearly_overview/pages/overview_by_currency.html:20
@@ -159,8 +159,10 @@ msgid ""
msgstr ""
"Рахунки активів враховуються у вашій чистій вартості, але не у вашому місяці."
#: apps/accounts/models.py:62 templates/accounts/fragments/list.html:30
#: apps/accounts/models.py:62 apps/currencies/models.py:37
#: templates/accounts/fragments/list.html:30
#: templates/categories/fragments/list.html:24
#: templates/currencies/fragments/list.html:27
#: templates/entities/fragments/list.html:24
#: templates/tags/fragments/list.html:24
msgid "Archived"
@@ -175,7 +177,7 @@ msgstr ""
#: apps/accounts/models.py:75 apps/rules/forms.py:166 apps/rules/forms.py:179
#: apps/rules/models.py:30 apps/rules/models.py:242
#: apps/transactions/forms.py:62 apps/transactions/forms.py:276
#: apps/transactions/forms.py:659 apps/transactions/forms.py:920
#: apps/transactions/forms.py:654 apps/transactions/forms.py:915
#: apps/transactions/models.py:290 apps/transactions/models.py:461
#: apps/transactions/models.py:683 apps/transactions/models.py:925
#: templates/installment_plans/fragments/table.html:17
@@ -502,9 +504,9 @@ msgstr "Префікс"
msgid "Suffix"
msgstr "Суфікс"
#: apps/currencies/forms.py:69 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/currencies/forms.py:71 apps/dca/models.py:158 apps/rules/forms.py:169
#: apps/rules/forms.py:182 apps/rules/models.py:33 apps/rules/models.py:254
#: apps/transactions/forms.py:66 apps/transactions/forms.py:483
#: apps/transactions/forms.py:66 apps/transactions/forms.py:478
#: apps/transactions/models.py:300
#: templates/dca/fragments/strategy/details.html:52
#: templates/exchange_rates/fragments/table.html:10
@@ -524,7 +526,7 @@ msgstr "Назва валюти"
msgid "Decimal Places"
msgstr "Десяткові знаки"
#: apps/currencies/models.py:40 apps/export_app/forms.py:26
#: apps/currencies/models.py:45 apps/export_app/forms.py:26
#: apps/export_app/forms.py:133 apps/transactions/filters.py:60
#: templates/currencies/fragments/list.html:5
#: templates/currencies/pages/index.html:4 templates/includes/navbar.html:125
@@ -536,63 +538,63 @@ msgstr "Десяткові знаки"
msgid "Currencies"
msgstr "Валюти"
#: apps/currencies/models.py:49
#: apps/currencies/models.py:54
msgid "Currency cannot have itself as exchange currency."
msgstr "Валюта не може бути валютою обміну."
#: apps/currencies/models.py:60
#: apps/currencies/models.py:65
msgid "From Currency"
msgstr "З валюти"
#: apps/currencies/models.py:66
#: apps/currencies/models.py:71
msgid "To Currency"
msgstr "У валюту"
#: apps/currencies/models.py:69 apps/currencies/models.py:76
#: apps/currencies/models.py:74 apps/currencies/models.py:81
msgid "Exchange Rate"
msgstr "Обмінний курс"
#: apps/currencies/models.py:71
#: apps/currencies/models.py:76
msgid "Date and Time"
msgstr "Дата і час"
#: apps/currencies/models.py:73 apps/users/models.py:12
#: apps/currencies/models.py:78 apps/users/models.py:12
#: apps/users/models.py:497
msgid "Auto"
msgstr ""
#: apps/currencies/models.py:77 apps/export_app/forms.py:68
#: apps/currencies/models.py:82 apps/export_app/forms.py:68
#: apps/export_app/forms.py:145 templates/exchange_rates/fragments/list.html:6
#: templates/exchange_rates/pages/index.html:4
#: templates/includes/navbar.html:129 templates/includes/sidebar.html:226
msgid "Exchange Rates"
msgstr "Обмінні курси"
#: apps/currencies/models.py:89
#: apps/currencies/models.py:94
msgid "From and To currencies cannot be the same."
msgstr "Валюти «Від» і «До» не можуть бути однаковими."
#: apps/currencies/models.py:105
#: apps/currencies/models.py:110
msgid "On"
msgstr "On"
#: apps/currencies/models.py:106
#: apps/currencies/models.py:111
msgid "Every X hours"
msgstr "Кожні Х годин"
#: apps/currencies/models.py:107
#: apps/currencies/models.py:112
msgid "Not on"
msgstr "Not on"
#: apps/currencies/models.py:109
#: apps/currencies/models.py:114
msgid "Service Name"
msgstr "Назва сервісу"
#: apps/currencies/models.py:111
#: apps/currencies/models.py:116
msgid "Service Type"
msgstr "Тип сервісу"
#: apps/currencies/models.py:113 apps/transactions/models.py:214
#: apps/currencies/models.py:118 apps/transactions/models.py:214
#: apps/transactions/models.py:238 apps/transactions/models.py:262
#: templates/categories/fragments/list.html:21
#: templates/entities/fragments/list.html:21
@@ -601,79 +603,79 @@ msgstr "Тип сервісу"
msgid "Active"
msgstr "Активний"
#: apps/currencies/models.py:118
#: apps/currencies/models.py:123
msgid "API Key"
msgstr "Ключ API"
#: apps/currencies/models.py:119
#: apps/currencies/models.py:124
msgid "API key for the service (if required)"
msgstr "API-ключ для сервісу (якщо потрібно)"
#: apps/currencies/models.py:124
#: apps/currencies/models.py:129
msgid "Interval Type"
msgstr "Тип інтервалу"
#: apps/currencies/models.py:128
#: apps/currencies/models.py:133
msgid "Interval"
msgstr "Інтервал"
#: apps/currencies/models.py:131
#: apps/currencies/models.py:136
msgid "Last Successful Fetch"
msgstr "Остання успішна вибірка"
#: apps/currencies/models.py:136
#: apps/currencies/models.py:141
msgid "Target Currencies"
msgstr ""
#: apps/currencies/models.py:138
#: apps/currencies/models.py:143
msgid ""
"Select currencies to fetch exchange rates for. Rates will be fetched for "
"each currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:146
#: apps/currencies/models.py:151
msgid "Target Accounts"
msgstr ""
#: apps/currencies/models.py:148
#: apps/currencies/models.py:153
msgid ""
"Select accounts to fetch exchange rates for. Rates will be fetched for each "
"account's currency against their set exchange currency."
msgstr ""
#: apps/currencies/models.py:155
#: apps/currencies/models.py:160
#, fuzzy
#| msgid "Exchange Rate"
msgid "Single exchange rate"
msgstr "Обмінний курс"
#: apps/currencies/models.py:158
#: apps/currencies/models.py:163
msgid "Create one exchange rate and keep updating it. Avoids database clutter."
msgstr ""
#: apps/currencies/models.py:163
#: apps/currencies/models.py:168
msgid "Exchange Rate Service"
msgstr ""
#: apps/currencies/models.py:164
#: apps/currencies/models.py:169
msgid "Exchange Rate Services"
msgstr ""
#: apps/currencies/models.py:216
#: apps/currencies/models.py:221
msgid "'Every X hours' interval type requires a positive integer."
msgstr ""
#: apps/currencies/models.py:225
#: apps/currencies/models.py:230
msgid "'Every X hours' interval must be between 1 and 24."
msgstr ""
#: apps/currencies/models.py:239
#: apps/currencies/models.py:244
msgid ""
"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., "
"'1-5,8,10-12')."
msgstr ""
#: apps/currencies/models.py:250
#: apps/currencies/models.py:255
msgid ""
"Invalid format. Please check the requirements for your selected interval "
"type."
@@ -723,11 +725,11 @@ msgstr ""
msgid "Create transaction"
msgstr ""
#: apps/dca/forms.py:70 apps/transactions/forms.py:430
#: apps/dca/forms.py:70 apps/transactions/forms.py:425
msgid "From Account"
msgstr ""
#: apps/dca/forms.py:76 apps/transactions/forms.py:435
#: apps/dca/forms.py:76 apps/transactions/forms.py:430
msgid "To Account"
msgstr ""
@@ -752,7 +754,7 @@ msgstr ""
msgid "You must provide an account."
msgstr ""
#: apps/dca/forms.py:312 apps/transactions/forms.py:605
#: apps/dca/forms.py:312 apps/transactions/forms.py:600
msgid "From and To accounts must be different."
msgstr ""
@@ -771,7 +773,7 @@ msgstr ""
#: apps/dca/models.py:26 apps/dca/models.py:181 apps/rules/forms.py:173
#: apps/rules/forms.py:188 apps/rules/models.py:37 apps/rules/models.py:270
#: apps/transactions/forms.py:499 apps/transactions/models.py:314
#: apps/transactions/forms.py:494 apps/transactions/models.py:314
#: apps/transactions/models.py:510 apps/transactions/models.py:711
#: apps/transactions/models.py:947
msgid "Notes"
@@ -856,7 +858,7 @@ msgstr ""
#: apps/rules/forms.py:178 apps/rules/forms.py:187 apps/rules/models.py:40
#: apps/rules/models.py:282 apps/transactions/filters.py:74
#: apps/transactions/forms.py:58 apps/transactions/forms.py:272
#: apps/transactions/forms.py:682 apps/transactions/forms.py:943
#: apps/transactions/forms.py:677 apps/transactions/forms.py:938
#: apps/transactions/models.py:273 apps/transactions/models.py:329
#: apps/transactions/models.py:506 apps/transactions/models.py:708
#: apps/transactions/models.py:962 templates/entities/fragments/list.html:5
@@ -1031,8 +1033,8 @@ msgstr ""
#: apps/insights/forms.py:119 apps/insights/utils/sankey.py:36
#: apps/insights/utils/sankey.py:167 apps/transactions/filters.py:189
#: templates/insights/fragments/category_overview/index.html:88
#: templates/insights/fragments/category_overview/index.html:393
#: templates/insights/fragments/category_overview/index.html:422
#: templates/insights/fragments/category_overview/index.html:395
#: templates/insights/fragments/category_overview/index.html:424
msgid "Uncategorized"
msgstr ""
@@ -1132,7 +1134,7 @@ msgstr ""
#: apps/rules/forms.py:170 apps/rules/forms.py:183 apps/rules/models.py:34
#: apps/rules/models.py:258 apps/transactions/forms.py:70
#: apps/transactions/forms.py:486 apps/transactions/forms.py:688
#: apps/transactions/forms.py:481 apps/transactions/forms.py:683
#: apps/transactions/models.py:301 apps/transactions/models.py:484
#: apps/transactions/models.py:713
msgid "Reference Date"
@@ -1150,7 +1152,7 @@ msgstr ""
#: apps/rules/forms.py:172 apps/rules/forms.py:185 apps/rules/models.py:14
#: apps/rules/models.py:36 apps/rules/models.py:266
#: apps/transactions/forms.py:490 apps/transactions/models.py:312
#: apps/transactions/forms.py:485 apps/transactions/models.py:312
#: apps/transactions/models.py:468 apps/transactions/models.py:697
#: apps/transactions/models.py:945
msgid "Description"
@@ -1345,6 +1347,7 @@ msgid "Any entity"
msgstr ""
#: apps/transactions/filters.py:202
#: templates/insights/fragments/category_overview/index.html:274
msgid "No entity"
msgstr ""
@@ -1360,50 +1363,50 @@ msgstr ""
msgid "Save and add another"
msgstr ""
#: apps/transactions/forms.py:300 apps/transactions/forms.py:506
#: apps/transactions/forms.py:300 apps/transactions/forms.py:501
msgid "Muted transactions won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:442
#: apps/transactions/forms.py:437
msgid "From Amount"
msgstr ""
#: apps/transactions/forms.py:447
#: apps/transactions/forms.py:442
msgid "To Amount"
msgstr ""
#: apps/transactions/forms.py:503 apps/transactions/models.py:211
#: apps/transactions/forms.py:498 apps/transactions/models.py:211
#: apps/transactions/models.py:302 apps/transactions/models.py:935
msgid "Mute"
msgstr ""
#: apps/transactions/forms.py:572
#: apps/transactions/forms.py:567
#: templates/cotton/ui/quick_transactions_buttons.html:40
#: templates/cotton/ui/transactions_fab.html:44
msgid "Transfer"
msgstr ""
#: apps/transactions/forms.py:822
#: apps/transactions/forms.py:817
msgid "Tag name"
msgstr ""
#: apps/transactions/forms.py:854
#: apps/transactions/forms.py:849
msgid "Entity name"
msgstr ""
#: apps/transactions/forms.py:886
#: apps/transactions/forms.py:881
msgid "Category name"
msgstr ""
#: apps/transactions/forms.py:888
#: apps/transactions/forms.py:883
msgid "Muted categories won't be displayed on monthly summaries"
msgstr ""
#: apps/transactions/forms.py:1046
#: apps/transactions/forms.py:1041
msgid "future transactions"
msgstr ""
#: apps/transactions/forms.py:1076
#: apps/transactions/forms.py:1071
msgid "End date should be after the start date"
msgstr ""
@@ -1691,11 +1694,11 @@ msgid "Installment Plan deleted successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:45
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:167
#: apps/transactions/views/quick_transactions.py:222 apps/users/views.py:170
msgid "Item added successfully"
msgstr ""
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:199
#: apps/transactions/views/quick_transactions.py:73 apps/users/views.py:202
msgid "Item updated successfully"
msgstr ""
@@ -1967,7 +1970,7 @@ msgstr ""
#: templates/account_groups/fragments/list.html:32
#: templates/accounts/fragments/list.html:37
#: templates/categories/fragments/table.html:24
#: templates/currencies/fragments/list.html:33
#: templates/currencies/fragments/list.html:34
#: templates/dca/fragments/strategy/details.html:63
#: templates/entities/fragments/table.html:23
#: templates/exchange_rates/fragments/table.html:19
@@ -1988,7 +1991,7 @@ msgstr ""
#: templates/categories/fragments/table.html:29
#: templates/cotton/transaction/item.html:129
#: templates/cotton/ui/transactions_action_bar.html:52
#: templates/currencies/fragments/list.html:37
#: templates/currencies/fragments/list.html:38
#: templates/dca/fragments/strategy/details.html:67
#: templates/dca/fragments/strategy/list.html:36
#: templates/entities/fragments/table.html:28
@@ -2014,7 +2017,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:192
#: templates/cotton/ui/deleted_transactions_action_bar.html:55
#: templates/cotton/ui/transactions_action_bar.html:90
#: templates/currencies/fragments/list.html:44
#: templates/currencies/fragments/list.html:45
#: templates/dca/fragments/strategy/details.html:75
#: templates/dca/fragments/strategy/list.html:44
#: templates/entities/fragments/table.html:36
@@ -2041,7 +2044,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:196
#: templates/cotton/ui/deleted_transactions_action_bar.html:57
#: templates/cotton/ui/transactions_action_bar.html:92
#: templates/currencies/fragments/list.html:48
#: templates/currencies/fragments/list.html:49
#: templates/dca/fragments/strategy/details.html:80
#: templates/dca/fragments/strategy/list.html:48
#: templates/entities/fragments/table.html:40
@@ -2071,7 +2074,7 @@ msgstr ""
#: templates/cotton/transaction/item.html:197
#: templates/cotton/ui/deleted_transactions_action_bar.html:58
#: templates/cotton/ui/transactions_action_bar.html:93
#: templates/currencies/fragments/list.html:49
#: templates/currencies/fragments/list.html:50
#: templates/dca/fragments/strategy/details.html:81
#: templates/dca/fragments/strategy/list.html:49
#: templates/entities/fragments/table.html:41
@@ -2091,7 +2094,7 @@ msgstr ""
#: templates/categories/fragments/table.html:43
#: templates/cotton/transaction/item.html:142
#: templates/cotton/transaction/item.html:198
#: templates/currencies/fragments/list.html:50
#: templates/currencies/fragments/list.html:51
#: templates/dca/fragments/strategy/details.html:82
#: templates/dca/fragments/strategy/list.html:50
#: templates/entities/fragments/table.html:42
@@ -2237,7 +2240,7 @@ msgid "Muted"
msgstr ""
#: templates/categories/fragments/table.html:75
#: templates/insights/fragments/category_overview/index.html:538
#: templates/insights/fragments/category_overview/index.html:540
msgid "No categories"
msgstr ""
@@ -2438,7 +2441,7 @@ msgstr ""
msgid "Code"
msgstr ""
#: templates/currencies/fragments/list.html:61
#: templates/currencies/fragments/list.html:63
msgid "No currencies"
msgstr ""
@@ -2891,7 +2894,7 @@ msgstr ""
msgid "Total"
msgstr ""
#: templates/insights/fragments/category_overview/index.html:515
#: templates/insights/fragments/category_overview/index.html:517
msgid "Final Total"
msgstr ""

View File

@@ -1,8 +1,9 @@
{% load markdown %}
{% load i18n %}
<div class="transaction {% if transaction.type == "EX" %}expense{% else %}income{% endif %} tw:group/transaction tw:relative tw:hover:z-10">
<div
class="transaction {% if transaction.type == "EX" %}expense{% else %}income{% endif %} tw:group/transaction tw:relative tw:hover:z-10">
<div class="d-flex my-1">
{% if not disable_selection %}
{% if not disable_selection or not dummy %}
<label class="px-3 d-flex align-items-center justify-content-center">
<input class="form-check-input" type="checkbox" name="transactions" value="{{ transaction.id }}"
id="check-{{ transaction.id }}" aria-label="{% translate 'Select' %}" hx-preserve>
@@ -19,9 +20,10 @@
<a class="text-decoration-none p-3 tw:text-gray-500!"
title="{% if transaction.is_paid %}{% trans 'Paid' %}{% else %}{% trans 'Projected' %}{% endif %}"
role="button"
{% if not dummy %}
hx-get="{% url 'transaction_pay' transaction_id=transaction.id %}"
hx-target="closest .transaction"
hx-swap="outerHTML">
hx-swap="outerHTML"{% endif %}>
{% if transaction.is_paid %}<i class="fa-regular fa-circle-check"></i>{% else %}<i
class="fa-regular fa-circle"></i>{% endif %}
</a>
@@ -33,7 +35,8 @@
</div>
{% endif %}
</div>
<div class="col-lg col-12 {% if transaction.account.is_untracked_by or transaction.category.mute or transaction.mute %}tw:brightness-80{% endif %}">
<div
class="col-lg col-12 {% if transaction.account.is_untracked_by or transaction.category.mute or transaction.mute %}tw:brightness-80{% endif %}">
{# Date#}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-calendar fa-fw me-1 fa-xs"></i></div>
@@ -58,14 +61,20 @@
</div>
<div class="tw:text-gray-400 tw:text-sm">
{# Entities #}
{% with transaction.entities.all as entities %}
{% if entities %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-user-group fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ entities|join:", " }}</div>
</div>
{% endif %}
{% endwith %}
{% comment %} First, check for the highest priority: a valid 'overriden_entities' list. {% endcomment %}
{% if overriden_entities %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-user-group fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ overriden_entities|join:", " }}</div>
</div>
{% comment %} If no override, fall back to transaction entities, but ONLY if the transaction has an ID. {% endcomment %}
{% elif transaction.id and transaction.entities.all %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-user-group fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ transaction.entities.all|join:", " }}</div>
</div>
{% endif %}
{# Notes#}
{% if transaction.notes %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
@@ -81,17 +90,24 @@
</div>
{% endif %}
{# Tags#}
{% with transaction.tags.all as tags %}
{% if tags %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-hashtag fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ tags|join:", " }}</div>
</div>
{% endif %}
{% endwith %}
{% comment %} First, check for the highest priority: a valid 'overriden_tags' list. {% endcomment %}
{% if overriden_tags %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-hashtag fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ overriden_tags|join:", " }}</div>
</div>
{% comment %} If no override, fall back to transaction tags, but ONLY if the transaction has an ID. {% endcomment %}
{% elif transaction.id and transaction.tags.all %}
<div class="row mb-2 mb-lg-1 tw:text-gray-400">
<div class="col-auto pe-1"><i class="fa-solid fa-hashtag fa-fw me-1 fa-xs"></i></div>
<div class="col ps-0">{{ transaction.tags.all|join:", " }}</div>
</div>
{% endif %}
</div>
</div>
<div class="col-lg-auto col-12 text-lg-end align-self-end {% if transaction.account.is_untracked_by or transaction.category.mute or transaction.mute %}tw:brightness-80{% endif %}">
<div
class="col-lg-auto col-12 text-lg-end align-self-end {% if transaction.account.is_untracked_by or transaction.category.mute or transaction.mute %}tw:brightness-80{% endif %}">
<div class="main-amount mb-2 mb-lg-0">
<c-amount.display
:amount="transaction.amount"
@@ -101,107 +117,136 @@
color="{% if transaction.type == "EX" %}red{% else %}green{% endif %}"></c-amount.display>
</div>
{# Exchange Rate#}
{% with exchanged=transaction.exchanged_amount %}
{% if exchanged %}
<div class="exchanged-amount mb-2 mb-lg-0">
<c-amount.display
:amount="exchanged.amount"
:prefix="exchanged.prefix"
:suffix="exchanged.suffix"
:decimal_places="exchanged.decimal_places"
color="grey"></c-amount.display>
</div>
{% endif %}
{% endwith %}
{% if not dummy %}
{% with exchanged=transaction.exchanged_amount %}
{% if exchanged %}
<div class="exchanged-amount mb-2 mb-lg-0">
<c-amount.display
:amount="exchanged.amount"
:prefix="exchanged.prefix"
:suffix="exchanged.suffix"
:decimal_places="exchanged.decimal_places"
color="grey"></c-amount.display>
</div>
{% endif %}
{% endwith %}
{% endif %}
<div>
{% if transaction.account.group %}{{ transaction.account.group.name }} • {% endif %}{{ transaction.account.name }}
</div>
</div>
<div>
{# Item actions#}
<div
class="transaction-actions tw:absolute! tw:left-1/2 tw:top-0 tw:-translate-x-1/2 tw:-translate-y-1/2 tw:invisible tw:group-hover/transaction:visible d-flex flex-row card">
<div class="card-body p-1 shadow-lg d-flex flex-row gap-1">
{% if not transaction.deleted %}
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Edit" %}"
hx-get="{% url 'transaction_edit' transaction_id=transaction.id %}"
hx-target="#generic-offcanvas" hx-swap="innerHTML">
<i class="fa-solid fa-pencil fa-fw"></i></a>
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'transaction_delete' transaction_id=transaction.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal"><i class="fa-solid fa-trash fa-fw text-danger"></i>
</a>
<button class="btn btn-secondary btn-sm transaction-action" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa-solid fa-ellipsis fa-fw"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-md-start">
{% if transaction.account.is_untracked_by %}
<li>
<a class="dropdown-item disabled d-flex align-items-center" aria-disabled="true">
<i class="fa-solid fa-eye fa-fw me-2"></i>
<div>
{% translate 'Show on summaries' %}
<div class="d-block text-body-secondary tw:text-xs tw:font-medium">{% translate 'Controlled by account' %}</div>
</div>
</a>
{% if not dummy %}
<div>
{# Item actions#}
<div
class="transaction-actions tw:absolute! tw:left-1/2 tw:top-0 tw:-translate-x-1/2 tw:-translate-y-1/2 tw:invisible tw:group-hover/transaction:visible d-flex flex-row card">
<div class="card-body p-1 shadow-lg d-flex flex-row gap-1">
{% if not transaction.deleted %}
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Edit" %}"
hx-get="{% url 'transaction_edit' transaction_id=transaction.id %}"
hx-target="#generic-offcanvas" hx-swap="innerHTML">
<i class="fa-solid fa-pencil fa-fw"></i></a>
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'transaction_delete' transaction_id=transaction.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal"><i class="fa-solid fa-trash fa-fw text-danger"></i>
</a>
<button class="btn btn-secondary btn-sm transaction-action" type="button" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="fa-solid fa-ellipsis fa-fw"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-md-start">
{% if transaction.account.is_untracked_by %}
<li>
<a class="dropdown-item disabled d-flex align-items-center" aria-disabled="true">
<i class="fa-solid fa-eye fa-fw me-2"></i>
<div>
{% translate 'Show on summaries' %}
<div
class="d-block text-body-secondary tw:text-xs tw:font-medium">{% translate 'Controlled by account' %}</div>
</div>
</a>
</li>
{% elif transaction.category.mute %}
<li>
<a class="dropdown-item disabled d-flex align-items-center" aria-disabled="true">
<i class="fa-solid fa-eye fa-fw me-2"></i>
<div>
{% translate 'Show on summaries' %}
<div
class="d-block text-body-secondary tw:text-xs tw:font-medium">{% translate 'Controlled by category' %}</div>
</div>
</a>
</li>
{% elif transaction.mute %}
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_mute' transaction_id=transaction.id %}"
hx-target="closest .transaction" hx-swap="outerHTML"><i
class="fa-solid fa-eye fa-fw me-2"></i>{% translate 'Show on summaries' %}</a></li>
{% else %}
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_mute' transaction_id=transaction.id %}"
hx-target="closest .transaction" hx-swap="outerHTML"><i
class="fa-solid fa-eye-slash fa-fw me-2"></i>{% translate 'Hide from summaries' %}</a></li>
{% endif %}
<li><a class="dropdown-item" href="#"
hx-get="{% url 'quick_transaction_add_as_quick_transaction' transaction_id=transaction.id %}"><i
class="fa-solid fa-person-running fa-fw me-2"></i>{% translate 'Add as quick transaction' %}</a>
</li>
{% elif transaction.category.mute %}
<li>
<a class="dropdown-item disabled d-flex align-items-center" aria-disabled="true">
<i class="fa-solid fa-eye fa-fw me-2"></i>
<div>
{% translate 'Show on summaries' %}
<div class="d-block text-body-secondary tw:text-xs tw:font-medium">{% translate 'Controlled by category' %}</div>
</div>
</a>
<hr class="dropdown-divider">
</li>
{% elif transaction.mute %}
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_mute' transaction_id=transaction.id %}" hx-target="closest .transaction" hx-swap="outerHTML"><i class="fa-solid fa-eye fa-fw me-2"></i>{% translate 'Show on summaries' %}</a></li>
{% else %}
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_mute' transaction_id=transaction.id %}" hx-target="closest .transaction" hx-swap="outerHTML"><i class="fa-solid fa-eye-slash fa-fw me-2"></i>{% translate 'Hide from summaries' %}</a></li>
{% endif %}
<li><a class="dropdown-item" href="#" hx-get="{% url 'quick_transaction_add_as_quick_transaction' transaction_id=transaction.id %}"><i class="fa-solid fa-person-running fa-fw me-2"></i>{% translate 'Add as quick transaction' %}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_change_month' transaction_id=transaction.id change_type='previous' %}"><i class="fa-solid fa-calendar-minus fa-fw me-2"></i>{% translate 'Move to previous month' %}</a></li>
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_change_month' transaction_id=transaction.id change_type='next' %}"><i class="fa-solid fa-calendar-plus fa-fw me-2"></i>{% translate 'Move to next month' %}</a></li>
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_move_to_today' transaction_id=transaction.id %}"><i class="fa-solid fa-calendar-day fa-fw me-2"></i>{% translate 'Move to today' %}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" hx-get="{% url 'transaction_clone' transaction_id=transaction.id %}"><i class="fa-solid fa-clone fa-fw me-2"></i>{% translate 'Duplicate' %}</a></li>
</ul>
{% else %}
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Restore" %}"
hx-get="{% url 'transaction_undelete' transaction_id=transaction.id %}"><i
class="fa-solid fa-trash-arrow-up"></i></a>
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'transaction_delete' transaction_id=transaction.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal"><i class="fa-solid fa-trash fa-fw text-danger"></i>
</a>
{% endif %}
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_change_month' transaction_id=transaction.id change_type='previous' %}"><i
class="fa-solid fa-calendar-minus fa-fw me-2"></i>{% translate 'Move to previous month' %}</a>
</li>
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_change_month' transaction_id=transaction.id change_type='next' %}"><i
class="fa-solid fa-calendar-plus fa-fw me-2"></i>{% translate 'Move to next month' %}</a></li>
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_move_to_today' transaction_id=transaction.id %}"><i
class="fa-solid fa-calendar-day fa-fw me-2"></i>{% translate 'Move to today' %}</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#"
hx-get="{% url 'transaction_clone' transaction_id=transaction.id %}"><i
class="fa-solid fa-clone fa-fw me-2"></i>{% translate 'Duplicate' %}</a></li>
</ul>
{% else %}
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Restore" %}"
hx-get="{% url 'transaction_undelete' transaction_id=transaction.id %}"><i
class="fa-solid fa-trash-arrow-up"></i></a>
<a class="btn btn-secondary btn-sm transaction-action"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'transaction_delete' transaction_id=transaction.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal"><i class="fa-solid fa-trash fa-fw text-danger"></i>
</a>
{% endif %}
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
</div>

View File

@@ -24,6 +24,7 @@
<th scope="col" class="col-auto"></th>
<th scope="col" class="col-auto">{% translate 'Code' %}</th>
<th scope="col" class="col">{% translate 'Name' %}</th>
<th scope="col" class="col">{% translate 'Archived' %}</th>
</tr>
</thead>
<tbody>
@@ -53,6 +54,7 @@
</td>
<td class="col-auto">{{ currency.code }}</td>
<td class="col">{{ currency.name }}</td>
<td class="col">{% if currency.is_archived %}<i class="fa-solid fa-solid fa-check text-success"></i>{% endif %}</td>
</tr>
{% endfor %}
</tbody>

View File

@@ -268,95 +268,97 @@
<!-- Entity rows -->
{% if show_entities %}
{% for entity_id, entity in tag.entities.items %}
<tr class="table-row-nested-2">
<td class="ps-5">
<i class="fa-solid fa-user-group fa-fw me-2 text-muted"></i>{{ entity.name }}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.income_current != 0 %}
<c-amount.display
:amount="currency.income_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% elif showing == 'projected' and currency.income_projected != 0 %}
<c-amount.display
:amount="currency.income_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% elif showing == 'final' and currency.total_income != 0 %}
<c-amount.display
:amount="currency.total_income"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.expense_current != 0 %}
<c-amount.display
:amount="currency.expense_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% elif showing == 'projected' and currency.expense_projected != 0 %}
<c-amount.display
:amount="currency.expense_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% elif showing == 'final' and currency.total_expense != 0 %}
<c-amount.display
:amount="currency.total_expense"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.total_current != 0 %}
<c-amount.display
:amount="currency.total_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% elif showing == 'projected' and currency.total_projected != 0 %}
<c-amount.display
:amount="currency.total_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% elif showing == 'final' and currency.total_final != 0 %}
<c-amount.display
:amount="currency.total_final"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
</tr>
{% if entity.name or not entity.name and tag.entities.values|length > 1 %}
<tr class="table-row-nested-2">
<td class="ps-5">
<i class="fa-solid fa-user-group fa-fw me-2 text-muted"></i>{% if entity.name %}{{ entity.name }}{% else %}{% trans 'No entity' %}{% endif %}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.income_current != 0 %}
<c-amount.display
:amount="currency.income_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% elif showing == 'projected' and currency.income_projected != 0 %}
<c-amount.display
:amount="currency.income_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% elif showing == 'final' and currency.total_income != 0 %}
<c-amount.display
:amount="currency.total_income"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="green"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.expense_current != 0 %}
<c-amount.display
:amount="currency.expense_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% elif showing == 'projected' and currency.expense_projected != 0 %}
<c-amount.display
:amount="currency.expense_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% elif showing == 'final' and currency.total_expense != 0 %}
<c-amount.display
:amount="currency.total_expense"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="red"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
<td>
{% for currency in entity.currencies.values %}
{% if showing == 'current' and currency.total_current != 0 %}
<c-amount.display
:amount="currency.total_current"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% elif showing == 'projected' and currency.total_projected != 0 %}
<c-amount.display
:amount="currency.total_projected"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% elif showing == 'final' and currency.total_final != 0 %}
<c-amount.display
:amount="currency.total_final"
:prefix="currency.currency.prefix"
:suffix="currency.currency.suffix"
:decimal_places="currency.currency.decimal_places"
color="{% if currency.total_final < 0 %}red{% else %}green{% endif %}"></c-amount.display>
{% else %}
<div>-</div>
{% endif %}
{% endfor %}
</td>
</tr>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}

View File

@@ -23,6 +23,7 @@
<tr>
<th scope="col" class="col-auto"></th>
<th scope="col" class="col-auto"></th>
<th scope="col" class="col-auto">{% translate 'Order' %}</th>
<th scope="col" class="col">{% translate 'Name' %}</th>
</tr>
</thead>
@@ -80,6 +81,9 @@
<i class="fa-solid fa-toggle-off tw:text-red-400"></i>{% endif %}
</a>
</td>
<td class="col text-center">
<div>{{ rule.order }}</div>
</td>
<td class="col">
<div>{{ rule.name }}</div>
<div class="tw:text-gray-400">{{ rule.description }}</div>

View File

@@ -0,0 +1,16 @@
{% extends 'extends/offcanvas.html' %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block title %}{% translate 'Edit transaction rule' %}{% endblock %}
{% block body %}
<form hx-post="{% url 'transaction_rule_dry_run_created' pk=rule.id %}" hx-target="#generic-offcanvas"
hx-indicator="#dry-run-created-result, closest form" class="show-loading" novalidate>
{% crispy form %}
</form>
<hr>
<div id="dry-run-created-result" class="show-loading">
{% include 'rules/fragments/transaction_rule/dry_run/visual.html' with logs=logs results=results %}
</div>
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends 'extends/offcanvas.html' %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block title %}{% translate 'Edit transaction rule' %}{% endblock %}
{% block body %}
<form hx-post="{% url 'transaction_rule_dry_run_deleted' pk=rule.id %}" hx-target="#generic-offcanvas"
hx-indicator="#dry-run-deleted-result, closest form" class="show-loading" novalidate>
{% crispy form %}
</form>
<hr>
<div id="dry-run-deleted-result" class="show-loading">
{% include 'rules/fragments/transaction_rule/dry_run/visual.html' with logs=logs results=results %}
</div>
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends 'extends/offcanvas.html' %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block title %}{% translate 'Edit transaction rule' %}{% endblock %}
{% block body %}
<form hx-post="{% url 'transaction_rule_dry_run_updated' pk=rule.id %}" hx-target="#generic-offcanvas"
hx-indicator="#dry-run-updated-result, closest form" class="show-loading" novalidate>
{% crispy form %}
</form>
<hr>
<div id="dry-run-updated-result" class="show-loading">
{% include 'rules/fragments/transaction_rule/dry_run/visual.html' with logs=logs results=results %}
</div>
{% endblock %}

View File

@@ -0,0 +1,101 @@
{% load i18n %}
<div class="card tw:max-h-full tw:overflow-auto tw:overflow-x-auto">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<button class="nav-link active" id="visual-tab" data-bs-toggle="tab" data-bs-target="#visual-tab-pane"
type="button" role="tab" aria-controls="visual-tab-pane"
aria-selected="true">{% translate 'Visual' %}</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="logs-tab" data-bs-toggle="tab" data-bs-target="#logs-tab-pane" type="button"
role="tab" aria-controls="logs-tab-pane" aria-selected="false">{% translate 'Logs' %}</button>
</li>
</ul>
</div>
<div class="card-body">
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="visual-tab-pane" role="tabpanel" aria-labelledby="home-tab"
tabindex="0">
{% if not results %}
{% translate 'Run a test to see...' %}
{% else %}
{% for result in results %}
{% if result.type == 'header' %}
<div class="my-3">
<h6 class="text-center mb-3">
<span class="badge text-bg-secondary">
{% if result.header_type == "edit_transaction" %}
{% translate 'Edit transaction' %}
{% elif result.header_type == "update_or_create_transaction" %}
{% translate 'Update or create transaction' %}
{% endif %}
</span>
</h6>
</div>
{% endif %}
{% if result.type == 'triggering_transaction' %}
<div class="mt-4">
<h6 class="text-center mb-3"><span class="badge text-bg-secondary">{% translate 'Start' %}</span></h6>
<c-transaction.item :transaction="result.transaction" :dummy="True"
:disable-selection="True"></c-transaction.item>
</div>
{% endif %}
{% if result.type == 'edit_transaction' %}
<div>
<div>
{% translate 'Set' %} <span
class="badge text-bg-secondary">{{ result.field }}</span> {% translate 'to' %}
<span class="badge text-bg-secondary">{{ result.new_value }}</span>
</div>
<c-transaction.item :transaction="result.transaction" :dummy="True"
:disable-selection="True"></c-transaction.item>
</div>
{% endif %}
{% if result.type == 'update_or_create_transaction' %}
<div>
<div class="alert alert-info" role="alert">
{% translate 'Search' %}: {{ result.query }}
</div>
{% if result.start_transaction %}
<c-transaction.item :transaction="result.start_transaction" :dummy="True"
:disable-selection="True"></c-transaction.item>
{% else %}
<div class="alert alert-danger" role="alert">
{% translate 'No transaction found, a new one will be created' %}
</div>
{% endif %}
<div class="text-center h3 my-2"><i class="fa-solid fa-arrow-down"></i></div>
<c-transaction.item :transaction="result.end_transaction" :dummy="True"
:disable-selection="True"></c-transaction.item>
</div>
{% endif %}
{% if result.type == 'error' %}
<div>
<div class="alert alert-{% if result.level == 'error' %}danger{% elif result.level == 'warning' %}warning{% else %}info{% endif %}" role="alert">
{{ result.error }}
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
</div>
<div class="tab-pane fade" id="logs-tab-pane" role="tabpanel" aria-labelledby="logs-tab" tabindex="0">
{% if not logs %}
{% translate 'Run a test to see...' %}
{% else %}
<pre>
{{ logs|linebreaks }}
</pre>
{% endif %}
</div>
</div>
</div>
</div>

View File

@@ -30,95 +30,128 @@
<div class="my-3">
<div class="tw:text-xl mb-2">{% translate 'Then...' %}</div>
{% for action in transaction_rule.transaction_actions.all %}
<div class="card mb-3">
<div class="card-header">
<div><span class="badge text-bg-primary">{% trans 'Edit transaction' %}</span></div>
{% for action in all_actions %}
{% if action.action_type == "edit_transaction" %}
<div class="card mb-3">
<div class="card-header">
<div>
{% if action.order != 0 %}<span class="badge text-bg-secondary">{{ action.order }}</span>{% endif %}
<span class="badge text-bg-primary">{% trans 'Edit transaction' %}</span>
</div>
</div>
<div class="card-body">
<div>
{% translate 'Set' %} <span
class="badge text-bg-secondary">{{ action.get_field_display }}</span> {% translate 'to' %}
</div>
<div class="text-bg-secondary rounded-3 mt-3 p-2">{{ action.value }}</div>
</div>
<div class="card-footer text-end">
<a class="text-decoration-none tw:text-gray-400 p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate 'Edit' %}"
hx-get="{% url 'transaction_rule_action_edit' transaction_rule_action_id=action.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-pencil fa-fw"></i>
</a>
<a class="text-danger text-decoration-none p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate 'Delete' %}"
hx-delete="{% url 'transaction_rule_action_delete' transaction_rule_action_id=action.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate 'Are you sure?' %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate 'Yes, delete it!' %}"
_="install prompt_swal">
<i class="fa-solid fa-trash fa-fw"></i>
</a>
</div>
</div>
<div class="card-body">
<div>{% translate 'Set' %} <span
class="badge text-bg-secondary">{{ action.get_field_display }}</span> {% translate 'to' %}</div>
<div class="text-bg-secondary rounded-3 mt-3 p-2">{{ action.value }}</div>
{% elif action.action_type == "update_or_create_transaction" %}
<div class="card mb-3">
<div class="card-header">
<div>
{% if action.order != 0 %}<span class="badge text-bg-secondary">{{ action.order }}</span>{% endif %}
<span class="badge text-bg-primary">{% trans 'Update or create transaction' %}</span>
</div>
</div>
<div class="card-body">
<div>{% trans 'Edit to view' %}</div>
</div>
<div class="card-footer text-end">
<a class="text-decoration-none tw:text-gray-400 p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate 'Edit' %}"
hx-get="{% url 'update_or_create_transaction_rule_action_edit' pk=action.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-pencil fa-fw"></i>
</a>
<a class="text-danger text-decoration-none p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate 'Delete' %}"
hx-delete="{% url 'update_or_create_transaction_rule_action_delete' pk=action.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate 'Are you sure?' %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate 'Yes, delete it!' %}"
_="install prompt_swal">
<i class="fa-solid fa-trash fa-fw"></i>
</a>
</div>
</div>
<div class="card-footer text-end">
<a class="text-decoration-none tw:text-gray-400 p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Edit" %}"
hx-get="{% url 'transaction_rule_action_edit' transaction_rule_action_id=action.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-pencil fa-fw"></i>
</a>
<a class="text-danger text-decoration-none p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'transaction_rule_action_delete' transaction_rule_action_id=action.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal">
<i class="fa-solid fa-trash fa-fw"></i>
</a>
</div>
</div>
{% endfor %}
{% for action in transaction_rule.update_or_create_transaction_actions.all %}
<div class="card mb-3">
<div class="card-header">
<div><span class="badge text-bg-primary">{% trans 'Update or create transaction' %}</span></div>
</div>
<div class="card-body">
<div>{% trans 'Edit to view' %}</div>
</div>
<div class="card-footer text-end">
<a class="text-decoration-none tw:text-gray-400 p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Edit" %}"
hx-get="{% url 'update_or_create_transaction_rule_action_edit' pk=action.id %}"
hx-target="#generic-offcanvas">
<i class="fa-solid fa-pencil fa-fw"></i>
</a>
<a class="text-danger text-decoration-none p-1"
role="button"
data-bs-toggle="tooltip"
data-bs-title="{% translate "Delete" %}"
hx-delete="{% url 'update_or_create_transaction_rule_action_delete' pk=action.id %}"
hx-trigger='confirmed'
data-bypass-on-ctrl="true"
data-title="{% translate "Are you sure?" %}"
data-text="{% translate "You won't be able to revert this!" %}"
data-confirm-text="{% translate "Yes, delete it!" %}"
_="install prompt_swal">
<i class="fa-solid fa-trash fa-fw"></i>
</a>
</div>
</div>
{% endfor %}
{% if not transaction_rule.update_or_create_transaction_actions.all and not transaction_rule.transaction_actions.all %}
{% endif %}
{% empty %}
<div class="card">
<div class="card-body">
{% translate 'This rule has no actions' %}
</div>
</div>
{% endif %}
{% endfor %}
<hr>
<div class="dropdown">
<button class="btn btn-outline-primary text-decoration-none w-100" type="button" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="fa-solid fa-circle-plus me-2"></i>{% translate 'Add new' %}
</button>
<ul class="dropdown-menu dropdown-menu-end w-100">
<li><a class="dropdown-item" role="link"
hx-get="{% url 'transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Edit Transaction' %}</a></li>
<li><a class="dropdown-item" role="link"
hx-get="{% url 'update_or_create_transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Update or Create Transaction' %}</a></li>
</ul>
<div class="d-grid d-lg-flex gap-2">
<div class="dropdown flex-fill">
<button class="btn btn-outline-primary text-decoration-none w-100" type="button" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="fa-solid fa-flask-vial me-2"></i>{% translate 'Test' %}
</button>
<ul class="dropdown-menu">
{% if transaction_rule.on_create %}
<li><a class="dropdown-item" role="link" href="#"
hx-get="{% url 'transaction_rule_dry_run_created' pk=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Create' %}</a></li>
{% endif %}
{% if transaction_rule.on_update %}
<li><a class="dropdown-item" role="link" href="#"
hx-get="{% url 'transaction_rule_dry_run_updated' pk=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Update' %}</a></li>
{% endif %}
{% if transaction_rule.on_delete %}
<li><a class="dropdown-item" role="link" href="#"
hx-get="{% url 'transaction_rule_dry_run_deleted' pk=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Delete' %}</a></li>
{% endif %}
</ul>
</div>
<div class="dropdown flex-fill">
<button class="btn btn-outline-primary text-decoration-none w-100" type="button" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="fa-solid fa-circle-plus me-2"></i>{% translate 'Add new' %}
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" role="link" href="#"
hx-get="{% url 'transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Edit Transaction' %}</a></li>
<li><a class="dropdown-item" role="link" href="#"
hx-get="{% url 'update_or_create_transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}"
hx-target="#generic-offcanvas">{% trans 'Update or Create Transaction' %}</a></li>
</ul>
</div>
</div>
</div>
</div>