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:
$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.
$this->validateEqualAccountsForUpdate($validator, $transactionGroup);
// a catch when users submit splits with no source or destination info at all.
$this->preventNoAccountInfo($validator, );
// see method:
//$this->preventNoAccountInfo($validator, );
// validate that the currency fits the source and/or destination account.
// validate all account info
$this->validateAccountInformationUpdate($validator, $transactionGroup);
}
);
}

View File

@ -25,8 +25,11 @@ namespace FireflyIII\Http\Controllers\Transaction;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
@ -36,8 +39,11 @@ use Illuminate\View\View;
*/
class EditController extends Controller
{
private JournalRepositoryInterface $repository;
/**
* EditController constructor.
* IndexController constructor.
*
*/
@ -45,17 +51,30 @@ class EditController extends Controller
{
parent::__construct();
// some useful repositories:
// translations:
$this->middleware(
static function ($request, $next) {
function ($request, $next) {
app('view')->share('title', (string)trans('firefly.transactions'));
app('view')->share('mainTitleIcon', 'fa-exchange');
$this->repository = app(JournalRepositoryInterface::class);
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
*

View File

@ -46,7 +46,7 @@ use Illuminate\Support\Collection;
class JournalRepository implements JournalRepositoryInterface
{
/** @var User */
private $user;
private User $user;
/**
* @param TransactionGroup $transactionGroup
@ -334,4 +334,14 @@ class JournalRepository implements JournalRepositoryInterface
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;
/**
* 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.
*

View File

@ -25,7 +25,9 @@ declare(strict_types=1);
namespace FireflyIII\Validation;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Validator;
@ -37,6 +39,50 @@ use Illuminate\Validation\Validator;
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
*
* @throws FireflyException

View File

@ -376,6 +376,11 @@ trait TransactionValidation
public function validateAccountInformationUpdate(Validator $validator, TransactionGroup $transactionGroup): void
{
Log::debug('Now in validateAccountInformationUpdate()');
if ($validator->errors()->count() > 0) {
Log::debug('Validator already has errors, so return.');
return;
}
$transactions = $this->getTransactionsArray($validator);
/**
@ -699,6 +704,11 @@ trait TransactionValidation
*/
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()');
$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": {
"welcome_back": "\u041a\u0430\u043a\u0432\u043e \u0441\u0435 \u0441\u043b\u0443\u0447\u0432\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!",
"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",
@ -29,6 +30,7 @@
"submit": "\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438",
"amount": "\u0421\u0443\u043c\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",
"no_budget": "(\u0431\u0435\u0437 \u0431\u044e\u0434\u0436\u0435\u0442)",
"no_bill": "(\u043d\u044f\u043c\u0430 \u0441\u043c\u0435\u0442\u043a\u0430)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Qu\u00e8 est\u00e0 passant?",
"flash_error": "Error!",
"flash_warning": "Atenci\u00f3!",
"flash_success": "\u00c8xit!",
"close": "Tancar",
"split_transaction_title": "Descripci\u00f3 de la transacci\u00f3 dividida",
@ -29,6 +30,7 @@
"submit": "Enviar",
"amount": "Import",
"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",
"no_budget": "(cap pressupost)",
"no_bill": "(cap factura)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Jak to jde?",
"flash_error": "Chyba!",
"flash_warning": "Varov\u00e1n\u00ed!",
"flash_success": "\u00dasp\u011b\u0161n\u011b dokon\u010deno!",
"close": "Zav\u0159\u00edt",
"split_transaction_title": "Popis roz\u00fa\u010dtov\u00e1n\u00ed",
@ -29,6 +30,7 @@
"submit": "Odeslat",
"amount": "\u010c\u00e1stka",
"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",
"no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Hvad spiller?",
"flash_error": "Fejl!",
"flash_warning": "Advarsel!",
"flash_success": "Succes!",
"close": "Luk",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit",
"amount": "Bel\u00f8b",
"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",
"no_budget": "(no budget)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u00dcberblick",
"flash_error": "Fehler!",
"flash_warning": "Achtung!",
"flash_success": "Geschafft!",
"close": "Schlie\u00dfen",
"split_transaction_title": "Beschreibung der Splittbuchung",
@ -29,6 +30,7 @@
"submit": "Absenden",
"amount": "Betrag",
"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",
"no_budget": "(kein Budget)",
"no_bill": "(keine Belege)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u03a4\u03b9 \u03c0\u03b1\u03af\u03b6\u03b5\u03b9;",
"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!",
"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",
@ -29,6 +30,7 @@
"submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae",
"amount": "\u03a0\u03bf\u03c3\u03cc",
"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",
"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)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "What's playing?",
"flash_error": "Error!",
"flash_warning": "Warning!",
"flash_success": "Success!",
"close": "Close",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit",
"amount": "Amount",
"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",
"no_budget": "(no budget)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "What's playing?",
"flash_error": "Error!",
"flash_warning": "Warning!",
"flash_success": "Success!",
"close": "Close",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Submit",
"amount": "Amount",
"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",
"no_budget": "(no budget)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?",
"flash_error": "\u00a1Error!",
"flash_warning": "\u00a1Atenci\u00f3n!",
"flash_success": "\u00a1Operaci\u00f3n correcta!",
"close": "Cerrar",
"split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida",
@ -29,6 +30,7 @@
"submit": "Enviar",
"amount": "Cantidad",
"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",
"no_budget": "(sin presupuesto)",
"no_bill": "(sin factura)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Mit\u00e4 kuuluu?",
"flash_error": "Virhe!",
"flash_warning": "Varoitus!",
"flash_success": "Valmista tuli!",
"close": "Sulje",
"split_transaction_title": "Jaetun tapahtuman kuvaus",
@ -29,6 +30,7 @@
"submit": "Vahvista",
"amount": "Summa",
"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",
"no_budget": "(ei budjettia)",
"no_bill": "(ei laskua)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Quoi de neuf ?",
"flash_error": "Erreur !",
"flash_warning": "Attention !",
"flash_success": "Super !",
"close": "Fermer",
"split_transaction_title": "Description de l'op\u00e9ration ventil\u00e9e",
@ -29,6 +30,7 @@
"submit": "Soumettre",
"amount": "Montant",
"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",
"no_budget": "(pas de budget)",
"no_bill": "(aucune facture)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Mi a helyzet?",
"flash_error": "Hiba!",
"flash_warning": "Figyelmeztet\u00e9s!",
"flash_success": "Siker!",
"close": "Bez\u00e1r\u00e1s",
"split_transaction_title": "Felosztott tranzakci\u00f3 le\u00edr\u00e1sa",
@ -29,6 +30,7 @@
"submit": "Bek\u00fcld\u00e9s",
"amount": "\u00d6sszeg",
"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",
"no_budget": "(nincs k\u00f6lts\u00e9gkeret)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Apa yang sedang dimainkan?",
"flash_error": "Kesalahan!",
"flash_warning": "PERINGATAN!",
"flash_success": "Keberhasilan!",
"close": "Dekat",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "Menyerahkan",
"amount": "Jumlah",
"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",
"no_budget": "(no budget)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "La tua situazione finanziaria",
"flash_error": "Errore!",
"flash_warning": "Avviso!",
"flash_success": "Successo!",
"close": "Chiudi",
"split_transaction_title": "Descrizione della transazione suddivisa",
@ -29,6 +30,7 @@
"submit": "Invia",
"amount": "Importo",
"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",
"no_budget": "(nessun budget)",
"no_bill": "(nessuna bolletta)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u6982\u8981",
"flash_error": "\u30a8\u30e9\u30fc\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\u3057\u307e\u3057\u305f\uff01",
"close": "\u9589\u3058\u308b",
"split_transaction_title": "\u5206\u5272\u53d6\u5f15\u306e\u6982\u8981",
@ -29,6 +30,7 @@
"submit": "\u9001\u4fe1",
"amount": "\u91d1\u984d",
"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",
"no_budget": "(\u4e88\u7b97\u306a\u3057)",
"no_bill": "(\u8acb\u6c42\u306a\u3057)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\ubb34\uc2a8 \uc77c\uc774\uc8e0?",
"flash_error": "\uc624\ub958!",
"flash_warning": "\uacbd\uace0!",
"flash_success": "\uc131\uacf5!",
"close": "\ub2eb\uae30",
"split_transaction_title": "\ubd84\ud560 \uac70\ub798\uc5d0 \ub300\ud55c \uc124\uba85",
@ -29,6 +30,7 @@
"submit": "\uc81c\ucd9c",
"amount": "\uae08\uc561",
"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",
"no_budget": "(\uc608\uc0b0 \uc5c6\uc74c)",
"no_bill": "(\uccad\uad6c\uc11c \uc5c6\uc74c)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Hvordan g\u00e5r det?",
"flash_error": "Feil!",
"flash_warning": "Advarsel!",
"flash_success": "Suksess!",
"close": "Lukk",
"split_transaction_title": "Beskrivelse av den splittende transaksjon",
@ -29,6 +30,7 @@
"submit": "Send inn",
"amount": "Bel\u00f8p",
"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",
"no_budget": "(ingen budsjett)",
"no_bill": "(ingen regning)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Hoe staat het er voor?",
"flash_error": "Fout!",
"flash_warning": "Waarschuwing!",
"flash_success": "Gelukt!",
"close": "Sluiten",
"split_transaction_title": "Beschrijving van de gesplitste transactie",
@ -29,6 +30,7 @@
"submit": "Invoeren",
"amount": "Bedrag",
"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",
"no_budget": "(geen budget)",
"no_bill": "(geen contract)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Korleis g\u00e5r det?",
"flash_error": "Feil!",
"flash_warning": "Advarsel!",
"flash_success": "Suksess!",
"close": "Lukk",
"split_transaction_title": "Beskrivinga av den splitta transaksjonen",
@ -29,6 +30,7 @@
"submit": "Send inn",
"amount": "Bel\u00f8p",
"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",
"no_budget": "(ingen budsjett)",
"no_bill": "(ingen rekning)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Co jest grane?",
"flash_error": "B\u0142\u0105d!",
"flash_warning": "Ostrze\u017cenie!",
"flash_success": "Sukces!",
"close": "Zamknij",
"split_transaction_title": "Opis podzielonej transakcji",
@ -29,6 +30,7 @@
"submit": "Prze\u015blij",
"amount": "Kwota",
"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",
"no_budget": "(brak bud\u017cetu)",
"no_bill": "(brak rachunku)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "O que est\u00e1 acontecendo?",
"flash_error": "Erro!",
"flash_warning": "Aten\u00e7\u00e3o!",
"flash_success": "Sucesso!",
"close": "Fechar",
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
@ -29,6 +30,7 @@
"submit": "Enviar",
"amount": "Valor",
"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",
"no_budget": "(sem or\u00e7amento)",
"no_bill": "(sem fatura)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Painel de controlo",
"flash_error": "Erro!",
"flash_warning": "Aviso!",
"flash_success": "Sucesso!",
"close": "Fechar",
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
@ -29,6 +30,7 @@
"submit": "Guardar",
"amount": "Montante",
"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",
"no_budget": "(sem or\u00e7amento)",
"no_bill": "(sem encargo)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Ce se red\u0103?",
"flash_error": "Eroare!",
"flash_warning": "Avertizare!",
"flash_success": "Succes!",
"close": "\u00cenchide",
"split_transaction_title": "Descrierea tranzac\u021biei divizate",
@ -29,6 +30,7 @@
"submit": "Trimite",
"amount": "Sum\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",
"no_budget": "(nici un buget)",
"no_bill": "(f\u0103r\u0103 factur\u0103)",

View File

@ -2,6 +2,7 @@
"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?",
"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!",
"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",
@ -29,6 +30,7 @@
"submit": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c",
"amount": "\u0421\u0443\u043c\u043c\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",
"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)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Ako to ide?",
"flash_error": "Chyba!",
"flash_warning": "Varovanie!",
"flash_success": "Hotovo!",
"close": "Zavrie\u0165",
"split_transaction_title": "Popis roz\u00fa\u010dtovania",
@ -29,6 +30,7 @@
"submit": "Odosla\u0165",
"amount": "Suma",
"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",
"no_budget": "(\u017eiadny rozpo\u010det)",
"no_bill": "(\u017eiadny \u00fa\u010det)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Kaj dogaja?",
"flash_error": "Napaka!",
"flash_warning": "Opozorilo!",
"flash_success": "Uspelo je!",
"close": "zapri",
"split_transaction_title": "Opis deljene transakcije",
@ -29,6 +30,7 @@
"submit": "Potrdi",
"amount": "Znesek",
"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",
"no_budget": "(brez prora\u010duna)",
"no_bill": "(ni ra\u010duna)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Vad spelas?",
"flash_error": "Fel!",
"flash_warning": "Varning!",
"flash_success": "Slutf\u00f6rd!",
"close": "St\u00e4ng",
"split_transaction_title": "Beskrivning av delad transaktion",
@ -29,6 +30,7 @@
"submit": "Skicka",
"amount": "Belopp",
"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",
"no_budget": "(ingen budget)",
"no_bill": "(ingen r\u00e4kning)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Neler oluyor?",
"flash_error": "Hata!",
"flash_warning": "Uyar\u0131!",
"flash_success": "Ba\u015far\u0131l\u0131!",
"close": "Kapat",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "G\u00f6nder",
"amount": "Miktar",
"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",
"no_budget": "(b\u00fct\u00e7e yok)",
"no_bill": "(hay\u0131r bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u0429\u043e \u0432 \u0433\u0430\u043c\u0430\u043d\u0446\u0456?",
"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!",
"close": "\u0417\u0430\u043a\u0440\u0438\u0442\u0438",
"split_transaction_title": "Description of the split transaction",
@ -29,6 +30,7 @@
"submit": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438",
"amount": "\u0421\u0443\u043c\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",
"no_budget": "(\u043f\u043e\u0437\u0430 \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "Ch\u00e0o m\u1eebng tr\u1edf l\u1ea1i?",
"flash_error": "L\u1ed7i!",
"flash_warning": "C\u1ea3nh b\u00e1o!",
"flash_success": "Th\u00e0nh c\u00f4ng!",
"close": "\u0110\u00f3ng",
"split_transaction_title": "M\u00f4 t\u1ea3 giao d\u1ecbch t\u00e1ch",
@ -29,6 +30,7 @@
"submit": "G\u1eedi",
"amount": "S\u1ed1 ti\u1ec1n",
"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",
"no_budget": "(kh\u00f4ng c\u00f3 ng\u00e2n s\u00e1ch)",
"no_bill": "(no bill)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "\u4eca\u5929\u7406\u8d22\u4e86\u5417\uff1f",
"flash_error": "\u9519\u8bef\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\uff01",
"close": "\u5173\u95ed",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
@ -29,6 +30,7 @@
"submit": "\u63d0\u4ea4",
"amount": "\u91d1\u989d",
"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",
"no_budget": "(\u65e0\u9884\u7b97)",
"no_bill": "(\u65e0\u8d26\u5355)",

View File

@ -2,6 +2,7 @@
"firefly": {
"welcome_back": "What's playing?",
"flash_error": "\u932f\u8aa4\uff01",
"flash_warning": "\u8b66\u544a\uff01",
"flash_success": "\u6210\u529f\uff01",
"close": "\u95dc\u9589",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
@ -29,6 +30,7 @@
"submit": "\u9001\u51fa",
"amount": "\u91d1\u984d",
"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",
"no_budget": "(\u7121\u9810\u7b97)",
"no_bill": "(no bill)",

View File

@ -1516,6 +1516,7 @@ return [
'list_all_attachments' => 'List of all attachments',
// 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_withdrawal' => 'Expenses',
'title_revenue' => 'Revenue / income',
@ -1888,6 +1889,7 @@ return [
// Ignore this comment
// transactions:
'unreconcile' => 'Undo reconciliation',
'update_withdrawal' => 'Update withdrawal',
'update_deposit' => 'Update deposit',
'update_transaction' => 'Update transaction',

View File

@ -38,6 +38,7 @@ return [
'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_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.',
'rule_trigger_value' => 'This value is invalid for the selected trigger.',
'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>
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
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>
{# convert to different type #}
@ -504,9 +508,25 @@
var cloneGroupUrl = '{{ route('transactions.clone') }}';
var cloneAndEditUrl = '{{ route('transactions.clone') }}?redirect=edit';
$('.switch-link').on('click', switchLink);
$('.reconcile-button').on('click', unreconcile);
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) {
e.preventDefault();
var obj = $(e.currentTarget);

View File

@ -1227,6 +1227,9 @@ Route::group(
Route::get('delete/{transactionGroup}', ['uses' => 'Transaction\DeleteController@delete', 'as' => 'delete']);
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('debug/{transactionGroup}', ['uses' => 'Transaction\ShowController@debugShow', 'as' => 'debug']);
}