Allow unreconcile and expand API to block reconciled transactions.

This commit is contained in:
James Cole 2023-10-22 18:44:30 +02:00
parent a86a582d0f
commit 2c34bd36a5
No known key found for this signature in database
GPG Key ID: B49A324B7EAD6D80
50 changed files with 1267 additions and 1046 deletions

View File

@ -417,15 +417,22 @@ class UpdateRequest extends FormRequest
// all transaction types must be equal: // all transaction types must be equal:
$this->validateTransactionTypesForUpdate($validator); $this->validateTransactionTypesForUpdate($validator);
// user wants to update a reconciled transaction.
// source, destination, amount + foreign_amount cannot be changed
// and must be omitted from the request.
$this->preventUpdateReconciled($validator, $transactionGroup);
// validate source/destination is equal, depending on the transaction journal type. // validate source/destination is equal, depending on the transaction journal type.
$this->validateEqualAccountsForUpdate($validator, $transactionGroup); $this->validateEqualAccountsForUpdate($validator, $transactionGroup);
// a catch when users submit splits with no source or destination info at all. // see method:
$this->preventNoAccountInfo($validator, ); //$this->preventNoAccountInfo($validator, );
// validate that the currency fits the source and/or destination account. // validate that the currency fits the source and/or destination account.
// validate all account info // validate all account info
$this->validateAccountInformationUpdate($validator, $transactionGroup); $this->validateAccountInformationUpdate($validator, $transactionGroup);
} }
); );
} }

View File

@ -25,8 +25,11 @@ namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector; use Illuminate\Routing\Redirector;
use Illuminate\View\View; use Illuminate\View\View;
@ -36,8 +39,11 @@ use Illuminate\View\View;
*/ */
class EditController extends Controller class EditController extends Controller
{ {
private JournalRepositoryInterface $repository;
/** /**
* EditController constructor. * IndexController constructor.
* *
*/ */
@ -45,17 +51,30 @@ class EditController extends Controller
{ {
parent::__construct(); parent::__construct();
// some useful repositories: // translations:
$this->middleware( $this->middleware(
static function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.transactions')); app('view')->share('title', (string)trans('firefly.transactions'));
app('view')->share('mainTitleIcon', 'fa-exchange'); app('view')->share('mainTitleIcon', 'fa-exchange');
$this->repository = app(JournalRepositoryInterface::class);
return $next($request); return $next($request);
} }
); );
} }
/**
* @param TransactionJournal $journal
*
* @return JsonResponse
*/
public function unreconcile(TransactionJournal $journal): JsonResponse
{
$this->repository->unreconcileById($journal->id);
return response()->json([], 204);
}
/** /**
* @param TransactionGroup $transactionGroup * @param TransactionGroup $transactionGroup
* *

View File

@ -46,7 +46,7 @@ use Illuminate\Support\Collection;
class JournalRepository implements JournalRepositoryInterface class JournalRepository implements JournalRepositoryInterface
{ {
/** @var User */ /** @var User */
private $user; private User $user;
/** /**
* @param TransactionGroup $transactionGroup * @param TransactionGroup $transactionGroup
@ -334,4 +334,14 @@ class JournalRepository implements JournalRepositoryInterface
return $journal; return $journal;
} }
/**
* @inheritDoc
*/
public function unreconcileById(int $journalId): void
{
/** @var TransactionJournal $journal */
$journal = $this->user->transactionJournals()->find($journalId);
$journal?->transactions()->update(['reconciled' => false]);
}
} }

View File

