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.helper import FormHelper
from crispy_forms.layout import Layout, Field, Column, Row from crispy_forms.layout import Layout, Field, Column, Row
from django import forms from django import forms
from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from apps.accounts.models import Account 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.common.widgets.tom_select import TomSelect
from apps.transactions.models import TransactionCategory, TransactionTag from apps.transactions.models import TransactionCategory, TransactionTag
from apps.common.widgets.decimal import ArbitraryDecimalDisplayNumberInput from apps.common.widgets.decimal import ArbitraryDecimalDisplayNumberInput
from apps.currencies.models import Currency
class AccountGroupForm(forms.ModelForm): class AccountGroupForm(forms.ModelForm):
@@ -79,6 +81,18 @@ class AccountForm(forms.ModelForm):
self.fields["group"].queryset = AccountGroup.objects.all() 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 = FormHelper()
self.helper.form_tag = False self.helper.form_tag = False
self.helper.form_method = "post" self.helper.form_method = "post"

View File

@@ -1,3 +1,5 @@
from copy import deepcopy
from rest_framework import viewsets from rest_framework import viewsets
from apps.api.custom.pagination import CustomPageNumberPagination from apps.api.custom.pagination import CustomPageNumberPagination
@@ -30,8 +32,9 @@ class TransactionViewSet(viewsets.ModelViewSet):
transaction_created.send(sender=instance) transaction_created.send(sender=instance)
def perform_update(self, serializer): def perform_update(self, serializer):
old_data = deepcopy(Transaction.objects.get(pk=serializer.data["pk"]))
instance = serializer.save() instance = serializer.save()
transaction_updated.send(sender=instance) transaction_updated.send(sender=instance, old_data=old_data)
def partial_update(self, request, *args, **kwargs): def partial_update(self, request, *args, **kwargs):
kwargs["partial"] = True 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 :param decimal_places: The number of decimal places to keep
:return: Truncated Decimal value :return: Truncated Decimal value
""" """
if isinstance(value, (int, float)):
value = Decimal(str(value))
multiplier = Decimal(10**decimal_places) multiplier = Decimal(10**decimal_places)
return (value * multiplier).to_integral_value(rounding=ROUND_DOWN) / multiplier 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( return await builtin_tasks.remove_old_jobs(
context, context,
max_hours=744, max_hours=744,
remove_error=True, remove_failed=True,
remove_cancelled=True, remove_cancelled=True,
remove_aborted=True, remove_aborted=True,
) )

View File

