Merge branch 'release/4.8.1.1'

This commit is contained in:
James Cole 2019-09-13 19:15:48 +02:00
commit 99686346dc
40 changed files with 390 additions and 223 deletions

View File

@ -1,3 +1,15 @@
# 4.8.1.1
- Add some sensible maximum amounts to form inputs.
- [Issue 2561](https://github.com/firefly-iii/firefly-iii/issues/2561) Fixes a query error on the /tags page that affected some MySQL users.
- [Issue 2563](https://github.com/firefly-iii/firefly-iii/issues/2563) Two destination fields when editing a recurring transaction.
- [Issue 2564](https://github.com/firefly-iii/firefly-iii/issues/2564) Ability to browse pages in the search results.
- [Issue 2573](https://github.com/firefly-iii/firefly-iii/issues/2573) Could not submit an transaction update after an error was corrected.
- [Issue 2577](https://github.com/firefly-iii/firefly-iii/issues/2577) Upgrade routine would wrongly store the categories of split transactions.
- [Issue 2590](https://github.com/firefly-iii/firefly-iii/issues/2590) Fix an issue in the audit report.
- [Issue 2592](https://github.com/firefly-iii/firefly-iii/issues/2592) Fix an issue with YNAB import.
- [Issue 2597](https://github.com/firefly-iii/firefly-iii/issues/2597) Fix an issue where users could not delete currencies.
# 4.8.1 (API 0.10.2)
- Firefly III 4.8.1 requires PHP 7.3.

View File

@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
manifest = (
appTitle = (defaultText = "Firefly III"),
appVersion = 36,
appMarketingVersion = (defaultText = "4.8.1"),
appVersion = 37,
appMarketingVersion = (defaultText = "4.8.1.1"),
actions = [
# Define your "new document" handlers here.

View File

@ -1,7 +1,7 @@
sudo: required
language: bash
env:
- VERSION=4.8.1
- VERSION=4.8.1.1
dist: xenial

View File

@ -25,6 +25,8 @@ namespace FireflyIII\Console\Commands\Upgrade;
use DB;
use Exception;
use FireflyIII\Factory\TransactionGroupFactory;
use FireflyIII\Models\Budget;
use FireflyIII\Models\Category;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Journal\JournalCLIRepositoryInterface;
@ -306,6 +308,10 @@ class MigrateToGroups extends Command
// @codeCoverageIgnoreEnd
}
// overrule journal category with transaction category.
$budgetId = $this->getTransactionBudget($transaction, $opposingTr) ?? $budgetId;
$categoryId = $this->getTransactionCategory($transaction, $opposingTr) ?? $categoryId;
$tArray = [
'type' => strtolower($journal->transactionType->type),
'date' => $journal->date,
@ -367,6 +373,72 @@ class MigrateToGroups extends Command
);
}
/**
* @param Transaction $left
* @param Transaction $right
*
* @return int|null
*/
private function getTransactionBudget(Transaction $left, Transaction $right): ?int
{
Log::debug('Now in getTransactionBudget()');
// try to get a budget ID from the left transaction:
/** @var Budget $budget */
$budget = $left->budgets()->first();
if (null !== $budget) {
Log::debug(sprintf('Return budget #%d, from transaction #%d', $budget->id, $left->id));
return (int)$budget->id;
}
// try to get a budget ID from the right transaction:
/** @var Budget $budget */
$budget = $right->budgets()->first();
if (null !== $budget) {
Log::debug(sprintf('Return budget #%d, from transaction #%d', $budget->id, $right->id));
return (int)$budget->id;
}
Log::debug('Neither left or right have a budget, return NULL');
// if all fails, return NULL.
return null;
}
/**
* @param Transaction $left
* @param Transaction $right
*
* @return int|null
*/
private function getTransactionCategory(Transaction $left, Transaction $right): ?int
{
Log::debug('Now in getTransactionCategory()');
// try to get a category ID from the left transaction:
/** @var Category $category */
$category = $left->categories()->first();
if (null !== $category) {
Log::debug(sprintf('Return category #%d, from transaction #%d', $category->id, $left->id));
return (int)$category->id;
}
// try to get a category ID from the left transaction:
/** @var Category $category */
$category = $right->categories()->first();
if (null !== $category) {
Log::debug(sprintf('Return category #%d, from transaction #%d', $category->id, $category->id));
return (int)$category->id;
}
Log::debug('Neither left or right have a category, return NULL');
// if all fails, return NULL.
return null;
}
/**
*
*/

View File

@ -305,7 +305,7 @@ class TransactionJournalFactory
$transactionFactory->setCurrency($sourceCurrency);
$transactionFactory->setForeignCurrency($sourceForeignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false);
$transactionFactory->createNegative($row['amount'], $row['foreign_amount']);
$transactionFactory->createNegative((string)$row['amount'], $row['foreign_amount']);
// and the destination one:
/** @var TransactionFactory $transactionFactory */
@ -316,7 +316,7 @@ class TransactionJournalFactory
$transactionFactory->setCurrency($destCurrency);
$transactionFactory->setForeignCurrency($destForeignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false);
$transactionFactory->createPositive($row['amount'], $row['foreign_amount']);
$transactionFactory->createPositive((string)$row['amount'], $row['foreign_amount']);
// verify that journal has two transactions. Otherwise, delete and cancel.
// TODO this can't be faked so it can't be tested.

View File

@ -119,15 +119,11 @@ class MonthReportGenerator implements ReportGeneratorInterface
$collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end)->withAccountInformation()
->withBudgetInformation()->withCategoryInformation()->withBillInformation();
$journals = $collector->getExtractedJournals();
$journals = array_reverse($journals, true);
$journals = array_reverse($journals, true);
$dayBeforeBalance = app('steam')->balance($account, $date);
$startBalance = $dayBeforeBalance;
$currency = $accountRepository->getAccountCurrency($account);
if (null === $currency) {
throw new FireflyException('Unexpected NULL value in account currency preference.'); // @codeCoverageIgnore
}
$defaultCurrency = app('amount')->getDefaultCurrencyByUser($account->user);
$currency = $accountRepository->getAccountCurrency($account) ?? $defaultCurrency;
foreach ($journals as $index => $journal) {
$journals[$index]['balance_before'] = $startBalance;
@ -140,6 +136,9 @@ class MonthReportGenerator implements ReportGeneratorInterface
if ($currency->id === $journal['foreign_currency_id']) {
$transactionAmount = $journal['foreign_amount'];
if ($account->id === $journal['destination_account_id']) {
$transactionAmount = app('steam')->positive($journal['foreign_amount']);
}
}
$newBalance = bcadd($startBalance, $transactionAmount);
@ -158,6 +157,7 @@ class MonthReportGenerator implements ReportGeneratorInterface
$return = [
'journals' => $journals,
'currency' => $currency,
'exists' => count($journals) > 0,
'end' => $this->end->formatLocalized((string)trans('config.month_and_day')),
'endBalance' => app('steam')->balance($account, $this->end),

View File

@ -140,7 +140,9 @@ class CurrencyController extends Controller
}
if ($this->repository->currencyInUse($currency)) {
$request->session()->flash('error', (string)trans('firefly.cannot_delete_currency', ['name' => e($currency->name)]));
$location = $this->repository->currencyInUseAt($currency);
$message = (string)trans(sprintf('firefly.cannot_disable_currency_%s', $location), ['name' => e($currency->name)]);
$request->session()->flash('error', $message);
Log::channel('audit')->info(sprintf('Tried to visit page to delete currency %s but currency is in use.', $currency->code));
return redirect(route('currencies.index'));

View File

@ -61,14 +61,14 @@ class SearchController extends Controller
public function index(Request $request, SearchInterface $searcher)
{
$fullQuery = (string)$request->get('search');
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page');
// parse search terms:
$searcher->parseQuery($fullQuery);
$query = $searcher->getWordsAsString();
$modifiers = $searcher->getModifiers();
$subTitle = (string)trans('breadcrumbs.search_result', ['query' => $query]);
return view('search.index', compact('query', 'modifiers', 'fullQuery', 'subTitle'));
return view('search.index', compact('query', 'modifiers', 'page','fullQuery', 'subTitle'));
}
/**
@ -81,15 +81,20 @@ class SearchController extends Controller
*/
public function search(Request $request, SearchInterface $searcher): JsonResponse
{
$fullQuery = (string)$request->get('query');
$fullQuery = (string)$request->get('query');
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page');
$searcher->parseQuery($fullQuery);
$searcher->setPage($page);
$searcher->setLimit((int)config('firefly.search_result_limit'));
$groups = $searcher->searchTransactions();
$groups = $searcher->searchTransactions();
$hasPages = $groups->hasPages();
$searchTime = round($searcher->searchTime(), 3); // in seconds
$parameters = ['search' => $fullQuery];
$url = route('search.index') . '?' . http_build_query($parameters);
$groups->setPath($url);
try {
$html = view('search.search', compact('groups','searchTime'))->render();
$html = view('search.search', compact('groups', 'hasPages', 'searchTime'))->render();
// @codeCoverageIgnoreStart
} catch (Throwable $e) {
Log::error(sprintf('Cannot render search.search: %s', $e->getMessage()));

View File

@ -94,11 +94,11 @@ class AccountFormRequest extends Request
$ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes')));
$rules = [
'name' => 'required|min:1|uniqueAccountForUser',
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable',
'opening_balance' => 'numeric|required_with:opening_balance_date|nullable|max:1000000000',
'opening_balance_date' => 'date|required_with:opening_balance|nullable',
'iban' => ['iban', 'nullable', new UniqueIban(null, $this->string('objectType'))],
'BIC' => 'bic|nullable',
'virtual_balance' => 'numeric|nullable',
'virtual_balance' => 'numeric|nullable|max:1000000000',
'currency_id' => 'exists:transaction_currencies,id',
'account_number' => 'between:1,255|uniqueAccountNumberForUser|nullable',
'account_role' => 'in:' . $accountRoles,
@ -111,7 +111,7 @@ class AccountFormRequest extends Request
];
if ('liabilities' === $this->get('objectType')) {
$rules['opening_balance'] = ['numeric', 'required'];
$rules['opening_balance'] = ['numeric', 'required','max:1000000000'];
$rules['opening_balance_date'] = 'date|required';
}

View File

@ -77,8 +77,8 @@ class BillFormRequest extends Request
// is OK
$rules = [
'name' => $nameRule,
'amount_min' => 'required|numeric|more:0',
'amount_max' => 'required|numeric|more:0',
'amount_min' => 'required|numeric|more:0|max:1000000000',
'amount_max' => 'required|numeric|more:0|max:1000000000',
'transaction_currency_id' => 'required|exists:transaction_currencies,id',
'date' => 'required|date',
'repeat_freq' => 'required|in:weekly,monthly,quarterly,half-year,yearly',

View File

@ -49,7 +49,7 @@ class BudgetIncomeRequest extends Request
{
// fixed
return [
'amount' => 'numeric|required|min:0',
'amount' => 'numeric|required|min:0|max:1000000000',
'start' => 'required|date|before:end',
'end' => 'required|date|after:start',
];

View File

@ -50,9 +50,9 @@ class NewUserFormRequest extends Request
// fixed
return [
'bank_name' => 'required|between:1,200',
'bank_balance' => 'required|numeric',
'savings_balance' => 'numeric',
'credit_card_limit' => 'numeric',
'bank_balance' => 'required|numeric|max:1000000000',
'savings_balance' => 'numeric|max:1000000000',
'credit_card_limit' => 'numeric|max:1000000000',
'amount_currency_id_bank_balance' => 'exists:transaction_currencies,id',
'amount_currency_id_savings_balance' => 'exists:transaction_currencies,id',
'amount_currency_id_credit_card_limit' => 'exists:transaction_currencies,id',

View File

@ -76,7 +76,7 @@ class PiggyBankFormRequest extends Request
$rules = [
'name' => $nameRule,
'account_id' => 'required|belongsToUser:accounts',
'targetamount' => 'required|numeric|more:0',
'targetamount' => 'required|numeric|more:0|max:1000000000',
'startdate' => 'date',
'targetdate' => 'date|nullable',
'order' => 'integer|min:1',

View File

@ -77,9 +77,9 @@ class ReconciliationStoreRequest extends Request
return [
'start' => 'required|date',
'end' => 'required|date',
'startBalance' => 'numeric',
'endBalance' => 'numeric',
'difference' => 'required|numeric',
'startBalance' => 'numeric|max:1000000000',
'endBalance' => 'numeric|max:1000000000',
'difference' => 'required|numeric|max:1000000000',
'journals' => [new ValidJournals],
'reconcile' => 'required|in:create,nothing',
];

View File

@ -160,7 +160,7 @@ class RecurrenceFormRequest extends Request
'transaction_description' => 'required|between:1,255',
'transaction_type' => 'required|in:withdrawal,deposit,transfer',
'transaction_currency_id' => 'required|exists:transaction_currencies,id',
'amount' => 'numeric|required|more:0',
'amount' => 'numeric|required|more:0|max:1000000000',
// mandatory account info:
'source_id' => 'numeric|belongsToUser:accounts,id|nullable',
'source_name' => 'between:1,255|nullable',
@ -168,7 +168,7 @@ class RecurrenceFormRequest extends Request
'destination_name' => 'between:1,255|nullable',
// foreign amount data:
'foreign_amount' => 'nullable|more:0',
'foreign_amount' => 'nullable|more:0|max:1000000000',
// optional fields:
'budget_id' => 'mustExist:budgets,id|belongsToUser:budgets,id|nullable',

View File

@ -466,12 +466,12 @@ class TagRepository implements TagRepositoryInterface
->leftJoin('transaction_journals', 'tag_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
->leftJoin('transactions', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->where(
function (Builder $query) {
static function (Builder $query) {
$query->where('transactions.amount', '>', 0);
$query->orWhereNull('transactions.amount');
}
)
->groupBy(['tags.id', 'tags.tag']);
->groupBy(['tags.id', 'tags.tag', 'tags.created_at']);
// add date range (or not):
if (null === $year) {

View File

@ -50,7 +50,7 @@ class CurrencyDestroyService
{
try {
$currency->forceDelete();
$currency->delete();
} catch (Exception $e) { // @codeCoverageIgnore
Log::error(sprintf('Could not delete transaction currency: %s', $e->getMessage())); // @codeCoverageIgnore
}

View File

@ -67,18 +67,22 @@ class StageFinalHandler
// transaction data:
'transactions' => [
[
'currency_id' => null,
'currency_code' => 'EUR',
'description' => null,
'amount' => random_int(500, 5000) / 100,
'budget_id' => null,
'budget_name' => null,
'category_id' => null,
'category_name' => null,
'source_id' => null,
'source_name' => 'Checking Account',
'destination_id' => null,
'destination_name' => 'Random expense account #' . random_int(1, 10000),
'type' => 'withdrawal',
'date' => Carbon::now()->format('Y-m-d'),
'currency_id' => null,
'currency_code' => 'EUR',
'description' => 'Some random description #' . random_int(1, 10000),
'amount' => random_int(500, 5000) / 100,
'tags' => [],
'user' => $this->importJob->user_id,
'budget_id' => null,
'budget_name' => null,
'category_id' => null,
'category_name' => null,
'source_id' => null,
'source_name' => 'Checking Account',
'destination_id' => null,
'destination_name' => 'Random expense account #' . random_int(1, 10000),
'foreign_currency_id' => null,
'foreign_currency_code' => null,
'foreign_amount' => null,
@ -112,9 +116,13 @@ class StageFinalHandler
// transaction data:
'transactions' => [
[
'type' => 'transfer',
'user' => $this->importJob->user_id,
'date' => '2017-02-28',
'currency_id' => null,
'currency_code' => 'EUR',
'description' => null,
'tags' => [],
'description' => 'Saving money for February',
'amount' => '140',
'budget_id' => null,
'budget_name' => null,

View File

@ -182,16 +182,26 @@ class ImportDataHandler
// transaction data:
'transactions' => [
[
'type' => $type,
'date' => $transaction['date'] ?? date('Y-m-d'),
'tags' => $tags,
'user' => $this->importJob->user_id,
'notes' => null,
'currency_id' => null,
'currency_code' => $budget['currency_code'] ?? $this->defaultCurrency->code,
'description' => null,
'amount' => bcdiv((string)$transaction['amount'], '1000'),
'budget_id' => null,
'original-source' => sprintf('ynab-v%s', config('firefly.version')),
'budget_name' => null,
'category_id' => null,
'category_name' => $transaction['category_name'],
'source_id' => $source->id,
'source_name' => null,
// all custom fields:
'external_id' => $transaction['id'] ?? '',
// journal data:
'description' => $description,
'destination_id' => $destination->id,
'destination_name' => null,
'foreign_currency_id' => null,

View File

@ -64,12 +64,15 @@ class Search implements SearchInterface
private $validModifiers;
/** @var array */
private $words = [];
/** @var int */
private $page;
/**
* Search constructor.
*/
public function __construct()
{
$this->page = 1;
$this->modifiers = new Collection;
$this->validModifiers = (array)config('firefly.search_modifiers');
$this->startTime = microtime(true);
@ -149,12 +152,11 @@ class Search implements SearchInterface
{
Log::debug('Start of searchTransactions()');
$pageSize = 50;
$page = 1;
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setLimit($pageSize)->setPage($page)->withAccountInformation();
$collector->setLimit($pageSize)->setPage($this->page)->withAccountInformation();
$collector->withCategoryInformation()->withBudgetInformation();
$collector->setSearchWords($this->words);
@ -308,4 +310,12 @@ class Search implements SearchInterface
}
}
}
/**
* @param int $page
*/
public function setPage(int $page): void
{
$this->page = $page;
}
}

View File

@ -41,6 +41,11 @@ interface SearchInterface
*/
public function getWordsAsString(): string;
/**
* @param int $page
*/
public function setPage(int $page): void;
/**
* @return bool
*/

View File

@ -2,7 +2,22 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [4.8.1 (API 0.10.2)] - 2019-08-xx
## [4.8.1.1 (API 0.10.2)] - 2019-09-12
### Changed
- Add some sensible maximum amounts to form inputs.
### Fixed
- [Issue 2561](https://github.com/firefly-iii/firefly-iii/issues/2561) Fixes a query error on the /tags page that affected some MySQL users.
- [Issue 2563](https://github.com/firefly-iii/firefly-iii/issues/2563) Two destination fields when editing a recurring transaction.
- [Issue 2564](https://github.com/firefly-iii/firefly-iii/issues/2564) Ability to browse pages in the search results.
- [Issue 2573](https://github.com/firefly-iii/firefly-iii/issues/2573) Could not submit an transaction update after an error was corrected.
- [Issue 2577](https://github.com/firefly-iii/firefly-iii/issues/2577) Upgrade routine would wrongly store the categories of split transactions.
- [Issue 2590](https://github.com/firefly-iii/firefly-iii/issues/2590) Fix an issue in the audit report.
- [Issue 2592](https://github.com/firefly-iii/firefly-iii/issues/2592) Fix an issue with YNAB import.
- [Issue 2597](https://github.com/firefly-iii/firefly-iii/issues/2597) Fix an issue where users could not delete currencies.
## [4.8.1 (API 0.10.2)] - 2019-09-08
Firefly III 4.8.1 requires PHP 7.3.

189
composer.lock generated
View File

@ -171,12 +171,12 @@
"source": {
"type": "git",
"url": "https://github.com/bunq/sdk_php.git",
"reference": "be645736a2488ec247f0be528bab7619768da12f"
"reference": "cfde75f644e5105a8634b0cd9a891c49c50b0e28"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bunq/sdk_php/zipball/be645736a2488ec247f0be528bab7619768da12f",
"reference": "be645736a2488ec247f0be528bab7619768da12f",
"url": "https://api.github.com/repos/bunq/sdk_php/zipball/cfde75f644e5105a8634b0cd9a891c49c50b0e28",
"reference": "cfde75f644e5105a8634b0cd9a891c49c50b0e28",
"shasum": ""
},
"require": {
@ -194,7 +194,7 @@
"phpstan/phpstan": "^0.8",
"phpunit/phpunit": "^6.0.13",
"sebastian/phpcpd": "^3.0",
"sensiolabs/security-checker": "^4.1"
"sensiolabs/security-checker": "^5.0"
},
"bin": [
"bin/bunq-install"
@ -227,7 +227,7 @@
"payment",
"sepa"
],
"time": "2019-06-15T12:22:02+00:00"
"time": "2019-09-10T15:00:27+00:00"
},
{
"name": "danhunsaker/laravel-flysystem-others",
@ -1522,31 +1522,31 @@
},
{
"name": "laravel/passport",
"version": "v7.4.0",
"version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/passport.git",
"reference": "4460bd1fb5d913d75e547caf02a5a19c6d77794d"
"reference": "cc39dc6a36ebf5926906eb5ad3c62dba50c9bbd0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/passport/zipball/4460bd1fb5d913d75e547caf02a5a19c6d77794d",
"reference": "4460bd1fb5d913d75e547caf02a5a19c6d77794d",
"url": "https://api.github.com/repos/laravel/passport/zipball/cc39dc6a36ebf5926906eb5ad3c62dba50c9bbd0",
"reference": "cc39dc6a36ebf5926906eb5ad3c62dba50c9bbd0",
"shasum": ""
},
"require": {
"ext-json": "*",
"firebase/php-jwt": "~3.0|~4.0|~5.0",
"guzzlehttp/guzzle": "~6.0",
"illuminate/auth": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/console": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/container": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/contracts": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/cookie": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/encryption": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/http": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/support": "~5.6.0|~5.7.0|~5.8.0|^6.0",
"illuminate/auth": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/console": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/container": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/contracts": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/cookie": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/encryption": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/http": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"illuminate/support": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
"league/oauth2-server": "^7.0",
"php": ">=7.1",
"phpseclib/phpseclib": "^2.0",
@ -1554,8 +1554,8 @@
"zendframework/zend-diactoros": "~1.0|~2.0"
},
"require-dev": {
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~7.4"
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^7.4|^8.0"
},
"type": "library",
"extra": {
@ -1589,7 +1589,7 @@
"oauth",
"passport"
],
"time": "2019-08-20T18:10:43+00:00"
"time": "2019-09-10T19:55:34+00:00"
},
{
"name": "laravelcollective/html",
@ -2749,16 +2749,16 @@
},
{
"name": "pragmarx/google2fa",
"version": "v5.0.0",
"version": "v6.0.0",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa.git",
"reference": "17c969c82f427dd916afe4be50bafc6299aef1b4"
"reference": "03f6fb65aaccc21d6f70969db652316ad003b83d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/17c969c82f427dd916afe4be50bafc6299aef1b4",
"reference": "17c969c82f427dd916afe4be50bafc6299aef1b4",
"url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/03f6fb65aaccc21d6f70969db652316ad003b83d",
"reference": "03f6fb65aaccc21d6f70969db652316ad003b83d",
"shasum": ""
},
"require": {
@ -2768,7 +2768,7 @@
"symfony/polyfill-php56": "~1.2"
},
"require-dev": {
"phpunit/phpunit": "~4|~5|~6"
"phpunit/phpunit": "~4|~5|~6|~7|~8"
},
"type": "library",
"extra": {
@ -2790,8 +2790,8 @@
"authors": [
{
"name": "Antonio Carlos Ribeiro",
"role": "Creator & Designer",
"email": "acr@antoniocarlosribeiro.com"
"email": "acr@antoniocarlosribeiro.com",
"role": "Creator & Designer"
}
],
"description": "A One Time Password Authentication package, compatible with Google Authenticator.",
@ -2801,20 +2801,20 @@
"Two Factor Authentication",
"google2fa"
],
"time": "2019-03-19T22:44:16+00:00"
"time": "2019-09-11T19:19:55+00:00"
},
{
"name": "pragmarx/google2fa-laravel",
"version": "v1.0.1",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa-laravel.git",
"reference": "b5f5bc71dcc52c48720441bc01c701023bd82882"
"reference": "3b14f1fa2753c7f9bb5abb6504601662d836d104"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/antonioribeiro/google2fa-laravel/zipball/b5f5bc71dcc52c48720441bc01c701023bd82882",
"reference": "b5f5bc71dcc52c48720441bc01c701023bd82882",
"url": "https://api.github.com/repos/antonioribeiro/google2fa-laravel/zipball/3b14f1fa2753c7f9bb5abb6504601662d836d104",
"reference": "3b14f1fa2753c7f9bb5abb6504601662d836d104",
"shasum": ""
},
"require": {
@ -2823,8 +2823,8 @@
"pragmarx/google2fa-qrcode": "^1.0"
},
"require-dev": {
"orchestra/testbench": "3.4.*|3.5.*|3.6.*|3.7.*",
"phpunit/phpunit": "~5|~6|~7"
"orchestra/testbench": "3.4.*|3.5.*|3.6.*|3.7.*|4.*",
"phpunit/phpunit": "~5|~6|~7|~8"
},
"suggest": {
"bacon/bacon-qr-code": "Required to generate inline QR Codes.",
@ -2861,8 +2861,8 @@
"authors": [
{
"name": "Antonio Carlos Ribeiro",
"role": "Creator & Designer",
"email": "acr@antoniocarlosribeiro.com"
"email": "acr@antoniocarlosribeiro.com",
"role": "Creator & Designer"
}
],
"description": "A One Time Password Authentication package, compatible with Google Authenticator.",
@ -2872,7 +2872,7 @@
"google2fa",
"laravel"
],
"time": "2019-03-22T19:54:51+00:00"
"time": "2019-09-13T02:06:13+00:00"
},
{
"name": "pragmarx/google2fa-qrcode",
@ -5046,16 +5046,16 @@
},
{
"name": "tightenco/collect",
"version": "v6.0.0",
"version": "v6.0.2",
"source": {
"type": "git",
"url": "https://github.com/tightenco/collect.git",
"reference": "1793f44a9362b00a271de0776511726d9d952aed"
"reference": "e35230cde9e682881e9ac27105d0f26c32eca6d6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tightenco/collect/zipball/1793f44a9362b00a271de0776511726d9d952aed",
"reference": "1793f44a9362b00a271de0776511726d9d952aed",
"url": "https://api.github.com/repos/tightenco/collect/zipball/e35230cde9e682881e9ac27105d0f26c32eca6d6",
"reference": "e35230cde9e682881e9ac27105d0f26c32eca6d6",
"shasum": ""
},
"require": {
@ -5092,7 +5092,7 @@
"collection",
"laravel"
],
"time": "2019-08-30T16:33:17+00:00"
"time": "2019-09-09T14:07:34+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@ -5209,16 +5209,16 @@
},
{
"name": "vlucas/phpdotenv",
"version": "v3.5.0",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
"reference": "95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222"
"reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222",
"reference": "95cb0fa6c025f7f0db7fc60f81e9fb231eb2d222",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1bdf24f065975594f6a117f0f1f6cabf1333b156",
"reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156",
"shasum": ""
},
"require": {
@ -5227,12 +5227,12 @@
"symfony/polyfill-ctype": "^1.9"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0"
"phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.5-dev"
"dev-master": "3.6-dev"
}
},
"autoload": {
@ -5262,7 +5262,7 @@
"env",
"environment"
],
"time": "2019-08-27T17:00:38+00:00"
"time": "2019-09-10T21:37:39+00:00"
},
{
"name": "zendframework/zend-diactoros",
@ -5334,28 +5334,28 @@
"packages-dev": [
{
"name": "barryvdh/laravel-ide-helper",
"version": "v2.6.4",
"version": "v2.6.5",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git",
"reference": "16eb4f65ee0d51b1f1182d56ae28ee00a70ce75a"
"reference": "8740a9a158d3dd5cfc706a9d4cc1bf7a518f99f3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/16eb4f65ee0d51b1f1182d56ae28ee00a70ce75a",
"reference": "16eb4f65ee0d51b1f1182d56ae28ee00a70ce75a",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8740a9a158d3dd5cfc706a9d4cc1bf7a518f99f3",
"reference": "8740a9a158d3dd5cfc706a9d4cc1bf7a518f99f3",
"shasum": ""
},
"require": {
"barryvdh/reflection-docblock": "^2.0.6",
"composer/composer": "^1.6",
"doctrine/dbal": "~2.3",
"illuminate/console": "^5.5|^6",
"illuminate/filesystem": "^5.5|^6",
"illuminate/support": "^5.5|^6",
"php": ">=7"
},
"require-dev": {
"doctrine/dbal": "~2.3",
"illuminate/config": "^5.5|^6",
"illuminate/view": "^5.5|^6",
"phpro/grumphp": "^0.14",
@ -5363,9 +5363,6 @@
"scrutinizer/ocular": "~1.1",
"squizlabs/php_codesniffer": "^3"
},
"suggest": {
"doctrine/dbal": "Load information from the database about models for phpdocs (~2.3)"
},
"type": "library",
"extra": {
"branch-alias": {
@ -5404,7 +5401,7 @@
"phpstorm",
"sublime"
],
"time": "2019-09-03T17:51:13+00:00"
"time": "2019-09-08T09:56:38+00:00"
},
{
"name": "barryvdh/reflection-docblock",
@ -6237,18 +6234,18 @@
"authors": [
{
"name": "Arne Blankerts",
"role": "Developer",
"email": "arne@blankerts.de"
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"role": "Developer",
"email": "sebastian@phpeople.de"
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"role": "Developer",
"email": "sebastian@phpunit.de"
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
@ -6303,35 +6300,33 @@
},
{
"name": "phpdocumentor/reflection-common",
"version": "1.0.1",
"version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
"reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
"reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
"reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a",
"reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a",
"shasum": ""
},
"require": {
"php": ">=5.5"
"php": ">=7.1"
},
"require-dev": {
"phpunit/phpunit": "^4.6"
"phpunit/phpunit": "~6"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": [
"src"
]
"phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -6353,30 +6348,30 @@
"reflection",
"static analysis"
],
"time": "2017-09-11T18:02:19+00:00"
"time": "2018-08-07T13:53:10+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "4.3.1",
"version": "4.3.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c"
"reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c",
"reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
"reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
"shasum": ""
},
"require": {
"php": "^7.0",
"phpdocumentor/reflection-common": "^1.0.0",
"phpdocumentor/type-resolver": "^0.4.0",
"phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
"phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
"webmozart/assert": "^1.0"
},
"require-dev": {
"doctrine/instantiator": "~1.0.5",
"doctrine/instantiator": "^1.0.5",
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^6.4"
},
@ -6404,41 +6399,40 @@
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"time": "2019-04-30T17:48:53+00:00"
"time": "2019-09-12T14:27:41+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "0.4.0",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
"reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
"reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
"reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
"shasum": ""
},
"require": {
"php": "^5.5 || ^7.0",
"phpdocumentor/reflection-common": "^1.0"
"php": "^7.1",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
"mockery/mockery": "^0.9.4",
"phpunit/phpunit": "^5.2||^4.8.24"
"ext-tokenizer": "^7.1",
"mockery/mockery": "~1",
"phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": [
"src/"
]
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -6451,7 +6445,8 @@
"email": "me@mikevanriel.com"
}
],
"time": "2017-07-14T14:27:02+00:00"
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"time": "2019-08-22T18:11:29+00:00"
},
{
"name": "phpspec/prophecy",

View File

@ -125,7 +125,7 @@ return [
'is_demo_site' => false,
],
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
'version' => '4.8.1',
'version' => '4.8.1.1',
'api_version' => '0.10.2',
'db_version' => 11,
'maxUploadSize' => 15242880,

View File

@ -35,8 +35,10 @@ class ChangesFor3101 extends Migration
{
Schema::table(
'import_jobs',
function (Blueprint $table) {
$table->dropColumn('extended_status');
static function (Blueprint $table) {
if (Schema::hasColumn('import_jobs', 'extended_status')) {
$table->dropColumn('extended_status');
}
}
);
}
@ -50,8 +52,10 @@ class ChangesFor3101 extends Migration
{
Schema::table(
'import_jobs',
function (Blueprint $table) {
$table->text('extended_status')->nullable();
static function (Blueprint $table) {
if (!Schema::hasColumn('import_jobs', 'extended_status')) {
$table->text('extended_status')->nullable();
}
}
);
}

2
public/v1/js/app.js vendored

File diff suppressed because one or more lines are too long

View File

@ -183,51 +183,55 @@ function initializeButtons() {
function updateFormFields() {
if (transactionType === 'withdrawal') {
// hide source account name:
// $('#source_name_holder').hide(); // no longer used
// hide source ID for deposits
$('#deposit_source_id_holder').hide();
// show source account ID:
// show source ID for other transaction types
$('#source_id_holder').show();
// show destination name:
// $('#destination_name_holder').show(); // no longer used.
// show destination ID for withdrawal:
$('#withdrawal_destination_id_holder').show();
// hide destination ID:
// hide destination ID for other types
$('#destination_id_holder').hide();
// show budget
$('#budget_id_holder').show();
// hide piggy bank:
$('#piggy_bank_id_holder').hide();
}
if (transactionType === 'deposit') {
// $('#source_name_holder').show(); // no longer used
// show source ID for deposits
$('#deposit_source_id_holder').show();
// hide source ID for other transaction types
$('#source_id_holder').hide();
// $('#destination_name_holder').hide(); // no longer used
// hide destination ID for withdrawal:
$('#withdrawal_destination_id_holder').hide();
// show destination ID for other types:
$('#destination_id_holder').show();
// the rest
$('#budget_id_holder').hide();
$('#piggy_bank_id_holder').hide();
}
if (transactionType === 'transfer') {
// $('#source_name_holder').hide(); // no longer used
// hide source ID for deposits
$('#deposit_source_id_holder').hide();
// show source ID for others
$('#source_id_holder').show();
// $('#destination_name_holder').hide(); // no longer used
$('#withdrawal_destination_id_holder').show();
// hide destination ID for withdrawal
$('#withdrawal_destination_id_holder').hide();
// show destination ID for others
$('#destination_id_holder').show();
// the rest
$('#budget_id_holder').hide();
$('#piggy_bank_id_holder').show();
}

View File

@ -664,9 +664,12 @@
for (const fileKey in attachments[key].files) {
if (attachments[key].files.hasOwnProperty(fileKey) && /^0$|^[1-9]\d*$/.test(fileKey) && fileKey <= 4294967294) {
// include journal thing.
let transactions = response.data.data.attributes.transactions.reverse();
toBeUploaded.push(
{
journal: response.data.data.attributes.transactions[key].transaction_journal_id,
journal: transactions[key].transaction_journal_id,
file: attachments[key].files[fileKey]
}
);
@ -864,13 +867,13 @@
this.transactions[transactionIndex].errors.foreign_amount.concat(errors.errors[key]);
break;
}
}
// unique some things
this.transactions[transactionIndex].errors.source_account =
Array.from(new Set(this.transactions[transactionIndex].errors.source_account));
this.transactions[transactionIndex].errors.destination_account =
Array.from(new Set(this.transactions[transactionIndex].errors.destination_account));
// unique some things
this.transactions[transactionIndex].errors.source_account =
Array.from(new Set(this.transactions[transactionIndex].errors.source_account));
this.transactions[transactionIndex].errors.destination_account =
Array.from(new Set(this.transactions[transactionIndex].errors.destination_account));
}
}
}
},

View File

@ -58,7 +58,7 @@ return [
'no_rules_for_bill' => 'Αυτός ο λογαριασμός δεν έχει σχετιζόμενους κανόνες.',
'go_to_asset_accounts' => 'Δείτε τους αποταμιευτικούς λογαριασμούς σας',
'go_to_budgets' => 'Πηγαίνετε στους προϋπολογισμούς σας',
'clone_instructions' => 'To clone a transaction, search for the "store as new" checkbox in the edit screen',
'clone_instructions' => 'Για την κλωνοποίηση μιας συναλλαγής, αναζητήστε το πλαίσιο "αποθήκευση ως νέας" στην οθόνη τροποποίησης',
'go_to_categories' => 'Πηγαίνεται στης κατηγορίες σας',
'go_to_bills' => 'Πηγαίνετε στους λογαριασμούς σας',
'go_to_expense_accounts' => 'Δείτε τους λογαριασμούς εξόδων σας',
@ -124,8 +124,8 @@ return [
'sum_of_income' => 'Σύνολο εσόδων',
'liabilities' => 'Υποχρεώσεις',
'spent_in_specific_budget' => 'Ξοδεύτηκαν στον προϋπολογισμό ":budget"',
'spent_in_specific_double' => 'Spent in account(s) ":account"',
'earned_in_specific_double' => 'Earned in account(s) ":account"',
'spent_in_specific_double' => 'Ξοδεύτηκαν στον(ους) λογαριασμό(ούς) ":account"',
'earned_in_specific_double' => 'Κερδήθηκαν στον(ους) λογαριασμό(ούς): ":account"',
'source_account' => 'Source account',
'destination_account' => 'Destination account',
'sum_of_expenses_in_budget' => 'Ξοδεύτηκαν συνολικά στον προϋπολογισμό ":budget"',

View File

@ -37,7 +37,7 @@ return [
'linked_to_rules' => 'Σχετικοί κανόνες',
'active' => 'Είναι ενεργό;',
'percentage' => 'pct.',
'next_due' => 'Next due',
'next_due' => 'Επόμενη προθεσμία',
'transaction_type' => 'Τύπος',
'lastActivity' => 'Τελευταία δραστηριότητα',
'balanceDiff' => 'Διαφορά υπολοίπου',

View File

@ -37,12 +37,12 @@ return [
'linked_to_rules' => 'Règles applicables',
'active' => 'Actif ?',
'percentage' => 'pct.',
'next_due' => 'Next due',
'next_due' => 'Prochaine échéance',
'transaction_type' => 'Type',
'lastActivity' => 'Activité récente',
'balanceDiff' => 'Différence d\'équilibre',
'matchesOn' => 'Correspond à',
'other_meta_data' => 'Other meta data',
'other_meta_data' => 'Autres métadonnées',
'account_type' => 'Type de compte',
'created_at' => 'Créé le',
'account' => 'Compte',

View File

@ -39,7 +39,7 @@ return [
'reports' => 'Raporty',
'search_result' => 'Wyniki wyszukiwania dla ":query"',
'withdrawal_list' => 'Wydatki',
'Withdrawal_list' => 'Expenses',
'Withdrawal_list' => 'Wydatki',
'deposit_list' => 'Przychody, dochody oraz depozyty',
'transfer_list' => 'Transfery',
'transfers_list' => 'Transfery',

View File

@ -55,10 +55,10 @@ return [
'new_withdrawal' => 'Nowa wypłata',
'create_new_transaction' => 'Stwórz nową transakcję',
'new_transaction' => 'Nowa transakcja',
'no_rules_for_bill' => 'This bill has no rules associated to it.',
'no_rules_for_bill' => 'Ten rachunek nie ma przypisanych reguł.',
'go_to_asset_accounts' => 'Zobacz swoje konta aktywów',
'go_to_budgets' => 'Przejdź do swoich budżetów',
'clone_instructions' => 'To clone a transaction, search for the "store as new" checkbox in the edit screen',
'clone_instructions' => 'Aby sklonować transakcję, poszukaj pola wyboru "Zapisz jako nową" na ekranie edycji',
'go_to_categories' => 'Przejdź do swoich kategorii',
'go_to_bills' => 'Przejdź do swoich rachunków',
'go_to_expense_accounts' => 'Zobacz swoje konta wydatków',
@ -85,7 +85,7 @@ return [
'help_for_this_page' => 'Pomoc dla tej strony',
'no_help_could_be_found' => 'Nie znaleziono tekstu pomocy.',
'no_help_title' => 'Przepraszamy, wystąpił błąd.',
'two_factor_welcome' => 'Hello!',
'two_factor_welcome' => 'Cześć!',
'two_factor_enter_code' => 'Aby kontynuować, wprowadź kod uwierzytelniania dwuskładnikowego. Twoja aplikacja może wygenerować go dla Ciebie.',
'two_factor_code_here' => 'Wprowadź tutaj kod',
'two_factor_title' => 'Weryfikacja dwuskładnikowa',
@ -93,13 +93,13 @@ return [
'two_factor_forgot_title' => 'Utracone uwierzytelnianie dwuskładnikowe',
'two_factor_forgot' => 'Zapomniałem mojego uwierzytelnienia dwuskładnikowego.',
'two_factor_lost_header' => 'Straciłeś uwierzytelnianie dwuskładnikowe?',
'two_factor_lost_intro' => 'If you lost your backup codes as well, you have bad luck. This is not something you can fix from the web interface. You have two choices.',
'two_factor_lost_intro' => 'Jeżeli także nie masz kodów, to niestety nie masz szczęścia. To nie jest coś, co możemy naprawić z poziomu przeglądarki. Masz dwie opcje.',
'two_factor_lost_fix_self' => 'If you run your own instance of Firefly III, check the logs in <code>storage/logs</code> for instructions, or run <code>docker logs &lt;container_id&gt;</code> to see the instructions (refresh this page).',
'two_factor_lost_fix_owner' => 'W przeciwnym razie, powiadom właściciela strony, <a href="mailto::site_owner">:site_owner</a> i poproś go o zresetowanie Twojego uwierzytelnienia dwuskładnikowego.',
'mfa_backup_code' => 'You have used a backup code to login to Firefly III. It can\'t be used again, so cross it from your list.',
'pref_two_factor_new_backup_codes' => 'Get new backup codes',
'pref_two_factor_backup_code_count' => 'You have :count valid backup code(s).',
'2fa_i_have_them' => 'I stored them!',
'pref_two_factor_new_backup_codes' => 'Wygeneruj nowe kody zapasowe',
'pref_two_factor_backup_code_count' => 'Masz :count ważnych kodów zapasowych.',
'2fa_i_have_them' => 'Kody zapisane!',
'warning_much_data' => 'Załadowanie danych z :days dni może trochę potrwać.',
'registered' => 'Zarejestrowałeś się pomyślnie!',
'Default asset account' => 'Domyślne konto aktywów',
@ -124,10 +124,10 @@ return [
'sum_of_income' => 'Suma dochodów',
'liabilities' => 'Zobowiązania',
'spent_in_specific_budget' => 'Wydatki w budżecie ":budget"',
'spent_in_specific_double' => 'Spent in account(s) ":account"',
'earned_in_specific_double' => 'Earned in account(s) ":account"',
'source_account' => 'Source account',
'destination_account' => 'Destination account',
'spent_in_specific_double' => 'Wydano z kont(a) ":account"',
'earned_in_specific_double' => 'Zarobiono na konto(ta) ":account"',
'source_account' => 'Konto źródłowe',
'destination_account' => 'Konto docelowe',
'sum_of_expenses_in_budget' => 'Wydano łącznie w budżecie ":budget"',
'left_in_budget_limit' => 'Możliwe do wydania wg budżetu',
'current_period' => 'Bieżący okres',
@ -198,7 +198,7 @@ return [
'button_register' => 'Zarejestruj',
'authorization' => 'Autoryzacja',
'active_bills_only' => 'tylko aktywne rachunki',
'active_exp_bills_only' => 'active and expected bills only',
'active_exp_bills_only' => 'tylko aktywne i oczekiwane rachunki',
'average_per_bill' => 'średnia za rachunek',
'expected_total' => 'oczekiwana suma',
// API access
@ -239,13 +239,13 @@ return [
'search_modifier_amount_less' => 'Kwota jest mniejsza niż :value',
'search_modifier_amount_more' => 'Kwota jest większa niż :value',
'search_modifier_source' => 'Konto źródłowe to :value',
'search_modifier_from' => 'Source account is :value',
'search_modifier_from' => 'Konto źródłowe to :value',
'search_modifier_destination' => 'Konto docelowe to :value',
'search_modifier_to' => 'Destination account is :value',
'search_modifier_tag' => 'Tag is ":value"',
'search_modifier_category' => 'Category is ":value"',
'search_modifier_budget' => 'Budget is ":value"',
'search_modifier_bill' => 'Bill is ":value"',
'search_modifier_to' => 'Konto docelowe to :value',
'search_modifier_tag' => 'Tag to ":value"',
'search_modifier_category' => 'Kategoria to ":value"',
'search_modifier_budget' => 'Budżet to ":value"',
'search_modifier_bill' => 'Rachunek to ":value"',
'search_modifier_type' => 'Transakcja jest typu :value',
'search_modifier_date' => 'Data transakcji to :value',
'search_modifier_date_before' => 'Data transakcji jest przed :value',
@ -498,10 +498,10 @@ return [
'pref_two_factor_auth_code_help' => 'Zeskanuj kod QR za pomocą aplikacji w telefonie, takiej jak Authy lub Google Authenticator i wprowadź wygenerowany kod.',
'pref_two_factor_auth_reset_code' => 'Zresetuj kod weryfikacyjny',
'pref_two_factor_auth_disable_2fa' => 'Wyłącz weryfikację dwuetapową',
'2fa_use_secret_instead' => 'If you cannot scan the QR code, feel free to use the secret instead: <code>:secret</code>.',
'2fa_backup_codes' => 'Store these backup codes for access in case you lose your device.',
'2fa_already_enabled' => '2-step verification is already enabled.',
'wrong_mfa_code' => 'This MFA code is not valid.',
'2fa_use_secret_instead' => 'Jeżeli nie możesz zeskanować kodu QR użyj sekretu: <code>:secret</code>.',
'2fa_backup_codes' => 'Zachowaj te kody na wypadek zgubienia urządzenia.',
'2fa_already_enabled' => 'Uwierzytelnianie dwuskładnikowe jest już aktywne.',
'wrong_mfa_code' => 'Ten kod uwierzytelniania nie jest prawidłowy.',
'pref_save_settings' => 'Zapisz ustawienia',
'saved_preferences' => 'Preferencje zostały zapisane!',
'preferences_general' => 'Ogólne',
@ -579,7 +579,7 @@ return [
'update_attachment' => 'Aktualizuj załącznik',
'delete_attachment' => 'Usuń załącznik ":name"',
'attachment_deleted' => 'Usunięto załącznik ":name"',
'liabilities_deleted' => 'Deleted liability ":name"',
'liabilities_deleted' => 'Usunięto zobowiązanie ":name"',
'attachment_updated' => 'Zmodyfikowano załącznik ":name"',
'upload_max_file_size' => 'Maksymalny rozmiar pliku to: :size',
'list_all_attachments' => 'Lista wszystkich załączników',
@ -646,7 +646,7 @@ return [
'update_currency' => 'Modyfikuj walutę',
'new_default_currency' => ':name jest teraz domyślną walutą.',
'cannot_delete_currency' => 'Nie można usunąć waluty :name, ponieważ jest ona nadal używana.',
'cannot_disable_currency_journals' => 'Cannot disable :name because transactions are still using it.',
'cannot_disable_currency_journals' => 'Nie można wyłączyć :name ponieważ istnieją powiązane transakcje.',
'cannot_disable_currency_last_left' => 'Cannot disable :name because it is the last enabled currency.',
'cannot_disable_currency_account_meta' => 'Cannot disable :name because it is used in asset accounts.',
'cannot_disable_currency_bills' => 'Cannot disable :name because it is used in bills.',
@ -800,7 +800,7 @@ return [
'reconcile_options' => 'Opcje uzgadniania',
'reconcile_range' => 'Zakres rozrachunku',
'start_reconcile' => 'Rozpocznij uzgadnianie',
'cash_account_type' => 'Cash',
'cash_account_type' => 'Gotówka',
'cash' => 'gotówka',
'cant_find_redirect_account' => 'Firefly III tried to redirect you but couldn\'t. Sorry about that. Back to the index.',
'account_type' => 'Typ konta',

View File

@ -30,7 +30,7 @@ return [
'index_help' => 'Jeśli potrzebujesz pomocy na stronie lub formularzu, naciśnij ten przycisk.',
'index_outro' => 'Większość stron z Firefly III zacznie się od małego wprowadzenia jak to. Skontaktuj się ze mną, jeśli masz pytania lub komentarze. Miłego korzystania!',
'index_sidebar-toggle' => 'Aby utworzyć nowe transakcje, konta lub inne rzeczy, użyj menu pod tą ikoną.',
'index_cash_account' => 'These are the accounts created so far. You can use the cash account to track cash expenses but it\'s not mandatory of course.',
'index_cash_account' => 'To są dotychczas utworzone konta. Możesz użyć konta gotówkowego do śledzenia wydatków gotówkowych, ale oczywiście nie jest to obowiązkowe.',
// transactions (withdrawal)
'transactions_create_withdrawal_source' => 'Select your favorite asset account or liability from this dropdown.',

View File

@ -58,7 +58,7 @@ return [
'no_rules_for_bill' => 'Esta conta não tem regras associadas a ela.',
'go_to_asset_accounts' => 'Veja suas contas ativas',
'go_to_budgets' => 'Vá para seus orçamentos',
'clone_instructions' => 'To clone a transaction, search for the "store as new" checkbox in the edit screen',
'clone_instructions' => 'Para clonar uma transação, procure pela caixa de seleção "salvar como nova" na tela de edição',
'go_to_categories' => 'Vá para suas categorias',
'go_to_bills' => 'Vá para suas faturas',
'go_to_expense_accounts' => 'Veja suas despesas',

View File

@ -42,7 +42,7 @@ return [
'lastActivity' => 'Последняя активность',
'balanceDiff' => 'Разность баланса',
'matchesOn' => 'Совпадает на',
'other_meta_data' => 'Other meta data',
'other_meta_data' => 'Другие метаданные',
'account_type' => 'Тип профиля',
'created_at' => 'Создан',
'account' => 'Счёт',

View File

@ -101,7 +101,7 @@
{# destination account name for withdrawals #}
{#{{ ExpandedForm.text('destination_name', null, {label: trans('form.expense_account')}) }} #}
{# for withdrawals, also a drop down with expense accounts, loans, debts, mortgages or (cash). #}
{# NEW for withdrawals, also a drop down with expense accounts, loans, debts, mortgages or (cash). #}
{{ AccountForm.activeWithdrawalDestinations('withdrawal_destination_id', null, {label: trans('form.withdrawal_destination_id')}) }}
</div>
</div>

View File

@ -77,21 +77,38 @@
</td>
<td class="hide-balance_before" style="text-align: right;">
{{ formatAmountBySymbol(journal.balance_before, journal.currency_symbol, journal.currency_decimal_places) }}
{{ formatAmountBySymbol(journal.balance_before, auditData[account.id].currency.symbol, auditData[account.id].currency.decimal_places) }}
</td>
<td class="hide-amount" style="text-align: right;">
{% if account.id == journal.destination_account_id and journal.transaction_type_type == 'Opening balance' %}
{{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% elseif account.id == journal.destination_account_id and journal.transaction_type_type == 'Deposit' %}
{{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% else %}
{{ formatAmountBySymbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places) }}
{% if auditData[account.id].currency.id == journal.currency_id %}
{% if account.id == journal.destination_account_id and journal.transaction_type_type == 'Opening balance' %}
{{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% elseif account.id == journal.destination_account_id and journal.transaction_type_type == 'Deposit' %}
{{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% elseif account.id == journal.destination_account_id and journal.transaction_type_type == 'Transfer' %}
{{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% else %}
{{ formatAmountBySymbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places) }}
{% endif %}
{% endif %}
{% if auditData[account.id].currency.id == journal.foreign_currency_id %}
{% if account.id == journal.destination_account_id and journal.transaction_type_type == 'Opening balance' %}
{{ formatAmountBySymbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}
{% elseif account.id == journal.destination_account_id and journal.transaction_type_type == 'Deposit' %}
{{ formatAmountBySymbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}
{% elseif account.id == journal.destination_account_id and journal.transaction_type_type == 'Transfer' %}
{{ formatAmountBySymbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}
{% else %}
{{ formatAmountBySymbol(journal.foreign_amount, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}
{% endif %}
{% endif %}
</td>
<td class="hide-balance_after" style="text-align: right;">
{{ formatAmountBySymbol(journal.balance_after, journal.currency_symbol, journal.currency_decimal_places) }}
{{ formatAmountBySymbol(journal.balance_after, auditData[account.id].currency.symbol, auditData[account.id].currency.decimal_places) }}
</td>
<td class="hide-date">{{ journal.date.formatLocalized(monthAndDayFormat) }}</td>

View File

@ -121,7 +121,8 @@
var edit_bulk_selected_txt = "{{ trans('firefly.bulk_edit')|escape('js') }}";
var searchQuery = "{{ fullQuery|escape('js') }}";
var searchUri = "{{ route('search.search') }}";
var searchUri = "{{ route('search.search') }}?page={{ page }}";
var searchPage = {{ page }};
</script>
{# required for groups.twig #}
<script type="text/javascript" src="v1/js/ff/list/groups.js?v={{ FF_VERSION }}"></script>

View File

@ -1,6 +1,10 @@
<p>
<p class="search_count">
{{ trans('firefly.search_found_transactions', {count: groups.count, time: searchTime}) }}
{% if hasPages %}
{{ trans('firefly.search_found_transactions', {count: '>'~groups.perPage, time: searchTime}) }}
{% else %}
{{ trans('firefly.search_found_transactions', {count: groups.count, time: searchTime}) }}
{% endif %}
</p>
{% include 'list.groups' %}