@ -133,6 +133,13 @@ interface JournalRepositoryInterface
*/ */
public function reconcileById(int $journalId): void; public function reconcileById(int $journalId): void;
/**
* TODO Maybe to account repository? Do this wen reconcile is API only.
*
* @param int $journalId
*/
public function unreconcileById(int $journalId): void;
/** /**
* Search in journal descriptions. * Search in journal descriptions.
* *

View File

@ -25,7 +25,9 @@ declare(strict_types=1);
namespace FireflyIII\Validation; namespace FireflyIII\Validation;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
@ -37,6 +39,50 @@ use Illuminate\Validation\Validator;
trait GroupValidation trait GroupValidation
{ {
/** /**
* @param Validator $validator
* @param TransactionGroup $transactionGroup
*
* @return void
*/
protected function preventUpdateReconciled(Validator $validator, TransactionGroup $transactionGroup): void
{
app('log')->debug(sprintf('Now in %s', __METHOD__));
$count = Transaction
::leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id')
->leftJoin('transaction_groups', 'transaction_groups.id', 'transaction_journals.transaction_group_id')
->where('transaction_journals.transaction_group_id', $transactionGroup->id)
->where('transactions.reconciled', 1)->where('transactions.amount', '<', 0)->count(['transactions.id']);
if (0 === $count) {
app('log')->debug(sprintf('Transaction is not reconciled, done with %s', __METHOD__));
return;
}
$data = $validator->getData();
$forbidden = ['amount','foreign_amount','currency_code','currency_id','foreign_currency_code','foreign_currency_id',
'source_id','source_name','source_number','source_iban',
'destination_id','destination_name','destination_number','destination_iban',
];
foreach($data['transactions'] as $index => $row) {
foreach($forbidden as $key) {
if(array_key_exists($key, $row)) {
$validator->errors()->add(
sprintf('transactions.%d.%s', $index, $key),
(string)trans('validation.reconciled_forbidden_field', ['field' => $key])
);
}
}
}
app('log')->debug(sprintf('Done with %s', __METHOD__));
}
/**
* A catch when users submit splits with no source or destination info at all.
*
* TODO This should prevent errors down the road but I'm not yet sure what I'm validating here
* TODO so I disabled this on 2023-10-22 to see if it causes any issues.
*
* @param Validator $validator * @param Validator $validator
* *
* @throws FireflyException * @throws FireflyException

View File

@ -376,6 +376,11 @@ trait TransactionValidation
public function validateAccountInformationUpdate(Validator $validator, TransactionGroup $transactionGroup): void public function validateAccountInformationUpdate(Validator $validator, TransactionGroup $transactionGroup): void
{ {
Log::debug('Now in validateAccountInformationUpdate()'); Log::debug('Now in validateAccountInformationUpdate()');
if ($validator->errors()->count() > 0) {
Log::debug('Validator already has errors, so return.');
return;
}
$transactions = $this->getTransactionsArray($validator); $transactions = $this->getTransactionsArray($validator);
/** /**
@ -699,6 +704,11 @@ trait TransactionValidation
*/ */
private function validateEqualAccountsForUpdate(Validator $validator, TransactionGroup $transactionGroup): void private function validateEqualAccountsForUpdate(Validator $validator, TransactionGroup $transactionGroup): void
{ {
if ($validator->errors()->count() > 0) {
Log::debug('Validator already has errors, so return.');
return;
}
Log::debug('Now in validateEqualAccountsForUpdate()'); Log::debug('Now in validateEqualAccountsForUpdate()');
$transactions = $this->getTransactionsArray($validator); $transactions = $this->getTransactionsArray($validator);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u041a\u0430\u043a\u0432\u043e \u0441\u0435 \u0441\u043b\u0443\u0447\u0432\u0430?", "welcome_back": "\u041a\u0430\u043a\u0432\u043e \u0441\u0435 \u0441\u043b\u0443\u0447\u0432\u0430?",
"flash_error": "\u0413\u0440\u0435\u0448\u043a\u0430!", "flash_error": "\u0413\u0440\u0435\u0448\u043a\u0430!",
"flash_warning": "\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!",
"flash_success": "\u0423\u0441\u043f\u0435\u0445!", "flash_success": "\u0423\u0441\u043f\u0435\u0445!",
"close": "\u0417\u0430\u0442\u0432\u043e\u0440\u0438", "close": "\u0417\u0430\u0442\u0432\u043e\u0440\u0438",
"split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f", "split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f",
@ -29,6 +30,7 @@
"submit": "\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438", "submit": "\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438",
"amount": "\u0421\u0443\u043c\u0430", "amount": "\u0421\u0443\u043c\u0430",
"date": "\u0414\u0430\u0442\u0430", "date": "\u0414\u0430\u0442\u0430",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u0415\u0442\u0438\u043a\u0435\u0442\u0438", "tags": "\u0415\u0442\u0438\u043a\u0435\u0442\u0438",
"no_budget": "(\u0431\u0435\u0437 \u0431\u044e\u0434\u0436\u0435\u0442)", "no_budget": "(\u0431\u0435\u0437 \u0431\u044e\u0434\u0436\u0435\u0442)",
"no_bill": "(\u043d\u044f\u043c\u0430 \u0441\u043c\u0435\u0442\u043a\u0430)", "no_bill": "(\u043d\u044f\u043c\u0430 \u0441\u043c\u0435\u0442\u043a\u0430)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Qu\u00e8 est\u00e0 passant?", "welcome_back": "Qu\u00e8 est\u00e0 passant?",
"flash_error": "Error!", "flash_error": "Error!",
"flash_warning": "Atenci\u00f3!",
"flash_success": "\u00c8xit!", "flash_success": "\u00c8xit!",
"close": "Tancar", "close": "Tancar",
"split_transaction_title": "Descripci\u00f3 de la transacci\u00f3 dividida", "split_transaction_title": "Descripci\u00f3 de la transacci\u00f3 dividida",
@ -29,6 +30,7 @@
"submit": "Enviar", "submit": "Enviar",
"amount": "Import", "amount": "Import",
"date": "Data", "date": "Data",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiquetes", "tags": "Etiquetes",
"no_budget": "(cap pressupost)", "no_budget": "(cap pressupost)",
"no_bill": "(cap factura)", "no_bill": "(cap factura)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Jak to jde?", "welcome_back": "Jak to jde?",
"flash_error": "Chyba!", "flash_error": "Chyba!",
"flash_warning": "Varov\u00e1n\u00ed!",
"flash_success": "\u00dasp\u011b\u0161n\u011b dokon\u010deno!", "flash_success": "\u00dasp\u011b\u0161n\u011b dokon\u010deno!",
"close": "Zav\u0159\u00edt", "close": "Zav\u0159\u00edt",
"split_transaction_title": "Popis roz\u00fa\u010dtov\u00e1n\u00ed", "split_transaction_title": "Popis roz\u00fa\u010dtov\u00e1n\u00ed",
@ -29,6 +30,7 @@
"submit": "Odeslat", "submit": "Odeslat",
"amount": "\u010c\u00e1stka", "amount": "\u010c\u00e1stka",
"date": "Datum", "date": "Datum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u0160t\u00edtky", "tags": "\u0160t\u00edtky",
"no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)", "no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Hvad spiller?", "welcome_back": "Hvad spiller?",
"flash_error": "Fejl!", "flash_error": "Fejl!",
"flash_warning": "Advarsel!",
"flash_success": "Succes!", "flash_success": "Succes!",
"close": "Luk", "close": "Luk",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit", "submit": "Submit",
"amount": "Bel\u00f8b", "amount": "Bel\u00f8b",
"date": "Date", "date": "Date",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiketter", "tags": "Etiketter",
"no_budget": "(no budget)", "no_budget": "(no budget)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u00dcberblick", "welcome_back": "\u00dcberblick",
"flash_error": "Fehler!", "flash_error": "Fehler!",
"flash_warning": "Achtung!",
"flash_success": "Geschafft!", "flash_success": "Geschafft!",
"close": "Schlie\u00dfen", "close": "Schlie\u00dfen",
"split_transaction_title": "Beschreibung der Splittbuchung", "split_transaction_title": "Beschreibung der Splittbuchung",
@ -29,6 +30,7 @@
"submit": "Absenden", "submit": "Absenden",
"amount": "Betrag", "amount": "Betrag",
"date": "Datum", "date": "Datum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Schlagw\u00f6rter", "tags": "Schlagw\u00f6rter",
"no_budget": "(kein Budget)", "no_budget": "(kein Budget)",
"no_bill": "(keine Belege)", "no_bill": "(keine Belege)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u03a4\u03b9 \u03c0\u03b1\u03af\u03b6\u03b5\u03b9;", "welcome_back": "\u03a4\u03b9 \u03c0\u03b1\u03af\u03b6\u03b5\u03b9;",
"flash_error": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1!", "flash_error": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1!",
"flash_warning": "\u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae!",
"flash_success": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1!", "flash_success": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1!",
"close": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf", "close": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf",
"split_transaction_title": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc", "split_transaction_title": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc",
@ -29,6 +30,7 @@
"submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae", "submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae",
"amount": "\u03a0\u03bf\u03c3\u03cc", "amount": "\u03a0\u03bf\u03c3\u03cc",
"date": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1", "date": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b5\u03c2", "tags": "\u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b5\u03c2",
"no_budget": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc)", "no_budget": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc)",
"no_bill": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03ac\u03b3\u03b9\u03bf \u03ad\u03be\u03bf\u03b4\u03bf)", "no_bill": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03ac\u03b3\u03b9\u03bf \u03ad\u03be\u03bf\u03b4\u03bf)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "What's playing?", "welcome_back": "What's playing?",
"flash_error": "Error!", "flash_error": "Error!",
"flash_warning": "Warning!",
"flash_success": "Success!", "flash_success": "Success!",
"close": "Close", "close": "Close",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit", "submit": "Submit",
"amount": "Amount", "amount": "Amount",
"date": "Date", "date": "Date",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tags", "tags": "Tags",
"no_budget": "(no budget)", "no_budget": "(no budget)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "What's playing?", "welcome_back": "What's playing?",
"flash_error": "Error!", "flash_error": "Error!",
"flash_warning": "Warning!",
"flash_success": "Success!", "flash_success": "Success!",
"close": "Close", "close": "Close",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit", "submit": "Submit",
"amount": "Amount", "amount": "Amount",
"date": "Date", "date": "Date",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tags", "tags": "Tags",
"no_budget": "(no budget)", "no_budget": "(no budget)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?", "welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?",
"flash_error": "\u00a1Error!", "flash_error": "\u00a1Error!",
"flash_warning": "\u00a1Atenci\u00f3n!",
"flash_success": "\u00a1Operaci\u00f3n correcta!", "flash_success": "\u00a1Operaci\u00f3n correcta!",
"close": "Cerrar", "close": "Cerrar",
"split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida", "split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida",
@ -29,6 +30,7 @@
"submit": "Enviar", "submit": "Enviar",
"amount": "Cantidad", "amount": "Cantidad",
"date": "Fecha", "date": "Fecha",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiquetas", "tags": "Etiquetas",
"no_budget": "(sin presupuesto)", "no_budget": "(sin presupuesto)",
"no_bill": "(sin factura)", "no_bill": "(sin factura)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Mit\u00e4 kuuluu?", "welcome_back": "Mit\u00e4 kuuluu?",
"flash_error": "Virhe!", "flash_error": "Virhe!",
"flash_warning": "Varoitus!",
"flash_success": "Valmista tuli!", "flash_success": "Valmista tuli!",
"close": "Sulje", "close": "Sulje",
"split_transaction_title": "Jaetun tapahtuman kuvaus", "split_transaction_title": "Jaetun tapahtuman kuvaus",
@ -29,6 +30,7 @@
"submit": "Vahvista", "submit": "Vahvista",
"amount": "Summa", "amount": "Summa",
"date": "P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4", "date": "P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "T\u00e4git", "tags": "T\u00e4git",
"no_budget": "(ei budjettia)", "no_budget": "(ei budjettia)",
"no_bill": "(ei laskua)", "no_bill": "(ei laskua)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Quoi de neuf ?", "welcome_back": "Quoi de neuf ?",
"flash_error": "Erreur !", "flash_error": "Erreur !",
"flash_warning": "Attention !",
"flash_success": "Super !", "flash_success": "Super !",
"close": "Fermer", "close": "Fermer",
"split_transaction_title": "Description de l'op\u00e9ration ventil\u00e9e", "split_transaction_title": "Description de l'op\u00e9ration ventil\u00e9e",
@ -29,6 +30,7 @@
"submit": "Soumettre", "submit": "Soumettre",
"amount": "Montant", "amount": "Montant",
"date": "Date", "date": "Date",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tags", "tags": "Tags",
"no_budget": "(pas de budget)", "no_budget": "(pas de budget)",
"no_bill": "(aucune facture)", "no_bill": "(aucune facture)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Mi a helyzet?", "welcome_back": "Mi a helyzet?",
"flash_error": "Hiba!", "flash_error": "Hiba!",
"flash_warning": "Figyelmeztet\u00e9s!",
"flash_success": "Siker!", "flash_success": "Siker!",
"close": "Bez\u00e1r\u00e1s", "close": "Bez\u00e1r\u00e1s",
"split_transaction_title": "Felosztott tranzakci\u00f3 le\u00edr\u00e1sa", "split_transaction_title": "Felosztott tranzakci\u00f3 le\u00edr\u00e1sa",
@ -29,6 +30,7 @@
"submit": "Bek\u00fcld\u00e9s", "submit": "Bek\u00fcld\u00e9s",
"amount": "\u00d6sszeg", "amount": "\u00d6sszeg",
"date": "D\u00e1tum", "date": "D\u00e1tum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "C\u00edmk\u00e9k", "tags": "C\u00edmk\u00e9k",
"no_budget": "(nincs k\u00f6lts\u00e9gkeret)", "no_budget": "(nincs k\u00f6lts\u00e9gkeret)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Apa yang sedang dimainkan?", "welcome_back": "Apa yang sedang dimainkan?",
"flash_error": "Kesalahan!", "flash_error": "Kesalahan!",
"flash_warning": "PERINGATAN!",
"flash_success": "Keberhasilan!", "flash_success": "Keberhasilan!",
"close": "Dekat", "close": "Dekat",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Menyerahkan", "submit": "Menyerahkan",
"amount": "Jumlah", "amount": "Jumlah",
"date": "Tanggal", "date": "Tanggal",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tag", "tags": "Tag",
"no_budget": "(no budget)", "no_budget": "(no budget)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "La tua situazione finanziaria", "welcome_back": "La tua situazione finanziaria",
"flash_error": "Errore!", "flash_error": "Errore!",
"flash_warning": "Avviso!",
"flash_success": "Successo!", "flash_success": "Successo!",
"close": "Chiudi", "close": "Chiudi",
"split_transaction_title": "Descrizione della transazione suddivisa", "split_transaction_title": "Descrizione della transazione suddivisa",
@ -29,6 +30,7 @@
"submit": "Invia", "submit": "Invia",
"amount": "Importo", "amount": "Importo",
"date": "Data", "date": "Data",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etichette", "tags": "Etichette",
"no_budget": "(nessun budget)", "no_budget": "(nessun budget)",
"no_bill": "(nessuna bolletta)", "no_bill": "(nessuna bolletta)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u6982\u8981", "welcome_back": "\u6982\u8981",
"flash_error": "\u30a8\u30e9\u30fc\uff01", "flash_error": "\u30a8\u30e9\u30fc\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\u3057\u307e\u3057\u305f\uff01", "flash_success": "\u6210\u529f\u3057\u307e\u3057\u305f\uff01",
"close": "\u9589\u3058\u308b", "close": "\u9589\u3058\u308b",
"split_transaction_title": "\u5206\u5272\u53d6\u5f15\u306e\u6982\u8981", "split_transaction_title": "\u5206\u5272\u53d6\u5f15\u306e\u6982\u8981",
@ -29,6 +30,7 @@
"submit": "\u9001\u4fe1", "submit": "\u9001\u4fe1",
"amount": "\u91d1\u984d", "amount": "\u91d1\u984d",
"date": "\u65e5\u4ed8", "date": "\u65e5\u4ed8",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u30bf\u30b0", "tags": "\u30bf\u30b0",
"no_budget": "(\u4e88\u7b97\u306a\u3057)", "no_budget": "(\u4e88\u7b97\u306a\u3057)",
"no_bill": "(\u8acb\u6c42\u306a\u3057)", "no_bill": "(\u8acb\u6c42\u306a\u3057)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\ubb34\uc2a8 \uc77c\uc774\uc8e0?", "welcome_back": "\ubb34\uc2a8 \uc77c\uc774\uc8e0?",
"flash_error": "\uc624\ub958!", "flash_error": "\uc624\ub958!",
"flash_warning": "\uacbd\uace0!",
"flash_success": "\uc131\uacf5!", "flash_success": "\uc131\uacf5!",
"close": "\ub2eb\uae30", "close": "\ub2eb\uae30",
"split_transaction_title": "\ubd84\ud560 \uac70\ub798\uc5d0 \ub300\ud55c \uc124\uba85", "split_transaction_title": "\ubd84\ud560 \uac70\ub798\uc5d0 \ub300\ud55c \uc124\uba85",
@ -29,6 +30,7 @@
"submit": "\uc81c\ucd9c", "submit": "\uc81c\ucd9c",
"amount": "\uae08\uc561", "amount": "\uae08\uc561",
"date": "\ub0a0\uc9dc", "date": "\ub0a0\uc9dc",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\ud0dc\uadf8", "tags": "\ud0dc\uadf8",
"no_budget": "(\uc608\uc0b0 \uc5c6\uc74c)", "no_budget": "(\uc608\uc0b0 \uc5c6\uc74c)",
"no_bill": "(\uccad\uad6c\uc11c \uc5c6\uc74c)", "no_bill": "(\uccad\uad6c\uc11c \uc5c6\uc74c)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Hvordan g\u00e5r det?", "welcome_back": "Hvordan g\u00e5r det?",
"flash_error": "Feil!", "flash_error": "Feil!",
"flash_warning": "Advarsel!",
"flash_success": "Suksess!", "flash_success": "Suksess!",
"close": "Lukk", "close": "Lukk",
"split_transaction_title": "Beskrivelse av den splittende transaksjon", "split_transaction_title": "Beskrivelse av den splittende transaksjon",
@ -29,6 +30,7 @@
"submit": "Send inn", "submit": "Send inn",
"amount": "Bel\u00f8p", "amount": "Bel\u00f8p",
"date": "Dato", "date": "Dato",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tagger", "tags": "Tagger",
"no_budget": "(ingen budsjett)", "no_budget": "(ingen budsjett)",
"no_bill": "(ingen regning)", "no_bill": "(ingen regning)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Hoe staat het er voor?", "welcome_back": "Hoe staat het er voor?",
"flash_error": "Fout!", "flash_error": "Fout!",
"flash_warning": "Waarschuwing!",
"flash_success": "Gelukt!", "flash_success": "Gelukt!",
"close": "Sluiten", "close": "Sluiten",
"split_transaction_title": "Beschrijving van de gesplitste transactie", "split_transaction_title": "Beschrijving van de gesplitste transactie",
@ -29,6 +30,7 @@
"submit": "Invoeren", "submit": "Invoeren",
"amount": "Bedrag", "amount": "Bedrag",
"date": "Datum", "date": "Datum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tags", "tags": "Tags",
"no_budget": "(geen budget)", "no_budget": "(geen budget)",
"no_bill": "(geen contract)", "no_bill": "(geen contract)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Korleis g\u00e5r det?", "welcome_back": "Korleis g\u00e5r det?",
"flash_error": "Feil!", "flash_error": "Feil!",
"flash_warning": "Advarsel!",
"flash_success": "Suksess!", "flash_success": "Suksess!",
"close": "Lukk", "close": "Lukk",
"split_transaction_title": "Beskrivinga av den splitta transaksjonen", "split_transaction_title": "Beskrivinga av den splitta transaksjonen",
@ -29,6 +30,7 @@
"submit": "Send inn", "submit": "Send inn",
"amount": "Bel\u00f8p", "amount": "Bel\u00f8p",
"date": "Dato", "date": "Dato",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "N\u00f8kkelord", "tags": "N\u00f8kkelord",
"no_budget": "(ingen budsjett)", "no_budget": "(ingen budsjett)",
"no_bill": "(ingen rekning)", "no_bill": "(ingen rekning)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Co jest grane?", "welcome_back": "Co jest grane?",
"flash_error": "B\u0142\u0105d!", "flash_error": "B\u0142\u0105d!",
"flash_warning": "Ostrze\u017cenie!",
"flash_success": "Sukces!", "flash_success": "Sukces!",
"close": "Zamknij", "close": "Zamknij",
"split_transaction_title": "Opis podzielonej transakcji", "split_transaction_title": "Opis podzielonej transakcji",
@ -29,6 +30,7 @@
"submit": "Prze\u015blij", "submit": "Prze\u015blij",
"amount": "Kwota", "amount": "Kwota",
"date": "Data", "date": "Data",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tagi", "tags": "Tagi",
"no_budget": "(brak bud\u017cetu)", "no_budget": "(brak bud\u017cetu)",
"no_bill": "(brak rachunku)", "no_bill": "(brak rachunku)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "O que est\u00e1 acontecendo?", "welcome_back": "O que est\u00e1 acontecendo?",
"flash_error": "Erro!", "flash_error": "Erro!",
"flash_warning": "Aten\u00e7\u00e3o!",
"flash_success": "Sucesso!", "flash_success": "Sucesso!",
"close": "Fechar", "close": "Fechar",
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida", "split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
@ -29,6 +30,7 @@
"submit": "Enviar", "submit": "Enviar",
"amount": "Valor", "amount": "Valor",
"date": "Data", "date": "Data",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Tags", "tags": "Tags",
"no_budget": "(sem or\u00e7amento)", "no_budget": "(sem or\u00e7amento)",
"no_bill": "(sem fatura)", "no_bill": "(sem fatura)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Painel de controlo", "welcome_back": "Painel de controlo",
"flash_error": "Erro!", "flash_error": "Erro!",
"flash_warning": "Aviso!",
"flash_success": "Sucesso!", "flash_success": "Sucesso!",
"close": "Fechar", "close": "Fechar",
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida", "split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
@ -29,6 +30,7 @@
"submit": "Guardar", "submit": "Guardar",
"amount": "Montante", "amount": "Montante",
"date": "Data", "date": "Data",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiquetas", "tags": "Etiquetas",
"no_budget": "(sem or\u00e7amento)", "no_budget": "(sem or\u00e7amento)",
"no_bill": "(sem encargo)", "no_bill": "(sem encargo)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Ce se red\u0103?", "welcome_back": "Ce se red\u0103?",
"flash_error": "Eroare!", "flash_error": "Eroare!",
"flash_warning": "Avertizare!",
"flash_success": "Succes!", "flash_success": "Succes!",
"close": "\u00cenchide", "close": "\u00cenchide",
"split_transaction_title": "Descrierea tranzac\u021biei divizate", "split_transaction_title": "Descrierea tranzac\u021biei divizate",
@ -29,6 +30,7 @@
"submit": "Trimite", "submit": "Trimite",
"amount": "Sum\u0103", "amount": "Sum\u0103",
"date": "Dat\u0103", "date": "Dat\u0103",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etichete", "tags": "Etichete",
"no_budget": "(nici un buget)", "no_budget": "(nici un buget)",
"no_bill": "(f\u0103r\u0103 factur\u0103)", "no_bill": "(f\u0103r\u0103 factur\u0103)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438?", "welcome_back": "\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438?",
"flash_error": "\u041e\u0448\u0438\u0431\u043a\u0430!", "flash_error": "\u041e\u0448\u0438\u0431\u043a\u0430!",
"flash_warning": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435!",
"flash_success": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", "flash_success": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!",
"close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c", "close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c",
"split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438", "split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
@ -29,6 +30,7 @@
"submit": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c", "submit": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c",
"amount": "\u0421\u0443\u043c\u043c\u0430", "amount": "\u0421\u0443\u043c\u043c\u0430",
"date": "\u0414\u0430\u0442\u0430", "date": "\u0414\u0430\u0442\u0430",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u041c\u0435\u0442\u043a\u0438", "tags": "\u041c\u0435\u0442\u043a\u0438",
"no_budget": "(\u0432\u043d\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430)", "no_budget": "(\u0432\u043d\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430)",
"no_bill": "(\u043d\u0435\u0442 \u0441\u0447\u0451\u0442\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443)", "no_bill": "(\u043d\u0435\u0442 \u0441\u0447\u0451\u0442\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Ako to ide?", "welcome_back": "Ako to ide?",
"flash_error": "Chyba!", "flash_error": "Chyba!",
"flash_warning": "Varovanie!",
"flash_success": "Hotovo!", "flash_success": "Hotovo!",
"close": "Zavrie\u0165", "close": "Zavrie\u0165",
"split_transaction_title": "Popis roz\u00fa\u010dtovania", "split_transaction_title": "Popis roz\u00fa\u010dtovania",
@ -29,6 +30,7 @@
"submit": "Odosla\u0165", "submit": "Odosla\u0165",
"amount": "Suma", "amount": "Suma",
"date": "D\u00e1tum", "date": "D\u00e1tum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u0160t\u00edtky", "tags": "\u0160t\u00edtky",
"no_budget": "(\u017eiadny rozpo\u010det)", "no_budget": "(\u017eiadny rozpo\u010det)",
"no_bill": "(\u017eiadny \u00fa\u010det)", "no_bill": "(\u017eiadny \u00fa\u010det)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Kaj dogaja?", "welcome_back": "Kaj dogaja?",
"flash_error": "Napaka!", "flash_error": "Napaka!",
"flash_warning": "Opozorilo!",
"flash_success": "Uspelo je!", "flash_success": "Uspelo je!",
"close": "zapri", "close": "zapri",
"split_transaction_title": "Opis deljene transakcije", "split_transaction_title": "Opis deljene transakcije",
@ -29,6 +30,7 @@
"submit": "Potrdi", "submit": "Potrdi",
"amount": "Znesek", "amount": "Znesek",
"date": "Datum", "date": "Datum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Oznake", "tags": "Oznake",
"no_budget": "(brez prora\u010duna)", "no_budget": "(brez prora\u010duna)",
"no_bill": "(ni ra\u010duna)", "no_bill": "(ni ra\u010duna)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Vad spelas?", "welcome_back": "Vad spelas?",
"flash_error": "Fel!", "flash_error": "Fel!",
"flash_warning": "Varning!",
"flash_success": "Slutf\u00f6rd!", "flash_success": "Slutf\u00f6rd!",
"close": "St\u00e4ng", "close": "St\u00e4ng",
"split_transaction_title": "Beskrivning av delad transaktion", "split_transaction_title": "Beskrivning av delad transaktion",
@ -29,6 +30,7 @@
"submit": "Skicka", "submit": "Skicka",
"amount": "Belopp", "amount": "Belopp",
"date": "Datum", "date": "Datum",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiketter", "tags": "Etiketter",
"no_budget": "(ingen budget)", "no_budget": "(ingen budget)",
"no_bill": "(ingen r\u00e4kning)", "no_bill": "(ingen r\u00e4kning)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Neler oluyor?", "welcome_back": "Neler oluyor?",
"flash_error": "Hata!", "flash_error": "Hata!",
"flash_warning": "Uyar\u0131!",
"flash_success": "Ba\u015far\u0131l\u0131!", "flash_success": "Ba\u015far\u0131l\u0131!",
"close": "Kapat", "close": "Kapat",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "G\u00f6nder", "submit": "G\u00f6nder",
"amount": "Miktar", "amount": "Miktar",
"date": "Tarih", "date": "Tarih",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Etiketler", "tags": "Etiketler",
"no_budget": "(b\u00fct\u00e7e yok)", "no_budget": "(b\u00fct\u00e7e yok)",
"no_bill": "(hay\u0131r bill)", "no_bill": "(hay\u0131r bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u0429\u043e \u0432 \u0433\u0430\u043c\u0430\u043d\u0446\u0456?", "welcome_back": "\u0429\u043e \u0432 \u0433\u0430\u043c\u0430\u043d\u0446\u0456?",
"flash_error": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430!", "flash_error": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430!",
"flash_warning": "\u0423\u0432\u0430\u0433\u0430!",
"flash_success": "\u0423\u0441\u043f\u0456\u0448\u043d\u043e!", "flash_success": "\u0423\u0441\u043f\u0456\u0448\u043d\u043e!",
"close": "\u0417\u0430\u043a\u0440\u0438\u0442\u0438", "close": "\u0417\u0430\u043a\u0440\u0438\u0442\u0438",
"split_transaction_title": "Description of the split transaction", "split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438", "submit": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438",
"amount": "\u0421\u0443\u043c\u0430", "amount": "\u0421\u0443\u043c\u0430",
"date": "\u0414\u0430\u0442\u0430", "date": "\u0414\u0430\u0442\u0430",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u0422\u0435\u0433\u0438", "tags": "\u0422\u0435\u0433\u0438",
"no_budget": "(\u043f\u043e\u0437\u0430 \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c)", "no_budget": "(\u043f\u043e\u0437\u0430 \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "Ch\u00e0o m\u1eebng tr\u1edf l\u1ea1i?", "welcome_back": "Ch\u00e0o m\u1eebng tr\u1edf l\u1ea1i?",
"flash_error": "L\u1ed7i!", "flash_error": "L\u1ed7i!",
"flash_warning": "C\u1ea3nh b\u00e1o!",
"flash_success": "Th\u00e0nh c\u00f4ng!", "flash_success": "Th\u00e0nh c\u00f4ng!",
"close": "\u0110\u00f3ng", "close": "\u0110\u00f3ng",
"split_transaction_title": "M\u00f4 t\u1ea3 giao d\u1ecbch t\u00e1ch", "split_transaction_title": "M\u00f4 t\u1ea3 giao d\u1ecbch t\u00e1ch",
@ -29,6 +30,7 @@
"submit": "G\u1eedi", "submit": "G\u1eedi",
"amount": "S\u1ed1 ti\u1ec1n", "amount": "S\u1ed1 ti\u1ec1n",
"date": "Ng\u00e0y", "date": "Ng\u00e0y",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "Nh\u00e3n", "tags": "Nh\u00e3n",
"no_budget": "(kh\u00f4ng c\u00f3 ng\u00e2n s\u00e1ch)", "no_budget": "(kh\u00f4ng c\u00f3 ng\u00e2n s\u00e1ch)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "\u4eca\u5929\u7406\u8d22\u4e86\u5417\uff1f", "welcome_back": "\u4eca\u5929\u7406\u8d22\u4e86\u5417\uff1f",
"flash_error": "\u9519\u8bef\uff01", "flash_error": "\u9519\u8bef\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\uff01", "flash_success": "\u6210\u529f\uff01",
"close": "\u5173\u95ed", "close": "\u5173\u95ed",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0", "split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
@ -29,6 +30,7 @@
"submit": "\u63d0\u4ea4", "submit": "\u63d0\u4ea4",
"amount": "\u91d1\u989d", "amount": "\u91d1\u989d",
"date": "\u65e5\u671f", "date": "\u65e5\u671f",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u6807\u7b7e", "tags": "\u6807\u7b7e",
"no_budget": "(\u65e0\u9884\u7b97)", "no_budget": "(\u65e0\u9884\u7b97)",
"no_bill": "(\u65e0\u8d26\u5355)", "no_bill": "(\u65e0\u8d26\u5355)",

