From 5296820d467e982e52f4b2a3bd6be4929d6965cf Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Fri, 7 Feb 2025 11:40:37 -0300 Subject: [PATCH 1/3] refactor(automatic-exchange-rates): replace fetch_interval with fetch interval type and fetch interval --- app/apps/currencies/admin.py | 3 +- app/apps/currencies/exchange_rates/fetcher.py | 80 +++++++++++---- app/apps/currencies/forms.py | 10 +- ...teservice_fetch_interval_hours_and_more.py | 32 ++++++ app/apps/currencies/models.py | 97 ++++++++++++++++++- .../fragments/list.html | 2 - 6 files changed, 195 insertions(+), 29 deletions(-) create mode 100644 app/apps/currencies/migrations/0011_remove_exchangerateservice_fetch_interval_hours_and_more.py diff --git a/app/apps/currencies/admin.py b/app/apps/currencies/admin.py index ead88ad..17d3d2e 100644 --- a/app/apps/currencies/admin.py +++ b/app/apps/currencies/admin.py @@ -17,7 +17,8 @@ class ExchangeRateServiceAdmin(admin.ModelAdmin): "name", "service_type", "is_active", - "fetch_interval_hours", + "interval_type", + "fetch_interval", "last_fetch", ] list_filter = ["is_active", "service_type"] diff --git a/app/apps/currencies/exchange_rates/fetcher.py b/app/apps/currencies/exchange_rates/fetcher.py index 3e763c3..fffc935 100644 --- a/app/apps/currencies/exchange_rates/fetcher.py +++ b/app/apps/currencies/exchange_rates/fetcher.py @@ -23,17 +23,67 @@ PROVIDER_MAPPING = { class ExchangeRateFetcher: + def _should_fetch_at_hour(service: ExchangeRateService, current_hour: int) -> bool: + """Check if service should fetch rates at given hour based on interval type.""" + try: + if service.interval_type == ExchangeRateService.IntervalType.NOT_ON: + blocked_hours = ExchangeRateService._parse_hour_ranges( + service.fetch_interval + ) + should_fetch = current_hour not in blocked_hours + logger.debug( + f"NOT_ON check for {service.name}: " + f"current_hour={current_hour}, " + f"blocked_hours={blocked_hours}, " + f"should_fetch={should_fetch}" + ) + return should_fetch + + if service.interval_type == ExchangeRateService.IntervalType.ON: + allowed_hours = ExchangeRateService._parse_hour_ranges( + service.fetch_interval + ) + return current_hour in allowed_hours + + if service.interval_type == ExchangeRateService.IntervalType.EVERY: + try: + interval_hours = int(service.fetch_interval) + if service.last_fetch is None: + return True + hours_since_last = ( + timezone.now() - service.last_fetch + ).total_seconds() / 3600 + should_fetch = hours_since_last >= interval_hours + logger.debug( + f"EVERY check for {service.name}: " + f"hours_since_last={hours_since_last:.1f}, " + f"interval={interval_hours}, " + f"should_fetch={should_fetch}" + ) + return should_fetch + except ValueError: + logger.error( + f"Invalid EVERY interval format for {service.name}: " + f"expected single number, got '{service.fetch_interval}'" + ) + return False + + return False + + except ValueError as e: + logger.error(f"Error parsing fetch_interval for {service.name}: {e}") + return False + @staticmethod def fetch_due_rates(force: bool = False) -> None: """ Fetch rates for all services that are due for update. - Args: - force (bool): If True, fetches all active services regardless of their last fetch time. - If False, only fetches services that are due according to their interval. + force (bool): If True, fetches all active services regardless of their schedule. """ services = ExchangeRateService.objects.filter(is_active=True) - current_time = timezone.now().replace(minute=0, second=0, microsecond=0) + current_time = timezone.now().astimezone() + current_hour = current_time.hour for service in services: try: @@ -42,29 +92,21 @@ class ExchangeRateFetcher: ExchangeRateFetcher._fetch_service_rates(service) continue - # Regular schedule-based fetching - if service.last_fetch is None: - logger.info(f"First fetch for service: {service.name}") - ExchangeRateFetcher._fetch_service_rates(service) - continue - - # Calculate when the next fetch should occur - next_fetch_due = ( - service.last_fetch + timedelta(hours=service.fetch_interval_hours) - ).replace(minute=0, second=0, microsecond=0) - - # Check if it's time for the next fetch - if current_time >= next_fetch_due: + # Check if service should fetch based on interval type + if ExchangeRateFetcher._should_fetch_at_hour(service, current_hour): logger.info( f"Fetching rates for {service.name}. " f"Last fetch: {service.last_fetch}, " - f"Interval: {service.fetch_interval_hours}h" + f"Interval type: {service.interval_type}, " + f"Current hour: {current_hour}" ) ExchangeRateFetcher._fetch_service_rates(service) else: logger.debug( f"Skipping {service.name}. " - f"Next fetch due at: {next_fetch_due}" + f"Current hour: {current_hour}, " + f"Interval type: {service.interval_type}, " + f"Fetch interval: {service.fetch_interval}" ) except Exception as e: diff --git a/app/apps/currencies/forms.py b/app/apps/currencies/forms.py index f34e605..317bd0d 100644 --- a/app/apps/currencies/forms.py +++ b/app/apps/currencies/forms.py @@ -1,7 +1,7 @@ from crispy_bootstrap5.bootstrap5 import Switch from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper -from crispy_forms.layout import Layout +from crispy_forms.layout import Layout, Row, Column from django import forms from django.forms import CharField from django.utils.translation import gettext_lazy as _ @@ -110,7 +110,8 @@ class ExchangeRateServiceForm(forms.ModelForm): "service_type", "is_active", "api_key", - "fetch_interval_hours", + "interval_type", + "fetch_interval", "target_currencies", "target_accounts", ] @@ -126,7 +127,10 @@ class ExchangeRateServiceForm(forms.ModelForm): "service_type", Switch("is_active"), "api_key", - "fetch_interval_hours", + Row( + Column("interval_type", css_class="form-group col-md-6"), + Column("fetch_interval", css_class="form-group col-md-6"), + ), "target_currencies", "target_accounts", ) diff --git a/app/apps/currencies/migrations/0011_remove_exchangerateservice_fetch_interval_hours_and_more.py b/app/apps/currencies/migrations/0011_remove_exchangerateservice_fetch_interval_hours_and_more.py new file mode 100644 index 0000000..81e7a1d --- /dev/null +++ b/app/apps/currencies/migrations/0011_remove_exchangerateservice_fetch_interval_hours_and_more.py @@ -0,0 +1,32 @@ +# Generated by Django 5.1.5 on 2025-02-07 02:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('currencies', '0010_alter_currency_code'), + ] + + operations = [ + migrations.RemoveField( + model_name='exchangerateservice', + name='fetch_interval_hours', + ), + migrations.AddField( + model_name='exchangerateservice', + name='fetch_interval', + field=models.CharField(default='24', max_length=1000, verbose_name='Interval'), + ), + migrations.AddField( + model_name='exchangerateservice', + name='interval_type', + field=models.CharField(choices=[('on', 'On'), ('every', 'Every X hours'), ('not_on', 'Not on')], default='every', max_length=255, verbose_name='Interval Type'), + ), + migrations.AlterField( + model_name='exchangerateservice', + name='service_type', + field=models.CharField(choices=[('synth_finance', 'Synth Finance'), ('coingecko_free', 'CoinGecko (Demo/Free)'), ('coingecko_pro', 'CoinGecko (Pro)')], max_length=255, verbose_name='Service Type'), + ), + ] diff --git a/app/apps/currencies/models.py b/app/apps/currencies/models.py index 698745a..5123142 100644 --- a/app/apps/currencies/models.py +++ b/app/apps/currencies/models.py @@ -1,4 +1,5 @@ import logging +from typing import Set from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator @@ -94,6 +95,11 @@ class ExchangeRateService(models.Model): COINGECKO_FREE = "coingecko_free", "CoinGecko (Demo/Free)" COINGECKO_PRO = "coingecko_pro", "CoinGecko (Pro)" + class IntervalType(models.TextChoices): + ON = "on", _("On") + EVERY = "every", _("Every X hours") + NOT_ON = "not_on", _("Not on") + name = models.CharField(max_length=255, unique=True, verbose_name=_("Service Name")) service_type = models.CharField( max_length=255, choices=ServiceType.choices, verbose_name=_("Service Type") @@ -106,10 +112,14 @@ class ExchangeRateService(models.Model): verbose_name=_("API Key"), help_text=_("API key for the service (if required)"), ) - fetch_interval_hours = models.PositiveIntegerField( - default=24, - validators=[MinValueValidator(1)], - verbose_name=_("Fetch Interval (hours)"), + interval_type = models.CharField( + max_length=255, + choices=IntervalType.choices, + verbose_name=_("Interval Type"), + default=IntervalType.EVERY, + ) + fetch_interval = models.CharField( + max_length=1000, verbose_name=_("Interval"), default="24" ) last_fetch = models.DateTimeField( null=True, blank=True, verbose_name=_("Last Successful Fetch") @@ -148,3 +158,82 @@ class ExchangeRateService(models.Model): provider_class = PROVIDER_MAPPING[self.service_type] return provider_class(self.api_key) + + @staticmethod + def _parse_hour_ranges(interval_str: str) -> Set[int]: + """ + Parse hour ranges and individual hours from string. + + Valid formats: + - Single hours: "1,5,9" + - Ranges: "1-5" + - Mixed: "1-5,8,10-12" + + Returns set of hours. + """ + hours = set() + + for part in interval_str.strip().split(","): + part = part.strip() + if "-" in part: + start, end = part.split("-") + start, end = int(start), int(end) + if not (0 <= start <= 23 and 0 <= end <= 23): + raise ValueError("Hours must be between 0 and 23") + if start > end: + raise ValueError(f"Invalid range: {start}-{end}") + hours.update(range(start, end + 1)) + else: + hour = int(part) + if not 0 <= hour <= 23: + raise ValueError("Hours must be between 0 and 23") + hours.add(hour) + + return hours + + def clean(self): + super().clean() + try: + if self.interval_type == self.IntervalType.EVERY: + if not self.fetch_interval.isdigit(): + raise ValidationError( + { + "fetch_interval": _( + "'Every X hours' interval type requires a positive integer." + ) + } + ) + hours = int(self.fetch_interval) + if hours < 1 or hours > 24: + raise ValidationError( + { + "fetch_interval": _( + "'Every X hours' interval must be between 1 and 24." + ) + } + ) + else: + try: + # Parse and validate hour ranges + hours = self._parse_hour_ranges(self.fetch_interval) + # Store in normalized format (optional) + self.fetch_interval = ",".join(str(h) for h in sorted(hours)) + except ValueError as e: + raise ValidationError( + { + "fetch_interval": _( + "Invalid hour format. Use comma-separated hours (0-23) " + "and/or ranges (e.g., '1-5,8,10-12')." + ) + } + ) + except ValidationError: + raise + except Exception as e: + raise ValidationError( + { + "fetch_interval": _( + "Invalid format. Please check the requirements for your selected interval type." + ) + } + ) diff --git a/app/templates/exchange_rates_services/fragments/list.html b/app/templates/exchange_rates_services/fragments/list.html index fca5aa8..1c42393 100644 --- a/app/templates/exchange_rates_services/fragments/list.html +++ b/app/templates/exchange_rates_services/fragments/list.html @@ -32,7 +32,6 @@ {% translate 'Name' %} {% translate 'Service' %} {% translate 'Targeting' %} - {% translate 'Fetch every' %} {% translate 'Last fetch' %} @@ -66,7 +65,6 @@ {{ service.name }} {{ service.get_service_type_display }} {{ service.target_currencies.count }} {% trans 'currencies' %}, {{ service.target_accounts.count }} {% trans 'accounts' %} - {{ service.fetch_interval_hours }} {% trans 'hours' %} {{ service.last_fetch|date:"SHORT_DATETIME_FORMAT" }} {% endfor %} From 8315adeb4a2836c6e30f8967063f5965fa3dd69d Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Fri, 7 Feb 2025 11:46:33 -0300 Subject: [PATCH 2/3] fix(automatic-exchange-rates): 1-24 should be 0-23 --- app/apps/currencies/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/apps/currencies/models.py b/app/apps/currencies/models.py index 5123142..d58b9f4 100644 --- a/app/apps/currencies/models.py +++ b/app/apps/currencies/models.py @@ -204,11 +204,11 @@ class ExchangeRateService(models.Model): } ) hours = int(self.fetch_interval) - if hours < 1 or hours > 24: + if hours < 0 or hours > 23: raise ValidationError( { "fetch_interval": _( - "'Every X hours' interval must be between 1 and 24." + "'Every X hours' interval must be between 0 and 23." ) } ) From 1a0de32ef824b5fffab51422255abc6582a47ad8 Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Fri, 7 Feb 2025 11:46:38 -0300 Subject: [PATCH 3/3] locale: update locales --- app/locale/de/LC_MESSAGES/django.po | 138 +++++++++++++---------- app/locale/nl/LC_MESSAGES/django.po | 134 ++++++++++++++--------- app/locale/pt_BR/LC_MESSAGES/django.po | 146 ++++++++++++++++--------- 3 files changed, 260 insertions(+), 158 deletions(-) diff --git a/app/locale/de/LC_MESSAGES/django.po b/app/locale/de/LC_MESSAGES/django.po index d77ecb0..f184d16 100644 --- a/app/locale/de/LC_MESSAGES/django.po +++ b/app/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-04 03:20+0000\n" +"POT-Creation-Date: 2025-02-07 11:45-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,7 +24,7 @@ msgstr "" #: apps/accounts/forms.py:40 apps/accounts/forms.py:96 #: apps/currencies/forms.py:53 apps/currencies/forms.py:91 -#: apps/currencies/forms.py:138 apps/dca/forms.py:41 apps/dca/forms.py:93 +#: apps/currencies/forms.py:142 apps/dca/forms.py:41 apps/dca/forms.py:93 #: apps/import_app/forms.py:34 apps/rules/forms.py:45 apps/rules/forms.py:87 #: apps/transactions/forms.py:190 apps/transactions/forms.py:257 #: apps/transactions/forms.py:581 apps/transactions/forms.py:624 @@ -35,7 +35,7 @@ msgstr "" #: apps/accounts/forms.py:48 apps/accounts/forms.py:104 #: apps/common/widgets/tom_select.py:12 apps/currencies/forms.py:61 -#: apps/currencies/forms.py:99 apps/currencies/forms.py:146 +#: apps/currencies/forms.py:99 apps/currencies/forms.py:150 #: apps/dca/forms.py:49 apps/dca/forms.py:102 apps/import_app/forms.py:42 #: apps/rules/forms.py:53 apps/rules/forms.py:95 apps/transactions/forms.py:174 #: apps/transactions/forms.py:199 apps/transactions/forms.py:589 @@ -113,17 +113,17 @@ msgstr "" msgid "Account Groups" msgstr "" -#: apps/accounts/models.py:31 apps/currencies/models.py:38 +#: apps/accounts/models.py:31 apps/currencies/models.py:39 #: templates/accounts/fragments/list.html:27 msgid "Currency" msgstr "" -#: apps/accounts/models.py:37 apps/currencies/models.py:26 +#: apps/accounts/models.py:37 apps/currencies/models.py:27 #: templates/accounts/fragments/list.html:28 msgid "Exchange Currency" msgstr "" -#: apps/accounts/models.py:42 apps/currencies/models.py:31 +#: apps/accounts/models.py:42 apps/currencies/models.py:32 msgid "Default currency for exchange calculations" msgstr "" @@ -348,11 +348,11 @@ msgstr "" msgid "No results..." msgstr "" -#: apps/currencies/forms.py:17 apps/currencies/models.py:21 +#: apps/currencies/forms.py:17 apps/currencies/models.py:22 msgid "Prefix" msgstr "" -#: apps/currencies/forms.py:18 apps/currencies/models.py:22 +#: apps/currencies/forms.py:18 apps/currencies/models.py:23 msgid "Suffix" msgstr "" @@ -365,19 +365,19 @@ msgstr "" msgid "Date" msgstr "" -#: apps/currencies/models.py:13 +#: apps/currencies/models.py:14 msgid "Currency Code" msgstr "" -#: apps/currencies/models.py:15 +#: apps/currencies/models.py:16 msgid "Currency Name" msgstr "" -#: apps/currencies/models.py:19 +#: apps/currencies/models.py:20 msgid "Decimal Places" msgstr "" -#: apps/currencies/models.py:39 apps/transactions/filters.py:60 +#: apps/currencies/models.py:40 apps/transactions/filters.py:60 #: templates/currencies/fragments/list.html:5 #: templates/currencies/pages/index.html:4 templates/includes/navbar.html:119 #: templates/includes/navbar.html:121 @@ -387,45 +387,57 @@ msgstr "" msgid "Currencies" msgstr "" -#: apps/currencies/models.py:47 +#: apps/currencies/models.py:48 msgid "Currency cannot have itself as exchange currency." msgstr "" -#: apps/currencies/models.py:58 +#: apps/currencies/models.py:59 msgid "From Currency" msgstr "" -#: apps/currencies/models.py:64 +#: apps/currencies/models.py:65 msgid "To Currency" msgstr "" -#: apps/currencies/models.py:67 apps/currencies/models.py:72 +#: apps/currencies/models.py:68 apps/currencies/models.py:73 msgid "Exchange Rate" msgstr "" -#: apps/currencies/models.py:69 +#: apps/currencies/models.py:70 msgid "Date and Time" msgstr "" -#: apps/currencies/models.py:73 templates/exchange_rates/fragments/list.html:6 +#: apps/currencies/models.py:74 templates/exchange_rates/fragments/list.html:6 #: templates/exchange_rates/pages/index.html:4 #: templates/includes/navbar.html:123 msgid "Exchange Rates" msgstr "" -#: apps/currencies/models.py:85 +#: apps/currencies/models.py:86 msgid "From and To currencies cannot be the same." msgstr "" -#: apps/currencies/models.py:97 +#: apps/currencies/models.py:99 +msgid "On" +msgstr "" + +#: apps/currencies/models.py:100 +msgid "Every X hours" +msgstr "" + +#: apps/currencies/models.py:101 +msgid "Not on" +msgstr "" + +#: apps/currencies/models.py:103 msgid "Service Name" msgstr "" -#: apps/currencies/models.py:99 +#: apps/currencies/models.py:105 msgid "Service Type" msgstr "" -#: apps/currencies/models.py:101 apps/transactions/models.py:71 +#: apps/currencies/models.py:107 apps/transactions/models.py:71 #: apps/transactions/models.py:90 apps/transactions/models.py:109 #: templates/categories/fragments/list.html:21 #: templates/entities/fragments/list.html:21 @@ -434,50 +446,74 @@ msgstr "" msgid "Active" msgstr "" -#: apps/currencies/models.py:106 +#: apps/currencies/models.py:112 msgid "API Key" msgstr "" -#: apps/currencies/models.py:107 +#: apps/currencies/models.py:113 msgid "API key for the service (if required)" msgstr "" -#: apps/currencies/models.py:112 -msgid "Fetch Interval (hours)" -msgstr "" - -#: apps/currencies/models.py:115 -msgid "Last Successful Fetch" -msgstr "" - -#: apps/currencies/models.py:120 -msgid "Target Currencies" +#: apps/currencies/models.py:118 +msgid "Interval Type" msgstr "" #: apps/currencies/models.py:122 +msgid "Interval" +msgstr "" + +#: apps/currencies/models.py:125 +msgid "Last Successful Fetch" +msgstr "" + +#: apps/currencies/models.py:130 +msgid "Target Currencies" +msgstr "" + +#: apps/currencies/models.py:132 msgid "" "Select currencies to fetch exchange rates for. Rates will be fetched for " "each currency against their set exchange currency." msgstr "" -#: apps/currencies/models.py:130 +#: apps/currencies/models.py:140 msgid "Target Accounts" msgstr "" -#: apps/currencies/models.py:132 +#: apps/currencies/models.py:142 msgid "" "Select accounts to fetch exchange rates for. Rates will be fetched for each " "account's currency against their set exchange currency." msgstr "" -#: apps/currencies/models.py:139 +#: apps/currencies/models.py:149 msgid "Exchange Rate Service" msgstr "" -#: apps/currencies/models.py:140 +#: apps/currencies/models.py:150 msgid "Exchange Rate Services" msgstr "" +#: apps/currencies/models.py:202 +msgid "'Every X hours' interval type requires a positive integer." +msgstr "" + +#: apps/currencies/models.py:211 +msgid "'Every X hours' interval must be between 0 and 23." +msgstr "" + +#: apps/currencies/models.py:225 +msgid "" +"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., " +"'1-5,8,10-12')." +msgstr "" + +#: apps/currencies/models.py:236 +msgid "" +"Invalid format. Please check the requirements for your selected interval " +"type." +msgstr "" + #: apps/currencies/views/currencies.py:42 msgid "Currency added successfully" msgstr "" @@ -1335,7 +1371,7 @@ msgstr "" #: templates/dca/fragments/strategy/details.html:63 #: templates/entities/fragments/table.html:23 #: templates/exchange_rates/fragments/table.html:19 -#: templates/exchange_rates_services/fragments/list.html:43 +#: templates/exchange_rates_services/fragments/list.html:42 #: templates/exchange_rates_services/fragments/table.html:19 #: templates/import_app/fragments/profiles/list.html:44 #: templates/installment_plans/fragments/table.html:23 @@ -1355,7 +1391,7 @@ msgstr "" #: templates/dca/fragments/strategy/list.html:34 #: templates/entities/fragments/table.html:28 #: templates/exchange_rates/fragments/table.html:23 -#: templates/exchange_rates_services/fragments/list.html:47 +#: templates/exchange_rates_services/fragments/list.html:46 #: templates/exchange_rates_services/fragments/table.html:23 #: templates/import_app/fragments/profiles/list.html:48 #: templates/installment_plans/fragments/table.html:27 @@ -1378,7 +1414,7 @@ msgstr "" #: templates/dca/fragments/strategy/list.html:42 #: templates/entities/fragments/table.html:36 #: templates/exchange_rates/fragments/table.html:31 -#: templates/exchange_rates_services/fragments/list.html:54 +#: templates/exchange_rates_services/fragments/list.html:53 #: templates/exchange_rates_services/fragments/table.html:31 #: templates/import_app/fragments/profiles/list.html:69 #: templates/import_app/fragments/runs/list.html:102 @@ -1403,7 +1439,7 @@ msgstr "" #: templates/dca/fragments/strategy/list.html:46 #: templates/entities/fragments/table.html:40 #: templates/exchange_rates/fragments/table.html:36 -#: templates/exchange_rates_services/fragments/list.html:58 +#: templates/exchange_rates_services/fragments/list.html:57 #: templates/exchange_rates_services/fragments/table.html:36 #: templates/import_app/fragments/profiles/list.html:73 #: templates/import_app/fragments/runs/list.html:106 @@ -1431,7 +1467,7 @@ msgstr "" #: templates/dca/fragments/strategy/list.html:47 #: templates/entities/fragments/table.html:41 #: templates/exchange_rates/fragments/table.html:37 -#: templates/exchange_rates_services/fragments/list.html:59 +#: templates/exchange_rates_services/fragments/list.html:58 #: templates/exchange_rates_services/fragments/table.html:37 #: templates/import_app/fragments/profiles/list.html:74 #: templates/rules/fragments/list.html:49 @@ -1450,7 +1486,7 @@ msgstr "" #: templates/dca/fragments/strategy/list.html:48 #: templates/entities/fragments/table.html:42 #: templates/exchange_rates/fragments/table.html:38 -#: templates/exchange_rates_services/fragments/list.html:60 +#: templates/exchange_rates_services/fragments/list.html:59 #: templates/exchange_rates_services/fragments/table.html:38 #: templates/import_app/fragments/profiles/list.html:75 #: templates/import_app/fragments/runs/list.html:108 @@ -1924,26 +1960,18 @@ msgid "Targeting" msgstr "" #: templates/exchange_rates_services/fragments/list.html:35 -msgid "Fetch every" -msgstr "" - -#: templates/exchange_rates_services/fragments/list.html:36 msgid "Last fetch" msgstr "" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 msgid "currencies" msgstr "" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 msgid "accounts" msgstr "" -#: templates/exchange_rates_services/fragments/list.html:69 -msgid "hours" -msgstr "" - -#: templates/exchange_rates_services/fragments/list.html:77 +#: templates/exchange_rates_services/fragments/list.html:75 msgid "No services configured" msgstr "" diff --git a/app/locale/nl/LC_MESSAGES/django.po b/app/locale/nl/LC_MESSAGES/django.po index 21ac403..cab7d4c 100644 --- a/app/locale/nl/LC_MESSAGES/django.po +++ b/app/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-04 03:20+0000\n" +"POT-Creation-Date: 2025-02-07 11:45-0300\n" "PO-Revision-Date: 2025-01-29 06:12+0100\n" "Last-Translator: Dimitri Decrock \n" "Language-Team: \n" @@ -25,7 +25,7 @@ msgstr "Groepsnaam" #: apps/accounts/forms.py:40 apps/accounts/forms.py:96 #: apps/currencies/forms.py:53 apps/currencies/forms.py:91 -#: apps/currencies/forms.py:138 apps/dca/forms.py:41 apps/dca/forms.py:93 +#: apps/currencies/forms.py:142 apps/dca/forms.py:41 apps/dca/forms.py:93 #: apps/import_app/forms.py:34 apps/rules/forms.py:45 apps/rules/forms.py:87 #: apps/transactions/forms.py:190 apps/transactions/forms.py:257 #: apps/transactions/forms.py:581 apps/transactions/forms.py:624 @@ -36,7 +36,7 @@ msgstr "Bijwerken" #: apps/accounts/forms.py:48 apps/accounts/forms.py:104 #: apps/common/widgets/tom_select.py:12 apps/currencies/forms.py:61 -#: apps/currencies/forms.py:99 apps/currencies/forms.py:146 +#: apps/currencies/forms.py:99 apps/currencies/forms.py:150 #: apps/dca/forms.py:49 apps/dca/forms.py:102 apps/import_app/forms.py:42 #: apps/rules/forms.py:53 apps/rules/forms.py:95 apps/transactions/forms.py:174 #: apps/transactions/forms.py:199 apps/transactions/forms.py:589 @@ -114,17 +114,17 @@ msgstr "Accountgroep" msgid "Account Groups" msgstr "Accountgroepen" -#: apps/accounts/models.py:31 apps/currencies/models.py:38 +#: apps/accounts/models.py:31 apps/currencies/models.py:39 #: templates/accounts/fragments/list.html:27 msgid "Currency" msgstr "Munteenheid" -#: apps/accounts/models.py:37 apps/currencies/models.py:26 +#: apps/accounts/models.py:37 apps/currencies/models.py:27 #: templates/accounts/fragments/list.html:28 msgid "Exchange Currency" msgstr "Eenheid Wisselgeld" -#: apps/accounts/models.py:42 apps/currencies/models.py:31 +#: apps/accounts/models.py:42 apps/currencies/models.py:32 msgid "Default currency for exchange calculations" msgstr "Standaard munteenheid voor wisselberekeningen" @@ -354,11 +354,11 @@ msgstr "Leegmaken" msgid "No results..." msgstr "Geen resultaten..." -#: apps/currencies/forms.py:17 apps/currencies/models.py:21 +#: apps/currencies/forms.py:17 apps/currencies/models.py:22 msgid "Prefix" msgstr "Voorvoegsel" -#: apps/currencies/forms.py:18 apps/currencies/models.py:22 +#: apps/currencies/forms.py:18 apps/currencies/models.py:23 msgid "Suffix" msgstr "Achtervoegsel" @@ -371,19 +371,19 @@ msgstr "Achtervoegsel" msgid "Date" msgstr "Datum" -#: apps/currencies/models.py:13 +#: apps/currencies/models.py:14 msgid "Currency Code" msgstr "Munteenheids Code" -#: apps/currencies/models.py:15 +#: apps/currencies/models.py:16 msgid "Currency Name" msgstr "Munteenheids Naam" -#: apps/currencies/models.py:19 +#: apps/currencies/models.py:20 msgid "Decimal Places" msgstr "Cijfers na de komma" -#: apps/currencies/models.py:39 apps/transactions/filters.py:60 +#: apps/currencies/models.py:40 apps/transactions/filters.py:60 #: templates/currencies/fragments/list.html:5 #: templates/currencies/pages/index.html:4 templates/includes/navbar.html:119 #: templates/includes/navbar.html:121 @@ -393,47 +393,59 @@ msgstr "Cijfers na de komma" msgid "Currencies" msgstr "Munteenheden" -#: apps/currencies/models.py:47 +#: apps/currencies/models.py:48 msgid "Currency cannot have itself as exchange currency." msgstr "Munteenheid kan zichzelf niet als ruilmiddel hebben." -#: apps/currencies/models.py:58 +#: apps/currencies/models.py:59 msgid "From Currency" msgstr "Van Munteenheid" -#: apps/currencies/models.py:64 +#: apps/currencies/models.py:65 msgid "To Currency" msgstr "Naar Munteenheid" -#: apps/currencies/models.py:67 apps/currencies/models.py:72 +#: apps/currencies/models.py:68 apps/currencies/models.py:73 msgid "Exchange Rate" msgstr "Wisselkoers" -#: apps/currencies/models.py:69 +#: apps/currencies/models.py:70 msgid "Date and Time" msgstr "Datum en Tijd" -#: apps/currencies/models.py:73 templates/exchange_rates/fragments/list.html:6 +#: apps/currencies/models.py:74 templates/exchange_rates/fragments/list.html:6 #: templates/exchange_rates/pages/index.html:4 #: templates/includes/navbar.html:123 msgid "Exchange Rates" msgstr "Wisselkoersen" -#: apps/currencies/models.py:85 +#: apps/currencies/models.py:86 msgid "From and To currencies cannot be the same." msgstr "Van en Naar munteenheid kunnen niet dezelfde zijn." -#: apps/currencies/models.py:97 +#: apps/currencies/models.py:99 +msgid "On" +msgstr "" + +#: apps/currencies/models.py:100 +msgid "Every X hours" +msgstr "" + +#: apps/currencies/models.py:101 +msgid "Not on" +msgstr "" + +#: apps/currencies/models.py:103 msgid "Service Name" msgstr "" -#: apps/currencies/models.py:99 +#: apps/currencies/models.py:105 #, fuzzy #| msgid "Recurrence Type" msgid "Service Type" msgstr "Type Terugkeerpatroon" -#: apps/currencies/models.py:101 apps/transactions/models.py:71 +#: apps/currencies/models.py:107 apps/transactions/models.py:71 #: apps/transactions/models.py:90 apps/transactions/models.py:109 #: templates/categories/fragments/list.html:21 #: templates/entities/fragments/list.html:21 @@ -442,60 +454,88 @@ msgstr "Type Terugkeerpatroon" msgid "Active" msgstr "Actief" -#: apps/currencies/models.py:106 +#: apps/currencies/models.py:112 msgid "API Key" msgstr "" -#: apps/currencies/models.py:107 +#: apps/currencies/models.py:113 msgid "API key for the service (if required)" msgstr "" -#: apps/currencies/models.py:112 -msgid "Fetch Interval (hours)" -msgstr "" +#: apps/currencies/models.py:118 +#, fuzzy +#| msgid "Internal Note" +msgid "Interval Type" +msgstr "Interne opmerking" -#: apps/currencies/models.py:115 +#: apps/currencies/models.py:122 +#, fuzzy +#| msgid "Internal ID" +msgid "Interval" +msgstr "Interne ID" + +#: apps/currencies/models.py:125 #, fuzzy #| msgid "Successful Items" msgid "Last Successful Fetch" msgstr "Succesvolle Artikelen" -#: apps/currencies/models.py:120 +#: apps/currencies/models.py:130 #, fuzzy #| msgid "Target Currency" msgid "Target Currencies" msgstr "Doel Munteenheid" -#: apps/currencies/models.py:122 +#: apps/currencies/models.py:132 msgid "" "Select currencies to fetch exchange rates for. Rates will be fetched for " "each currency against their set exchange currency." msgstr "" -#: apps/currencies/models.py:130 +#: apps/currencies/models.py:140 #, fuzzy #| msgid "To Account" msgid "Target Accounts" msgstr "Naar rekening" -#: apps/currencies/models.py:132 +#: apps/currencies/models.py:142 msgid "" "Select accounts to fetch exchange rates for. Rates will be fetched for each " "account's currency against their set exchange currency." msgstr "" -#: apps/currencies/models.py:139 +#: apps/currencies/models.py:149 #, fuzzy #| msgid "Exchange Rate" msgid "Exchange Rate Service" msgstr "Wisselkoers" -#: apps/currencies/models.py:140 +#: apps/currencies/models.py:150 #, fuzzy #| msgid "Exchange Rates" msgid "Exchange Rate Services" msgstr "Wisselkoersen" +#: apps/currencies/models.py:202 +msgid "'Every X hours' interval type requires a positive integer." +msgstr "" + +#: apps/currencies/models.py:211 +msgid "'Every X hours' interval must be between 0 and 23." +msgstr "" + +#: apps/currencies/models.py:225 +msgid "" +"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., " +"'1-5,8,10-12')." +msgstr "" + +#: apps/currencies/models.py:236 +msgid "" +"Invalid format. Please check the requirements for your selected interval " +"type." +msgstr "" + #: apps/currencies/views/currencies.py:42 msgid "Currency added successfully" msgstr "Munteenheid succesvol toegevoegd" @@ -1371,7 +1411,7 @@ msgstr "Rekeningsgroep bewerken" #: templates/dca/fragments/strategy/details.html:63 #: templates/entities/fragments/table.html:23 #: templates/exchange_rates/fragments/table.html:19 -#: templates/exchange_rates_services/fragments/list.html:43 +#: templates/exchange_rates_services/fragments/list.html:42 #: templates/exchange_rates_services/fragments/table.html:19 #: templates/import_app/fragments/profiles/list.html:44 #: templates/installment_plans/fragments/table.html:23 @@ -1391,7 +1431,7 @@ msgstr "Acties" #: templates/dca/fragments/strategy/list.html:34 #: templates/entities/fragments/table.html:28 #: templates/exchange_rates/fragments/table.html:23 -#: templates/exchange_rates_services/fragments/list.html:47 +#: templates/exchange_rates_services/fragments/list.html:46 #: templates/exchange_rates_services/fragments/table.html:23 #: templates/import_app/fragments/profiles/list.html:48 #: templates/installment_plans/fragments/table.html:27 @@ -1414,7 +1454,7 @@ msgstr "Bijwerken" #: templates/dca/fragments/strategy/list.html:42 #: templates/entities/fragments/table.html:36 #: templates/exchange_rates/fragments/table.html:31 -#: templates/exchange_rates_services/fragments/list.html:54 +#: templates/exchange_rates_services/fragments/list.html:53 #: templates/exchange_rates_services/fragments/table.html:31 #: templates/import_app/fragments/profiles/list.html:69 #: templates/import_app/fragments/runs/list.html:102 @@ -1439,7 +1479,7 @@ msgstr "Verwijderen" #: templates/dca/fragments/strategy/list.html:46 #: templates/entities/fragments/table.html:40 #: templates/exchange_rates/fragments/table.html:36 -#: templates/exchange_rates_services/fragments/list.html:58 +#: templates/exchange_rates_services/fragments/list.html:57 #: templates/exchange_rates_services/fragments/table.html:36 #: templates/import_app/fragments/profiles/list.html:73 #: templates/import_app/fragments/runs/list.html:106 @@ -1467,7 +1507,7 @@ msgstr "Weet je het zeker?" #: templates/dca/fragments/strategy/list.html:47 #: templates/entities/fragments/table.html:41 #: templates/exchange_rates/fragments/table.html:37 -#: templates/exchange_rates_services/fragments/list.html:59 +#: templates/exchange_rates_services/fragments/list.html:58 #: templates/exchange_rates_services/fragments/table.html:37 #: templates/import_app/fragments/profiles/list.html:74 #: templates/rules/fragments/list.html:49 @@ -1486,7 +1526,7 @@ msgstr "Je kunt dit niet meer terugdraaien!" #: templates/dca/fragments/strategy/list.html:48 #: templates/entities/fragments/table.html:42 #: templates/exchange_rates/fragments/table.html:38 -#: templates/exchange_rates_services/fragments/list.html:60 +#: templates/exchange_rates_services/fragments/list.html:59 #: templates/exchange_rates_services/fragments/table.html:38 #: templates/import_app/fragments/profiles/list.html:75 #: templates/import_app/fragments/runs/list.html:108 @@ -1964,30 +2004,22 @@ msgid "Targeting" msgstr "" #: templates/exchange_rates_services/fragments/list.html:35 -msgid "Fetch every" -msgstr "" - -#: templates/exchange_rates_services/fragments/list.html:36 msgid "Last fetch" msgstr "" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 #, fuzzy #| msgid "Currencies" msgid "currencies" msgstr "Munteenheden" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 #, fuzzy #| msgid "Accounts" msgid "accounts" msgstr "Rekeningen" -#: templates/exchange_rates_services/fragments/list.html:69 -msgid "hours" -msgstr "" - -#: templates/exchange_rates_services/fragments/list.html:77 +#: templates/exchange_rates_services/fragments/list.html:75 msgid "No services configured" msgstr "" diff --git a/app/locale/pt_BR/LC_MESSAGES/django.po b/app/locale/pt_BR/LC_MESSAGES/django.po index 2822f3d..2c07de5 100644 --- a/app/locale/pt_BR/LC_MESSAGES/django.po +++ b/app/locale/pt_BR/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-04 03:20+0000\n" -"PO-Revision-Date: 2025-02-04 00:22-0300\n" +"POT-Creation-Date: 2025-02-07 11:45-0300\n" +"PO-Revision-Date: 2025-02-07 11:46-0300\n" "Last-Translator: Herculino Trotta\n" "Language-Team: \n" "Language: pt_BR\n" @@ -25,7 +25,7 @@ msgstr "Nome do grupo" #: apps/accounts/forms.py:40 apps/accounts/forms.py:96 #: apps/currencies/forms.py:53 apps/currencies/forms.py:91 -#: apps/currencies/forms.py:138 apps/dca/forms.py:41 apps/dca/forms.py:93 +#: apps/currencies/forms.py:142 apps/dca/forms.py:41 apps/dca/forms.py:93 #: apps/import_app/forms.py:34 apps/rules/forms.py:45 apps/rules/forms.py:87 #: apps/transactions/forms.py:190 apps/transactions/forms.py:257 #: apps/transactions/forms.py:581 apps/transactions/forms.py:624 @@ -36,7 +36,7 @@ msgstr "Atualizar" #: apps/accounts/forms.py:48 apps/accounts/forms.py:104 #: apps/common/widgets/tom_select.py:12 apps/currencies/forms.py:61 -#: apps/currencies/forms.py:99 apps/currencies/forms.py:146 +#: apps/currencies/forms.py:99 apps/currencies/forms.py:150 #: apps/dca/forms.py:49 apps/dca/forms.py:102 apps/import_app/forms.py:42 #: apps/rules/forms.py:53 apps/rules/forms.py:95 apps/transactions/forms.py:174 #: apps/transactions/forms.py:199 apps/transactions/forms.py:589 @@ -114,17 +114,17 @@ msgstr "Grupo da Conta" msgid "Account Groups" msgstr "Grupos da Conta" -#: apps/accounts/models.py:31 apps/currencies/models.py:38 +#: apps/accounts/models.py:31 apps/currencies/models.py:39 #: templates/accounts/fragments/list.html:27 msgid "Currency" msgstr "Moeda" -#: apps/accounts/models.py:37 apps/currencies/models.py:26 +#: apps/accounts/models.py:37 apps/currencies/models.py:27 #: templates/accounts/fragments/list.html:28 msgid "Exchange Currency" msgstr "Moeda de Câmbio" -#: apps/accounts/models.py:42 apps/currencies/models.py:31 +#: apps/accounts/models.py:42 apps/currencies/models.py:32 msgid "Default currency for exchange calculations" msgstr "Moeda padrão para os cálculos de câmbio" @@ -352,11 +352,11 @@ msgstr "Limpar" msgid "No results..." msgstr "Sem resultados..." -#: apps/currencies/forms.py:17 apps/currencies/models.py:21 +#: apps/currencies/forms.py:17 apps/currencies/models.py:22 msgid "Prefix" msgstr "Prefixo" -#: apps/currencies/forms.py:18 apps/currencies/models.py:22 +#: apps/currencies/forms.py:18 apps/currencies/models.py:23 msgid "Suffix" msgstr "Sufixo" @@ -369,19 +369,19 @@ msgstr "Sufixo" msgid "Date" msgstr "Data" -#: apps/currencies/models.py:13 +#: apps/currencies/models.py:14 msgid "Currency Code" msgstr "Código da Moeda" -#: apps/currencies/models.py:15 +#: apps/currencies/models.py:16 msgid "Currency Name" msgstr "Nome da Moeda" -#: apps/currencies/models.py:19 +#: apps/currencies/models.py:20 msgid "Decimal Places" msgstr "Casas Decimais" -#: apps/currencies/models.py:39 apps/transactions/filters.py:60 +#: apps/currencies/models.py:40 apps/transactions/filters.py:60 #: templates/currencies/fragments/list.html:5 #: templates/currencies/pages/index.html:4 templates/includes/navbar.html:119 #: templates/includes/navbar.html:121 @@ -391,45 +391,57 @@ msgstr "Casas Decimais" msgid "Currencies" msgstr "Moedas" -#: apps/currencies/models.py:47 +#: apps/currencies/models.py:48 msgid "Currency cannot have itself as exchange currency." msgstr "A moeda não pode ter a si mesma como moeda de câmbio." -#: apps/currencies/models.py:58 +#: apps/currencies/models.py:59 msgid "From Currency" msgstr "Moeda de origem" -#: apps/currencies/models.py:64 +#: apps/currencies/models.py:65 msgid "To Currency" msgstr "Moeda de destino" -#: apps/currencies/models.py:67 apps/currencies/models.py:72 +#: apps/currencies/models.py:68 apps/currencies/models.py:73 msgid "Exchange Rate" msgstr "Taxa de Câmbio" -#: apps/currencies/models.py:69 +#: apps/currencies/models.py:70 msgid "Date and Time" msgstr "Data e Tempo" -#: apps/currencies/models.py:73 templates/exchange_rates/fragments/list.html:6 +#: apps/currencies/models.py:74 templates/exchange_rates/fragments/list.html:6 #: templates/exchange_rates/pages/index.html:4 #: templates/includes/navbar.html:123 msgid "Exchange Rates" msgstr "Taxas de Câmbio" -#: apps/currencies/models.py:85 +#: apps/currencies/models.py:86 msgid "From and To currencies cannot be the same." msgstr "As moedas De e Para não podem ser as mesmas." -#: apps/currencies/models.py:97 +#: apps/currencies/models.py:99 +msgid "On" +msgstr "Em" + +#: apps/currencies/models.py:100 +msgid "Every X hours" +msgstr "A cada X horas" + +#: apps/currencies/models.py:101 +msgid "Not on" +msgstr "Não em" + +#: apps/currencies/models.py:103 msgid "Service Name" msgstr "Nome do Serviço" -#: apps/currencies/models.py:99 +#: apps/currencies/models.py:105 msgid "Service Type" msgstr "Tipo de Serviço" -#: apps/currencies/models.py:101 apps/transactions/models.py:71 +#: apps/currencies/models.py:107 apps/transactions/models.py:71 #: apps/transactions/models.py:90 apps/transactions/models.py:109 #: templates/categories/fragments/list.html:21 #: templates/entities/fragments/list.html:21 @@ -438,27 +450,31 @@ msgstr "Tipo de Serviço" msgid "Active" msgstr "Ativo" -#: apps/currencies/models.py:106 +#: apps/currencies/models.py:112 msgid "API Key" msgstr "Chave de API" -#: apps/currencies/models.py:107 +#: apps/currencies/models.py:113 msgid "API key for the service (if required)" msgstr "Chave de API para o serviço (se necessário)" -#: apps/currencies/models.py:112 -msgid "Fetch Interval (hours)" -msgstr "Intervalo de busca (horas)" +#: apps/currencies/models.py:118 +msgid "Interval Type" +msgstr "Tipo de Intervalo" -#: apps/currencies/models.py:115 +#: apps/currencies/models.py:122 +msgid "Interval" +msgstr "Intervalo" + +#: apps/currencies/models.py:125 msgid "Last Successful Fetch" msgstr "Última execução bem-sucedida" -#: apps/currencies/models.py:120 +#: apps/currencies/models.py:130 msgid "Target Currencies" msgstr "Moedas-alvo" -#: apps/currencies/models.py:122 +#: apps/currencies/models.py:132 msgid "" "Select currencies to fetch exchange rates for. Rates will be fetched for " "each currency against their set exchange currency." @@ -466,11 +482,11 @@ msgstr "" "Selecione as moedas para as quais deseja obter as taxas de câmbio. As taxas " "serão obtidas para cada moeda em relação à moeda de câmbio definida." -#: apps/currencies/models.py:130 +#: apps/currencies/models.py:140 msgid "Target Accounts" msgstr "Contas-alvo" -#: apps/currencies/models.py:132 +#: apps/currencies/models.py:142 msgid "" "Select accounts to fetch exchange rates for. Rates will be fetched for each " "account's currency against their set exchange currency." @@ -479,14 +495,39 @@ msgstr "" "serão obtidas para a moeda de cada conta em relação à moeda de câmbio " "definida." -#: apps/currencies/models.py:139 +#: apps/currencies/models.py:149 msgid "Exchange Rate Service" msgstr "Serviço de Taxa de Câmbio" -#: apps/currencies/models.py:140 +#: apps/currencies/models.py:150 msgid "Exchange Rate Services" msgstr "Serviços de Taxa de Câmbio" +#: apps/currencies/models.py:202 +msgid "'Every X hours' interval type requires a positive integer." +msgstr "" +"Intervalo do tipo 'A cada X horas' requerer um número inteiro positivo." + +#: apps/currencies/models.py:211 +msgid "'Every X hours' interval must be between 0 and 23." +msgstr "Intervalo do tipo 'A cada X horas' requerer um número entre 0 e 23." + +#: apps/currencies/models.py:225 +msgid "" +"Invalid hour format. Use comma-separated hours (0-23) and/or ranges (e.g., " +"'1-5,8,10-12')." +msgstr "" +"Formato inválido de hora. Use uma lista de horas separada por vírgulas " +"(0-23) e/ou uma faixa (ex.: '1-5,8,10-12')" + +#: apps/currencies/models.py:236 +msgid "" +"Invalid format. Please check the requirements for your selected interval " +"type." +msgstr "" +"Formato inválido. Por favor cheque os requisitos para o seu tipo de " +"intervalo." + #: apps/currencies/views/currencies.py:42 msgid "Currency added successfully" msgstr "Moeda adicionada com sucesso" @@ -1349,7 +1390,7 @@ msgstr "Editar grupo de conta" #: templates/dca/fragments/strategy/details.html:63 #: templates/entities/fragments/table.html:23 #: templates/exchange_rates/fragments/table.html:19 -#: templates/exchange_rates_services/fragments/list.html:43 +#: templates/exchange_rates_services/fragments/list.html:42 #: templates/exchange_rates_services/fragments/table.html:19 #: templates/import_app/fragments/profiles/list.html:44 #: templates/installment_plans/fragments/table.html:23 @@ -1369,7 +1410,7 @@ msgstr "Ações" #: templates/dca/fragments/strategy/list.html:34 #: templates/entities/fragments/table.html:28 #: templates/exchange_rates/fragments/table.html:23 -#: templates/exchange_rates_services/fragments/list.html:47 +#: templates/exchange_rates_services/fragments/list.html:46 #: templates/exchange_rates_services/fragments/table.html:23 #: templates/import_app/fragments/profiles/list.html:48 #: templates/installment_plans/fragments/table.html:27 @@ -1392,7 +1433,7 @@ msgstr "Editar" #: templates/dca/fragments/strategy/list.html:42 #: templates/entities/fragments/table.html:36 #: templates/exchange_rates/fragments/table.html:31 -#: templates/exchange_rates_services/fragments/list.html:54 +#: templates/exchange_rates_services/fragments/list.html:53 #: templates/exchange_rates_services/fragments/table.html:31 #: templates/import_app/fragments/profiles/list.html:69 #: templates/import_app/fragments/runs/list.html:102 @@ -1417,7 +1458,7 @@ msgstr "Apagar" #: templates/dca/fragments/strategy/list.html:46 #: templates/entities/fragments/table.html:40 #: templates/exchange_rates/fragments/table.html:36 -#: templates/exchange_rates_services/fragments/list.html:58 +#: templates/exchange_rates_services/fragments/list.html:57 #: templates/exchange_rates_services/fragments/table.html:36 #: templates/import_app/fragments/profiles/list.html:73 #: templates/import_app/fragments/runs/list.html:106 @@ -1445,7 +1486,7 @@ msgstr "Tem certeza?" #: templates/dca/fragments/strategy/list.html:47 #: templates/entities/fragments/table.html:41 #: templates/exchange_rates/fragments/table.html:37 -#: templates/exchange_rates_services/fragments/list.html:59 +#: templates/exchange_rates_services/fragments/list.html:58 #: templates/exchange_rates_services/fragments/table.html:37 #: templates/import_app/fragments/profiles/list.html:74 #: templates/rules/fragments/list.html:49 @@ -1464,7 +1505,7 @@ msgstr "Você não será capaz de reverter isso!" #: templates/dca/fragments/strategy/list.html:48 #: templates/entities/fragments/table.html:42 #: templates/exchange_rates/fragments/table.html:38 -#: templates/exchange_rates_services/fragments/list.html:60 +#: templates/exchange_rates_services/fragments/list.html:59 #: templates/exchange_rates_services/fragments/table.html:38 #: templates/import_app/fragments/profiles/list.html:75 #: templates/import_app/fragments/runs/list.html:108 @@ -1939,26 +1980,18 @@ msgid "Targeting" msgstr "Alvos" #: templates/exchange_rates_services/fragments/list.html:35 -msgid "Fetch every" -msgstr "Buscar a cada" - -#: templates/exchange_rates_services/fragments/list.html:36 msgid "Last fetch" msgstr "Última execução" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 msgid "currencies" msgstr "moedas" -#: templates/exchange_rates_services/fragments/list.html:68 +#: templates/exchange_rates_services/fragments/list.html:67 msgid "accounts" msgstr "contas" -#: templates/exchange_rates_services/fragments/list.html:69 -msgid "hours" -msgstr "horas" - -#: templates/exchange_rates_services/fragments/list.html:77 +#: templates/exchange_rates_services/fragments/list.html:75 msgid "No services configured" msgstr "Nenhum serviço configurado" @@ -2511,6 +2544,15 @@ msgstr "Visão Anual" msgid "Year" msgstr "Ano" +#~ msgid "Fetch Interval (hours)" +#~ msgstr "Intervalo de busca (horas)" + +#~ msgid "Fetch every" +#~ msgstr "Buscar a cada" + +#~ msgid "hours" +#~ msgstr "horas" + #, fuzzy #~ msgid "Exchange rates queued to be fetched successfully" #~ msgstr "Taxas de câmbio com sucesso"