mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Update for bug fix release.
This commit is contained in:
parent
5846431b34
commit
bcdb849b46
@ -117,7 +117,8 @@ class ReconcileController extends Controller
|
|||||||
* @param Carbon|null $end
|
* @param Carbon|null $end
|
||||||
*
|
*
|
||||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
|
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
|
||||||
*
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
*/
|
*/
|
||||||
public function reconcile(Account $account, Carbon $start = null, Carbon $end = null)
|
public function reconcile(Account $account, Carbon $start = null, Carbon $end = null)
|
||||||
@ -201,6 +202,9 @@ class ReconcileController extends Controller
|
|||||||
*
|
*
|
||||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||||
* @throws FireflyException
|
* @throws FireflyException
|
||||||
|
*
|
||||||
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||||
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||||
*/
|
*/
|
||||||
public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end)
|
public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end)
|
||||||
{
|
{
|
||||||
@ -217,16 +221,13 @@ class ReconcileController extends Controller
|
|||||||
if ('create' === $data['reconcile']) {
|
if ('create' === $data['reconcile']) {
|
||||||
// get "opposing" account.
|
// get "opposing" account.
|
||||||
$reconciliation = $this->accountRepos->getReconciliation($account);
|
$reconciliation = $this->accountRepos->getReconciliation($account);
|
||||||
|
$difference = $data['difference'];
|
||||||
|
$source = $reconciliation;
|
||||||
$difference = $data['difference'];
|
$destination = $account;
|
||||||
$source = $reconciliation;
|
|
||||||
$destination = $account;
|
|
||||||
if (1 === bccomp($difference, '0')) {
|
if (1 === bccomp($difference, '0')) {
|
||||||
// amount is positive. Add it to reconciliation?
|
// amount is positive. Add it to reconciliation?
|
||||||
$source = $account;
|
$source = $account;
|
||||||
$destination = $reconciliation;
|
$destination = $reconciliation;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// data for journal
|
// data for journal
|
||||||
@ -271,9 +272,7 @@ class ReconcileController extends Controller
|
|||||||
$this->repository->store($journalData);
|
$this->repository->store($journalData);
|
||||||
}
|
}
|
||||||
Log::debug('End of routine.');
|
Log::debug('End of routine.');
|
||||||
|
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
|
|
||||||
session()->flash('success', trans('firefly.reconciliation_stored'));
|
session()->flash('success', trans('firefly.reconciliation_stored'));
|
||||||
|
|
||||||
return redirect(route('accounts.show', [$account->id]));
|
return redirect(route('accounts.show', [$account->id]));
|
||||||
|
11
changelog.md
11
changelog.md
@ -2,6 +2,17 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [4.7.5.1] - 2018-07-13
|
||||||
|
### Fixed
|
||||||
|
- #1531, the database routine incorrectly reports empty categories.
|
||||||
|
- #1532, broken dropdown for autosuggest things.
|
||||||
|
- #1533, fix where the import could not import category names.
|
||||||
|
- #1538, fix a bug where Spectre would not work when ignoring rules.
|
||||||
|
- #1542, fix a bug where the importer was incapable of generating new currencies.
|
||||||
|
- #1541, no longer ignore composer.lock in Docker ignore.
|
||||||
|
- Bills are stored inactive.
|
||||||
|
|
||||||
## [4.7.5] - 2018-07-02
|
## [4.7.5] - 2018-07-02
|
||||||
### Added
|
### Added
|
||||||
- A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you.
|
- A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you.
|
||||||
|
@ -88,8 +88,8 @@ return [
|
|||||||
'is_demo_site' => false,
|
'is_demo_site' => false,
|
||||||
],
|
],
|
||||||
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
|
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
|
||||||
'version' => '4.7.5',
|
'version' => '4.7.5.1',
|
||||||
'api_version' => '0.4',
|
'api_version' => '0.5',
|
||||||
'db_version' => 4,
|
'db_version' => 4,
|
||||||
'maxUploadSize' => 15242880,
|
'maxUploadSize' => 15242880,
|
||||||
'allowedMimes' => [
|
'allowedMimes' => [
|
||||||
|
@ -163,7 +163,7 @@ class CurrencyControllerTest extends TestCase
|
|||||||
'code' => 'ABC',
|
'code' => 'ABC',
|
||||||
'symbol' => 'A',
|
'symbol' => 'A',
|
||||||
'decimal_places' => 2,
|
'decimal_places' => 2,
|
||||||
'default' => 'false',
|
'default' => '0',
|
||||||
];
|
];
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
@ -200,7 +200,7 @@ class CurrencyControllerTest extends TestCase
|
|||||||
'code' => 'ABC',
|
'code' => 'ABC',
|
||||||
'symbol' => 'A',
|
'symbol' => 'A',
|
||||||
'decimal_places' => 2,
|
'decimal_places' => 2,
|
||||||
'default' => 'true',
|
'default' => '1',
|
||||||
];
|
];
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
@ -232,7 +232,7 @@ class CurrencyControllerTest extends TestCase
|
|||||||
'code' => 'ABC',
|
'code' => 'ABC',
|
||||||
'symbol' => '$E',
|
'symbol' => '$E',
|
||||||
'decimal_places' => '2',
|
'decimal_places' => '2',
|
||||||
'default' => 'false',
|
'default' => '0',
|
||||||
];
|
];
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
@ -270,7 +270,7 @@ class CurrencyControllerTest extends TestCase
|
|||||||
'code' => 'ABC',
|
'code' => 'ABC',
|
||||||
'symbol' => '$E',
|
'symbol' => '$E',
|
||||||
'decimal_places' => '2',
|
'decimal_places' => '2',
|
||||||
'default' => 'true',
|
'default' => '1',
|
||||||
];
|
];
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
|
@ -28,6 +28,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface;
|
|||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
|
use Mockery;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,6 +95,7 @@ class UserControllerTest extends TestCase
|
|||||||
$users = factory(User::class, 10)->create();
|
$users = factory(User::class, 10)->create();
|
||||||
// mock stuff:
|
// mock stuff:
|
||||||
$repository = $this->mock(UserRepositoryInterface::class);
|
$repository = $this->mock(UserRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
|
||||||
|
|
||||||
// mock calls:
|
// mock calls:
|
||||||
$repository->shouldReceive('all')->withAnyArgs()->andReturn($users)->once();
|
$repository->shouldReceive('all')->withAnyArgs()->andReturn($users)->once();
|
||||||
@ -116,7 +118,9 @@ class UserControllerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testShow(): void
|
public function testShow(): void
|
||||||
{
|
{
|
||||||
$user = User::first();
|
$user = User::first();
|
||||||
|
$repository = $this->mock(UserRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
$response = $this->get('/api/v1/users/' . $user->id);
|
$response = $this->get('/api/v1/users/' . $user->id);
|
||||||
@ -139,7 +143,7 @@ class UserControllerTest extends TestCase
|
|||||||
|
|
||||||
// mock
|
// mock
|
||||||
$userRepos = $this->mock(UserRepositoryInterface::class);
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
$userRepos->shouldReceive('hasRole')->once()->andReturn(true);
|
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
|
||||||
$userRepos->shouldReceive('store')->once()->andReturn($this->user());
|
$userRepos->shouldReceive('store')->once()->andReturn($this->user());
|
||||||
|
|
||||||
// test API
|
// test API
|
||||||
@ -163,7 +167,7 @@ class UserControllerTest extends TestCase
|
|||||||
|
|
||||||
// mock
|
// mock
|
||||||
$userRepos = $this->mock(UserRepositoryInterface::class);
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
$userRepos->shouldReceive('hasRole')->once()->andReturn(true);
|
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
|
||||||
// test API
|
// test API
|
||||||
$response = $this->post('/api/v1/users', $data, ['Accept' => 'application/json']);
|
$response = $this->post('/api/v1/users', $data, ['Accept' => 'application/json']);
|
||||||
$response->assertStatus(422);
|
$response->assertStatus(422);
|
||||||
@ -199,7 +203,7 @@ class UserControllerTest extends TestCase
|
|||||||
// mock
|
// mock
|
||||||
$userRepos = $this->mock(UserRepositoryInterface::class);
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
$userRepos->shouldReceive('update')->once()->andReturn($user);
|
$userRepos->shouldReceive('update')->once()->andReturn($user);
|
||||||
$userRepos->shouldReceive('hasRole')->once()->andReturn(true);
|
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
|
||||||
|
|
||||||
// call API
|
// call API
|
||||||
$response = $this->put('/api/v1/users/' . $user->id, $data);
|
$response = $this->put('/api/v1/users/' . $user->id, $data);
|
||||||
|
@ -24,6 +24,7 @@ namespace Tests\Unit\TransactionRules\Triggers;
|
|||||||
|
|
||||||
use FireflyIII\Models\TransactionJournal;
|
use FireflyIII\Models\TransactionJournal;
|
||||||
use FireflyIII\TransactionRules\Triggers\FromAccountStarts;
|
use FireflyIII\TransactionRules\Triggers\FromAccountStarts;
|
||||||
|
use Log;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,19 +32,35 @@ use Tests\TestCase;
|
|||||||
*/
|
*/
|
||||||
class FromAccountStartsTest extends TestCase
|
class FromAccountStartsTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
Log::debug(sprintf('Now in %s.', \get_class($this)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers \FireflyIII\TransactionRules\Triggers\FromAccountStarts::triggered
|
* @covers \FireflyIII\TransactionRules\Triggers\FromAccountStarts::triggered
|
||||||
*/
|
*/
|
||||||
public function testTriggered(): void
|
public function testTriggered(): void
|
||||||
{
|
{
|
||||||
$count = 0;
|
Log::debug('In testTriggered()');
|
||||||
|
$loops = 0; // FINAL LOOP METHOD.
|
||||||
do {
|
do {
|
||||||
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
/** @var TransactionJournal $journal */
|
||||||
$transaction = $journal->transactions()->where('amount', '<', 0)->first();
|
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
||||||
$transactionCount = $journal->transactions()->count();
|
$transaction = $journal->transactions()->where('amount', '<', 0)->first();
|
||||||
$account = $transaction->account;
|
$account = $transaction->account;
|
||||||
$count++;
|
$count = $journal->transactions()->count();
|
||||||
} while ($account === null && $count < 30 && $transactionCount !== 2);
|
|
||||||
|
Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d', $loops, $count, (int)null===$account));
|
||||||
|
|
||||||
|
$loops++;
|
||||||
|
|
||||||
|
// do this until: account is not null, journal has two transactions, loops is below 30
|
||||||
|
} while (!(null !== $account && 2 === $count && $loops < 30));
|
||||||
|
|
||||||
$trigger = FromAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);
|
$trigger = FromAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);
|
||||||
$result = $trigger->triggered($journal);
|
$result = $trigger->triggered($journal);
|
||||||
@ -55,14 +72,21 @@ class FromAccountStartsTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testTriggeredLonger(): void
|
public function testTriggeredLonger(): void
|
||||||
{
|
{
|
||||||
$count = 0;
|
Log::debug('In testTriggeredLonger()');
|
||||||
|
$loops = 0; // FINAL LOOP METHOD.
|
||||||
do {
|
do {
|
||||||
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
/** @var TransactionJournal $journal */
|
||||||
$transaction = $journal->transactions()->where('amount', '<', 0)->first();
|
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
||||||
$transactionCount = $journal->transactions()->count();
|
$transaction = $journal->transactions()->where('amount', '<', 0)->first();
|
||||||
$account = $transaction->account;
|
$account = $transaction->account;
|
||||||
$count++;
|
$count = $journal->transactions()->count();
|
||||||
} while ($account === null && $count < 30 && $transactionCount !== 2);
|
|
||||||
|
Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d', $loops, $count, (int)null===$account));
|
||||||
|
|
||||||
|
$loops++;
|
||||||
|
|
||||||
|
// do this until: account is not null, journal has two transactions, loops is below 30
|
||||||
|
} while (!(null !== $account && 2 === $count && $loops < 30));
|
||||||
|
|
||||||
$trigger = FromAccountStarts::makeFromStrings('bla-bla-bla' . $account->name, false);
|
$trigger = FromAccountStarts::makeFromStrings('bla-bla-bla' . $account->name, false);
|
||||||
$result = $trigger->triggered($journal);
|
$result = $trigger->triggered($journal);
|
||||||
|
@ -38,19 +38,20 @@ class ToAccountStartsTest extends TestCase
|
|||||||
public function testTriggered(): void
|
public function testTriggered(): void
|
||||||
{
|
{
|
||||||
Log::debug('Now in testTriggered');
|
Log::debug('Now in testTriggered');
|
||||||
|
|
||||||
$loopCount = 0;
|
$loopCount = 0;
|
||||||
$account = null;
|
$account = null;
|
||||||
do {
|
do {
|
||||||
Log::debug(sprintf('Count of loop: %d', $loopCount));
|
Log::debug(sprintf('Count of loop: %d', $loopCount));
|
||||||
|
|
||||||
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
|
||||||
$count = $journal->transactions()->where('amount', '>', 0)->count();
|
$count = $journal->transactions()->where('amount', '>', 0)->count();
|
||||||
$transaction = $journal->transactions()->where('amount', '>', 0)->first();
|
$transaction = $journal->transactions()->where('amount', '>', 0)->first();
|
||||||
$account = null === $transaction ? null : $transaction->account;
|
$account = null === $transaction ? null : $transaction->account;
|
||||||
|
|
||||||
Log::debug(sprintf('Journal with id #%d', $journal->id));
|
Log::debug(sprintf('Journal with id #%d', $journal->id));
|
||||||
Log::debug(sprintf('Count of transactions is %d', $count));
|
Log::debug(sprintf('Count of transactions is %d', $count));
|
||||||
Log::debug(sprintf('Account is null: %s', var_export(null === $account, true)));
|
Log::debug(sprintf('Account is null: %s', var_export(null === $account, true)));
|
||||||
} while ($loopCount < 30 && $count !== 1 && null !== $account);
|
} while ($loopCount < 30 && $count < 1 && null !== $account);
|
||||||
|
|
||||||
|
|
||||||
$trigger = ToAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);
|
$trigger = ToAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);
|
||||||
|
Loading…
Reference in New Issue
Block a user