@@ -26,6 +26,7 @@ class CurrencyForm(forms.ModelForm):
"suffix", "suffix",
"code", "code",
"exchange_currency", "exchange_currency",
"is_archived",
] ]
widgets = { widgets = {
"exchange_currency": TomSelect(), "exchange_currency": TomSelect(),
@@ -40,6 +41,7 @@ class CurrencyForm(forms.ModelForm):
self.helper.layout = Layout( self.helper.layout = Layout(
"code", "code",
"name", "name",
Switch("is_archived"),
"decimal_places", "decimal_places",
"prefix", "prefix",
"suffix", "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"), help_text=_("Default currency for exchange calculations"),
) )
is_archived = models.BooleanField(
default=False,
verbose_name=_("Archived"),
)
def __str__(self): def __str__(self):
return self.name return self.name

View File

@@ -40,12 +40,6 @@ class CurrencyTests(TestCase):
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
currency.full_clean() 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): def test_currency_unique_name(self):
"""Test that currency names must be unique""" """Test that currency names must be unique"""
Currency.objects.create(code="USD", name="US Dollar", decimal_places=2) 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( def get_categories_totals(
transactions_queryset, ignore_empty=False, show_entities=False 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 = ( category_currency_metrics = (
transactions_queryset.values( transactions_queryset.values(
"category", "category",
@@ -76,7 +79,10 @@ def get_categories_totals(
.order_by("category__name") .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( tag_metrics = transactions_queryset.values(
"category", "category",
"tags", "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 = {} 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: for metric in category_currency_metrics:
# Skip empty categories if ignore_empty is True # Skip empty categories if ignore_empty is True
if ignore_empty and all( if ignore_empty and all(
@@ -185,7 +193,7 @@ def get_categories_totals(
"total_final": total_final, "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"]: if metric["account__currency__exchange_currency"]:
from_currency = Currency.objects.get(id=currency_id) from_currency = Currency.objects.get(id=currency_id)
exchange_currency = Currency.objects.get( exchange_currency = Currency.objects.get(
@@ -224,7 +232,7 @@ def get_categories_totals(
result[category_id]["currencies"][currency_id] = currency_data 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: for tag_metric in tag_metrics:
category_id = tag_metric["category"] category_id = tag_metric["category"]
tag_id = tag_metric["tags"] # Will be None for untagged transactions tag_id = tag_metric["tags"] # Will be None for untagged transactions
@@ -281,7 +289,7 @@ def get_categories_totals(
"total_final": tag_total_final, "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"]: if tag_metric["account__currency__exchange_currency"]:
from_currency = Currency.objects.get(id=currency_id) from_currency = Currency.objects.get(id=currency_id)
exchange_currency = Currency.objects.get( exchange_currency = Currency.objects.get(
@@ -322,6 +330,7 @@ def get_categories_totals(
currency_id currency_id
] = tag_currency_data ] = tag_currency_data
# Step 6: If requested, aggregate and process entity-level data.
if show_entities: if show_entities:
entity_metrics = transactions_queryset.values( entity_metrics = transactions_queryset.values(
"category", "category",
@@ -389,14 +398,15 @@ def get_categories_totals(
tag_id = entity_metric["tags"] tag_id = entity_metric["tags"]
entity_id = entity_metric["entities"] entity_id = entity_metric["entities"]
if not entity_id:
continue
if category_id in result: if category_id in result:
tag_key = tag_id if tag_id is not None else "untagged" tag_key = tag_id if tag_id is not None else "untagged"
if tag_key in result[category_id]["tags"]: if tag_key in result[category_id]["tags"]:
entity_key = entity_id entity_key = entity_id if entity_id is not None else "no_entity"
entity_name = entity_metric["entities__name"] entity_name = (
entity_metric["entities__name"]
if entity_id is not None
else None
)
if "entities" not in result[category_id]["tags"][tag_key]: if "entities" not in result[category_id]["tags"][tag_key]:
result[category_id]["tags"][tag_key]["entities"] = {} result[category_id]["tags"][tag_key]["entities"] = {}

View File

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

View File

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

View File

@@ -1,15 +1,19 @@
from crispy_bootstrap5.bootstrap5 import Switch, BS5Accordion from crispy_bootstrap5.bootstrap5 import Switch, BS5Accordion
from crispy_forms.bootstrap import FormActions, AccordionGroup from crispy_forms.bootstrap import FormActions, AccordionGroup
from crispy_forms.helper import FormHelper 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 import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from apps.common.widgets.crispy.submit import NoClassSubmit 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 TransactionRule, UpdateOrCreateTransactionRuleAction
from apps.rules.models import TransactionRuleAction 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): class TransactionRuleForm(forms.ModelForm):
@@ -40,6 +44,8 @@ class TransactionRuleForm(forms.ModelForm):
Column(Switch("on_create")), Column(Switch("on_create")),
Column(Switch("on_delete")), Column(Switch("on_delete")),
), ),
"order",
Switch("sequenced"),
"description", "description",
"trigger", "trigger",
) )
@@ -65,10 +71,11 @@ class TransactionRuleForm(forms.ModelForm):
class TransactionRuleActionForm(forms.ModelForm): class TransactionRuleActionForm(forms.ModelForm):
class Meta: class Meta:
model = TransactionRuleAction model = TransactionRuleAction
fields = ("value", "field") fields = ("value", "field", "order")
labels = { labels = {
"field": _("Set field"), "field": _("Set field"),
"value": _("To"), "value": _("To"),
"order": _("Order"),
} }
widgets = {"field": TomSelect(clear_button=False)} widgets = {"field": TomSelect(clear_button=False)}
@@ -82,6 +89,7 @@ class TransactionRuleActionForm(forms.ModelForm):
self.helper.form_method = "post" self.helper.form_method = "post"
# TO-DO: Add helper with available commands # TO-DO: Add helper with available commands
self.helper.layout = Layout( self.helper.layout = Layout(
"order",
"field", "field",
"value", "value",
) )
@@ -147,9 +155,11 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_category_operator": TomSelect(clear_button=False), "search_category_operator": TomSelect(clear_button=False),
"search_internal_note_operator": TomSelect(clear_button=False), "search_internal_note_operator": TomSelect(clear_button=False),
"search_internal_id_operator": TomSelect(clear_button=False), "search_internal_id_operator": TomSelect(clear_button=False),
"search_mute_operator": TomSelect(clear_button=False),
} }
labels = { labels = {
"order": _("Order"),
"search_account_operator": _("Operator"), "search_account_operator": _("Operator"),
"search_type_operator": _("Operator"), "search_type_operator": _("Operator"),
"search_is_paid_operator": _("Operator"), "search_is_paid_operator": _("Operator"),
@@ -163,6 +173,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_internal_id_operator": _("Operator"), "search_internal_id_operator": _("Operator"),
"search_tags_operator": _("Operator"), "search_tags_operator": _("Operator"),
"search_entities_operator": _("Operator"), "search_entities_operator": _("Operator"),
"search_mute_operator": _("Operator"),
"search_account": _("Account"), "search_account": _("Account"),
"search_type": _("Type"), "search_type": _("Type"),
"search_is_paid": _("Paid"), "search_is_paid": _("Paid"),
@@ -176,6 +187,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"search_internal_id": _("Internal ID"), "search_internal_id": _("Internal ID"),
"search_tags": _("Tags"), "search_tags": _("Tags"),
"search_entities": _("Entities"), "search_entities": _("Entities"),
"search_mute": _("Mute"),
"set_account": _("Account"), "set_account": _("Account"),
"set_type": _("Type"), "set_type": _("Type"),
"set_is_paid": _("Paid"), "set_is_paid": _("Paid"),
@@ -189,6 +201,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
"set_category": _("Category"), "set_category": _("Category"),
"set_internal_note": _("Internal Note"), "set_internal_note": _("Internal Note"),
"set_internal_id": _("Internal ID"), "set_internal_id": _("Internal ID"),
"set_mute": _("Mute"),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -200,6 +213,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
self.helper.form_method = "post" self.helper.form_method = "post"
self.helper.layout = Layout( self.helper.layout = Layout(
"order",
BS5Accordion( BS5Accordion(
AccordionGroup( AccordionGroup(
_("Search Criteria"), _("Search Criteria"),
@@ -224,6 +238,16 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
css_class="form-group col-md-8", 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( Row(
Column( Column(
Field("search_account_operator"), Field("search_account_operator"),
@@ -340,6 +364,7 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
_("Set Values"), _("Set Values"),
Field("set_type", rows=1), Field("set_type", rows=1),
Field("set_is_paid", rows=1), Field("set_is_paid", rows=1),
Field("set_mute", rows=1),
Field("set_account", rows=1), Field("set_account", rows=1),
Field("set_entities", rows=1), Field("set_entities", rows=1),
Field("set_date", rows=1), Field("set_date", rows=1),
@@ -381,3 +406,112 @@ class UpdateOrCreateTransactionRuleActionForm(forms.ModelForm):
if commit: if commit:
instance.save() instance.save()
return instance 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")) name = models.CharField(max_length=100, verbose_name=_("Name"))
description = models.TextField(blank=True, null=True, verbose_name=_("Description")) description = models.TextField(blank=True, null=True, verbose_name=_("Description"))
trigger = models.TextField(verbose_name=_("Trigger")) trigger = models.TextField(verbose_name=_("Trigger"))
sequenced = models.BooleanField(
verbose_name=_("Sequenced"),
default=False,
)
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
objects = SharedObjectManager() objects = SharedObjectManager()
all_objects = models.Manager() # Unfiltered manager all_objects = models.Manager() # Unfiltered manager
@@ -32,12 +37,15 @@ class TransactionRuleAction(models.Model):
is_paid = "is_paid", _("Paid") is_paid = "is_paid", _("Paid")
date = "date", _("Date") date = "date", _("Date")
reference_date = "reference_date", _("Reference Date") reference_date = "reference_date", _("Reference Date")
mute = "mute", _("Mute")
amount = "amount", _("Amount") amount = "amount", _("Amount")
description = "description", _("Description") description = "description", _("Description")
notes = "notes", _("Notes") notes = "notes", _("Notes")
category = "category", _("Category") category = "category", _("Category")
tags = "tags", _("Tags") tags = "tags", _("Tags")
entities = "entities", _("Entities") entities = "entities", _("Entities")
internal_note = "internal_nome", _("Internal Note")
internal_id = "internal_id", _("Internal ID")
rule = models.ForeignKey( rule = models.ForeignKey(
TransactionRule, TransactionRule,
@@ -51,6 +59,7 @@ class TransactionRuleAction(models.Model):
verbose_name=_("Field"), verbose_name=_("Field"),
) )
value = models.TextField(verbose_name=_("Value")) value = models.TextField(verbose_name=_("Value"))
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
def __str__(self): def __str__(self):
return f"{self.rule} - {self.field} - {self.value}" return f"{self.rule} - {self.field} - {self.value}"
@@ -59,6 +68,11 @@ class TransactionRuleAction(models.Model):
verbose_name = _("Edit transaction action") verbose_name = _("Edit transaction action")
verbose_name_plural = _("Edit transaction actions") verbose_name_plural = _("Edit transaction actions")
unique_together = (("rule", "field"),) unique_together = (("rule", "field"),)
ordering = ["order"]
@property
def action_type(self):
return "edit_transaction"
class UpdateOrCreateTransactionRuleAction(models.Model): class UpdateOrCreateTransactionRuleAction(models.Model):
@@ -237,6 +251,17 @@ class UpdateOrCreateTransactionRuleAction(models.Model):
verbose_name="Internal ID Operator", 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 fields
set_account = models.TextField( set_account = models.TextField(
verbose_name=_("Account"), verbose_name=_("Account"),
@@ -290,10 +315,21 @@ class UpdateOrCreateTransactionRuleAction(models.Model):
verbose_name=_("Tags"), verbose_name=_("Tags"),
blank=True, blank=True,
) )
set_mute = models.TextField(
verbose_name=_("Mute"),
blank=True,
)
order = models.PositiveIntegerField(default=0, verbose_name=_("Order"))
class Meta: class Meta:
verbose_name = _("Update or create transaction action") verbose_name = _("Update or create transaction action")
verbose_name_plural = _("Update or create transaction actions") verbose_name_plural = _("Update or create transaction actions")
ordering = ["order"]
@property
def action_type(self):
return "update_or_create_transaction"
def __str__(self): def __str__(self):
return f"Update or create transaction action for {self.rule}" 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) value = simple.eval(self.search_is_paid)
search_query &= add_to_query("is_paid", value, self.search_is_paid_operator) 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: if self.search_date:
value = simple.eval(self.search_date) value = simple.eval(self.search_date)
search_query &= add_to_query("date", value, self.search_date_operator) 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.rules.tasks import check_for_transaction_rules
from apps.common.middleware.thread_local import get_current_user from apps.common.middleware.thread_local import get_current_user
from apps.rules.utils.transactions import serialize_transaction
@receiver(transaction_created) @receiver(transaction_created)
@receiver(transaction_updated) @receiver(transaction_updated)
@receiver(transaction_deleted) @receiver(transaction_deleted)
def transaction_changed_receiver(sender: Transaction, signal, **kwargs): def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
old_data = kwargs.get("old_data")
if signal is transaction_deleted: if signal is transaction_deleted:
# Serialize transaction data for processing # Serialize transaction data for processing
transaction_data = { transaction_data = serialize_transaction(sender, deleted=True)
"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,
}
check_for_transaction_rules.defer( check_for_transaction_rules.defer(
transaction_data=transaction_data, transaction_data=transaction_data,
@@ -59,6 +36,9 @@ def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
dca_entry.amount_received = sender.amount dca_entry.amount_received = sender.amount
dca_entry.save() dca_entry.save()
if signal is transaction_updated and old_data:
old_data = serialize_transaction(old_data, deleted=False)
check_for_transaction_rules.defer( check_for_transaction_rules.defer(
instance_id=sender.id, instance_id=sender.id,
user_id=get_current_user().id, user_id=get_current_user().id,
@@ -67,4 +47,5 @@ def transaction_changed_receiver(sender: Transaction, signal, **kwargs):
if signal is transaction_created if signal is transaction_created
else "transaction_updated" 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, views.transaction_rule_take_ownership,
name="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( path(
"rules/transaction/<int:pk>/share/", "rules/transaction/<int:pk>/share/",
views.transaction_rule_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 import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -10,6 +15,9 @@ from apps.rules.forms import (
TransactionRuleForm, TransactionRuleForm,
TransactionRuleActionForm, TransactionRuleActionForm,
UpdateOrCreateTransactionRuleActionForm, UpdateOrCreateTransactionRuleActionForm,
DryRunCreatedTransacion,
DryRunDeletedTransacion,
DryRunUpdatedTransactionForm,
) )
from apps.rules.models import ( from apps.rules.models import (
TransactionRule, TransactionRule,
@@ -19,6 +27,11 @@ from apps.rules.models import (
from apps.common.models import SharedObject from apps.common.models import SharedObject
from apps.common.forms import SharedObjectForm from apps.common.forms import SharedObjectForm
from apps.common.decorators.demo import disabled_on_demo 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 @login_required
@@ -36,7 +49,7 @@ def rules_index(request):
@disabled_on_demo @disabled_on_demo
@require_http_methods(["GET"]) @require_http_methods(["GET"])
def rules_list(request): def rules_list(request):
transaction_rules = TransactionRule.objects.all().order_by("id") transaction_rules = TransactionRule.objects.all().order_by("order", "id")
return render( return render(
request, request,
"rules/fragments/list.html", "rules/fragments/list.html",
@@ -140,10 +153,20 @@ def transaction_rule_edit(request, transaction_rule_id):
def transaction_rule_view(request, transaction_rule_id): def transaction_rule_view(request, transaction_rule_id):
transaction_rule = get_object_or_404(TransactionRule, id=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( return render(
request, request,
"rules/fragments/transaction_rule/view.html", "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", "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_bootstrap5.bootstrap5 import Switch, BS5Accordion
from crispy_forms.bootstrap import FormActions, AccordionGroup, AppendedText from crispy_forms.bootstrap import FormActions, AccordionGroup, AppendedText
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
@@ -239,11 +241,16 @@ class TransactionForm(forms.ModelForm):
def save(self, **kwargs): def save(self, **kwargs):
is_new = not self.instance.id 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) instance = super().save(**kwargs)
if is_new: if is_new:
transaction_created.send(sender=instance) transaction_created.send(sender=instance)
else: else:
transaction_updated.send(sender=instance) transaction_updated.send(sender=instance, old_data=old_data)
return instance return instance
@@ -347,11 +354,6 @@ class QuickTransactionForm(forms.ModelForm):
Column("entities", css_class="form-group col-md-6 mb-0"), Column("entities", css_class="form-group col-md-6 mb-0"),
css_class="form-row", 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", "description",
Field("amount", inputmode="decimal"), Field("amount", inputmode="decimal"),
Row( Row(
@@ -387,35 +389,115 @@ class QuickTransactionForm(forms.ModelForm):
) )
class BulkEditTransactionForm(TransactionForm): class BulkEditTransactionForm(forms.Form):
is_paid = forms.NullBooleanField(required=False) 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): def __init__(self, *args, **kwargs):
super().__init__(*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 self.fields["account"].queryset = Account.objects.filter(
del self.helper.layout[0:2] # Remove type, is_paid field is_archived=False,
)
self.helper.layout.insert( self.fields["category"].queryset = TransactionCategory.objects.filter(
0, 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( Field(
"type", "type",
template="transactions/widgets/unselectable_income_expense_toggle_buttons.html", template="transactions/widgets/unselectable_income_expense_toggle_buttons.html",
), ),
)
self.helper.layout.insert(
1,
Field( Field(
"is_paid", "is_paid",
template="transactions/widgets/unselectable_paid_toggle_button.html", template="transactions/widgets/unselectable_paid_toggle_button.html",
), ),
) Row(
Column("account", css_class="form-group col-md-6 mb-0"),
self.helper.layout.append( 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( FormActions(
NoClassSubmit( NoClassSubmit(
"submit", _("Update"), css_class="btn btn-outline-primary w-100" "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): class TransferForm(forms.Form):
from_account = forms.ModelChoiceField( from_account = forms.ModelChoiceField(

View File

@@ -1,4 +1,5 @@
import logging import logging
from copy import deepcopy
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from django.conf import settings from django.conf import settings
@@ -33,13 +34,13 @@ transaction_deleted = Signal()
class SoftDeleteQuerySet(models.QuerySet): class SoftDeleteQuerySet(models.QuerySet):
@staticmethod @staticmethod
def _emit_signals(instances, created=False): def _emit_signals(instances, created=False, old_data=None):
"""Helper to emit signals for multiple instances""" """Helper to emit signals for multiple instances"""
for instance in instances: for i, instance in enumerate(instances):
if created: if created:
transaction_created.send(sender=instance) transaction_created.send(sender=instance)
else: 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): def bulk_create(self, objs, emit_signal=True, **kwargs):
instances = super().bulk_create(objs, **kwargs) instances = super().bulk_create(objs, **kwargs)
@@ -50,22 +51,25 @@ class SoftDeleteQuerySet(models.QuerySet):
return instances return instances
def bulk_update(self, objs, fields, emit_signal=True, **kwargs): def bulk_update(self, objs, fields, emit_signal=True, **kwargs):
old_data = deepcopy(objs)
result = super().bulk_update(objs, fields, **kwargs) result = super().bulk_update(objs, fields, **kwargs)
if emit_signal: if emit_signal:
self._emit_signals(objs, created=False) self._emit_signals(objs, created=False, old_data=old_data)
return result return result
def update(self, emit_signal=True, **kwargs): def update(self, emit_signal=True, **kwargs):
# Get instances before update # Get instances before update
instances = list(self) instances = list(self)
old_data = deepcopy(instances)
result = super().update(**kwargs) result = super().update(**kwargs)
if emit_signal: if emit_signal:
# Refresh instances to get new values # Refresh instances to get new values
refreshed = self.model.objects.filter(pk__in=[obj.pk for obj in instances]) 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 return result
@@ -376,7 +380,7 @@ class Transaction(OwnedObject):
db_table = "transactions" db_table = "transactions"
default_manager_name = "objects" default_manager_name = "objects"
def save(self, *args, **kwargs): def clean_fields(self, *args, **kwargs):
self.amount = truncate_decimal( self.amount = truncate_decimal(
value=self.amount, decimal_places=self.account.currency.decimal_places 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: elif not self.reference_date and self.date:
self.reference_date = self.date.replace(day=1) 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() self.full_clean()
super().save(*args, **kwargs) super().save(*args, **kwargs)
@@ -443,12 +452,58 @@ class Transaction(OwnedObject):
type_display = self.get_type_display() type_display = self.get_type_display()
frmt_date = date(self.date, "SHORT_DATE_FORMAT") frmt_date = date(self.date, "SHORT_DATE_FORMAT")
account = self.account 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") category = self.category or _("No category")
amount = localize_number(drop_trailing_zeros(self.amount)) amount = localize_number(drop_trailing_zeros(self.amount))
description = self.description or _("No description") description = self.description or _("No description")
return f"[{frmt_date}][{type_display}][{account}] {description}{category}{tags}{amount}" 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 InstallmentPlan(models.Model):
class Recurrence(models.TextChoices): class Recurrence(models.TextChoices):

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -24,6 +24,7 @@
<th scope="col" class="col-auto"></th> <th scope="col" class="col-auto"></th>
<th scope="col" class="col-auto">{% translate 'Code' %}</th> <th scope="col" class="col-auto">{% translate 'Code' %}</th>
<th scope="col" class="col">{% translate 'Name' %}</th> <th scope="col" class="col">{% translate 'Name' %}</th>
<th scope="col" class="col">{% translate 'Archived' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -53,6 +54,7 @@
</td> </td>
<td class="col-auto">{{ currency.code }}</td> <td class="col-auto">{{ currency.code }}</td>
<td class="col">{{ currency.name }}</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> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

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

View File

@@ -23,6 +23,7 @@
<tr> <tr>
<th scope="col" class="col-auto"></th> <th scope="col" class="col-auto"></th>
<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> <th scope="col" class="col">{% translate 'Name' %}</th>
</tr> </tr>
</thead> </thead>
@@ -80,6 +81,9 @@
<i class="fa-solid fa-toggle-off tw:text-red-400"></i>{% endif %} <i class="fa-solid fa-toggle-off tw:text-red-400"></i>{% endif %}
</a> </a>
</td> </td>
<td class="col text-center">
<div>{{ rule.order }}</div>
</td>
<td class="col"> <td class="col">
<div>{{ rule.name }}</div> <div>{{ rule.name }}</div>
<div class="tw:text-gray-400">{{ rule.description }}</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="my-3">
<div class="tw:text-xl mb-2">{% translate 'Then...' %}</div> <div class="tw:text-xl mb-2">{% translate 'Then...' %}</div>
{% for action in transaction_rule.transaction_actions.all %} {% for action in all_actions %}
<div class="card mb-3"> {% if action.action_type == "edit_transaction" %}
<div class="card-header"> <div class="card mb-3">
<div><span class="badge text-bg-primary">{% trans 'Edit transaction' %}</span></div> <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>
<div class="card-body"> {% elif action.action_type == "update_or_create_transaction" %}
<div>{% translate 'Set' %} <span <div class="card mb-3">
class="badge text-bg-secondary">{{ action.get_field_display }}</span> {% translate 'to' %}</div> <div class="card-header">
<div class="text-bg-secondary rounded-3 mt-3 p-2">{{ action.value }}</div> <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>
<div class="card-footer text-end"> {% endif %}
<a class="text-decoration-none tw:text-gray-400 p-1" {% empty %}
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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
{% translate 'This rule has no actions' %} {% translate 'This rule has no actions' %}
</div> </div>
</div> </div>
{% endif %} {% endfor %}
<hr> <hr>
<div class="dropdown"> <div class="d-grid d-lg-flex gap-2">
<button class="btn btn-outline-primary text-decoration-none w-100" type="button" data-bs-toggle="dropdown" <div class="dropdown flex-fill">
aria-expanded="false"> <button class="btn btn-outline-primary text-decoration-none w-100" type="button" data-bs-toggle="dropdown"
<i class="fa-solid fa-circle-plus me-2"></i>{% translate 'Add new' %} aria-expanded="false">
</button> <i class="fa-solid fa-flask-vial me-2"></i>{% translate 'Test' %}
<ul class="dropdown-menu dropdown-menu-end w-100"> </button>
<li><a class="dropdown-item" role="link" <ul class="dropdown-menu">
hx-get="{% url 'transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}" {% if transaction_rule.on_create %}
hx-target="#generic-offcanvas">{% trans 'Edit Transaction' %}</a></li> <li><a class="dropdown-item" role="link" href="#"
<li><a class="dropdown-item" role="link" hx-get="{% url 'transaction_rule_dry_run_created' pk=transaction_rule.id %}"
hx-get="{% url 'update_or_create_transaction_rule_action_add' transaction_rule_id=transaction_rule.id %}" hx-target="#generic-offcanvas">{% trans 'Create' %}</a></li>
hx-target="#generic-offcanvas">{% trans 'Update or Create Transaction' %}</a></li> {% endif %}
</ul> {% 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> </div>
</div> </div>