View File

@ -2,6 +2,7 @@
"firefly": { "firefly": {
"welcome_back": "What's playing?", "welcome_back": "What's playing?",
"flash_error": "\u932f\u8aa4\uff01", "flash_error": "\u932f\u8aa4\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\uff01", "flash_success": "\u6210\u529f\uff01",
"close": "\u95dc\u9589", "close": "\u95dc\u9589",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0", "split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
@ -29,6 +30,7 @@
"submit": "\u9001\u51fa", "submit": "\u9001\u51fa",
"amount": "\u91d1\u984d", "amount": "\u91d1\u984d",
"date": "\u65e5\u671f", "date": "\u65e5\u671f",
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).",
"tags": "\u6a19\u7c64", "tags": "\u6a19\u7c64",
"no_budget": "(\u7121\u9810\u7b97)", "no_budget": "(\u7121\u9810\u7b97)",
"no_bill": "(no bill)", "no_bill": "(no bill)",

View File

@ -1516,6 +1516,7 @@ return [
'list_all_attachments' => 'List of all attachments', 'list_all_attachments' => 'List of all attachments',
// transaction index // transaction index
'is_reconciled_fields_dropped' => 'Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s).',
'title_expenses' => 'Expenses', 'title_expenses' => 'Expenses',
'title_withdrawal' => 'Expenses', 'title_withdrawal' => 'Expenses',
'title_revenue' => 'Revenue / income', 'title_revenue' => 'Revenue / income',
@ -1888,6 +1889,7 @@ return [
// Ignore this comment // Ignore this comment
// transactions: // transactions:
'unreconcile' => 'Undo reconciliation',
'update_withdrawal' => 'Update withdrawal', 'update_withdrawal' => 'Update withdrawal',
'update_deposit' => 'Update deposit', 'update_deposit' => 'Update deposit',
'update_transaction' => 'Update transaction', 'update_transaction' => 'Update transaction',

View File

@ -38,6 +38,7 @@ return [
'source_equals_destination' => 'The source account equals the destination account.', 'source_equals_destination' => 'The source account equals the destination account.',
'unique_account_number_for_user' => 'It looks like this account number is already in use.', 'unique_account_number_for_user' => 'It looks like this account number is already in use.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.', 'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'reconciled_forbidden_field' => 'This transaction is already reconciled, you cannot change the ":field"',
'deleted_user' => 'Due to security constraints, you cannot register using this email address.', 'deleted_user' => 'Due to security constraints, you cannot register using this email address.',
'rule_trigger_value' => 'This value is invalid for the selected trigger.', 'rule_trigger_value' => 'This value is invalid for the selected trigger.',
'rule_action_value' => 'This value is invalid for the selected action.', 'rule_action_value' => 'This value is invalid for the selected action.',

View File

@ -220,6 +220,10 @@
class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li> class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li>
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span <li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li> class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li>
{% if journal.reconciled %}
<li><a class="reconcile-button" href="{{ route('transactions.unreconcile', [journal.transaction_journal_id]) }}"><span
class="fa fa-history"></span> {{ 'unreconcile'|_ }}</a></li>
{% endif %}
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
{# convert to different type #} {# convert to different type #}
@ -504,9 +508,25 @@
var cloneGroupUrl = '{{ route('transactions.clone') }}'; var cloneGroupUrl = '{{ route('transactions.clone') }}';
var cloneAndEditUrl = '{{ route('transactions.clone') }}?redirect=edit'; var cloneAndEditUrl = '{{ route('transactions.clone') }}?redirect=edit';
$('.switch-link').on('click', switchLink); $('.switch-link').on('click', switchLink);
$('.reconcile-button').on('click', unreconcile);
var switchLinkUrl = '{{ route('transactions.link.switch') }}'; var switchLinkUrl = '{{ route('transactions.link.switch') }}';
function unreconcile(e) {
e.preventDefault();
var obj = $(e.currentTarget);
$.post(obj.attr('href'), {
_token: token
}).done(function () {
location.reload();
}).fail(function () {
console.error('I failed :(');
});
return false
}
function switchLink(e) { function switchLink(e) {
e.preventDefault(); e.preventDefault();
var obj = $(e.currentTarget); var obj = $(e.currentTarget);

View File

@ -1227,6 +1227,9 @@ Route::group(
Route::get('delete/{transactionGroup}', ['uses' => 'Transaction\DeleteController@delete', 'as' => 'delete']); Route::get('delete/{transactionGroup}', ['uses' => 'Transaction\DeleteController@delete', 'as' => 'delete']);
Route::post('destroy/{transactionGroup}', ['uses' => 'Transaction\DeleteController@destroy', 'as' => 'destroy']); Route::post('destroy/{transactionGroup}', ['uses' => 'Transaction\DeleteController@destroy', 'as' => 'destroy']);
// unreconcile
Route::post('unreconcile/{tj}', ['uses' => 'Transaction\EditController@unreconcile', 'as' => 'unreconcile']);
Route::get('show/{transactionGroup}', ['uses' => 'Transaction\ShowController@show', 'as' => 'show']); Route::get('show/{transactionGroup}', ['uses' => 'Transaction\ShowController@show', 'as' => 'show']);
Route::get('debug/{transactionGroup}', ['uses' => 'Transaction\ShowController@debugShow', 'as' => 'debug']); Route::get('debug/{transactionGroup}', ['uses' => 'Transaction\ShowController@debugShow', 'as' => 'debug']);
} }