mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Compare commits
	
		
			111 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b250a10e3c | ||
|  | a9f1b31dd6 | ||
|  | 7fe393acaf | ||
|  | 04faba4db5 | ||
|  | 91bba40c20 | ||
|  | 79e39f7de8 | ||
|  | 9c09353559 | ||
|  | 50752a5bfe | ||
|  | d59879db7d | ||
|  | aab125da27 | ||
|  | 74fc731f96 | ||
|  | bd0050fec2 | ||
|  | aa5e313b92 | ||
|  | e89d613b7e | ||
|  | 8757929ead | ||
|  | e0a9b19802 | ||
|  | 308da6dc6e | ||
|  | b6960fb0e5 | ||
|  | 137208c3fd | ||
|  | d7a9a62a1d | ||
|  | 075315bdaa | ||
|  | 3948fcd614 | ||
|  | 8e61e129ab | ||
|  | 20cffd0502 | ||
|  | 5df09dab09 | ||
|  | 7446b911e5 | ||
|  | f15267c1ab | ||
|  | 9c9fc2b5dc | ||
|  | 28f601b54b | ||
|  | 18b8a05014 | ||
|  | 910c995ed8 | ||
|  | 498468aa2c | ||
|  | 637aebcb34 | ||
|  | 9afd5cb277 | ||
|  | bc525e7272 | ||
|  | a80180780d | ||
|  | 0d73086c37 | ||
|  | 02ae39238d | ||
|  | 43d6b51d42 | ||
|  | 84566310de | ||
|  | 6a6ec9fbe4 | ||
|  | 84a7f825d7 | ||
|  | 0372c1aaf1 | ||
|  | c9fff197f7 | ||
|  | 6900392e43 | ||
|  | c00bcd78cc | ||
|  | b2b82124e6 | ||
|  | 3de57c668f | ||
|  | 43669648ce | ||
|  | 3b73b416d5 | ||
|  | 5153591c8f | ||
|  | 3172bc90da | ||
|  | 76a1b2cd51 | ||
|  | bdf7eee72f | ||
|  | 2d4b148b2c | ||
|  | d67db74ca2 | ||
|  | 516725456f | ||
|  | 001d72a484 | ||
|  | c555e28988 | ||
|  | af13d1943f | ||
|  | 52df2edc8f | ||
|  | cd08484a13 | ||
|  | f38d38f139 | ||
|  | 93b6c68938 | ||
|  | a4cc25175a | ||
|  | 3fb14b4708 | ||
|  | 6bdb6db330 | ||
|  | d05c165ace | ||
|  | ab53cdb896 | ||
|  | c1f142af78 | ||
|  | 6e261abb73 | ||
|  | 39af9e4414 | ||
|  | 5b50abb2c7 | ||
|  | 13bda0a264 | ||
|  | 1658c666ab | ||
|  | 170aebfe54 | ||
|  | c4ef379d0e | ||
|  | 18b038d8ff | ||
|  | 12ee5da872 | ||
|  | 601f9f86bb | ||
|  | d7329a5915 | ||
|  | 9e7b730002 | ||
|  | 2d59d845bc | ||
|  | c2645894e0 | ||
|  | 3751106317 | ||
|  | 60bb639351 | ||
|  | 74c50930bd | ||
|  | 9105104303 | ||
|  | 540dde135e | ||
|  | f8936210cf | ||
|  | 1dc6d8de40 | ||
|  | 1069db3c13 | ||
|  | 65122f0144 | ||
|  | d2c018f7da | ||
|  | 46493c2af6 | ||
|  | c303e03f76 | ||
|  | d8b65f62e7 | ||
|  | 854368a8f3 | ||
|  | 7653a34aea | ||
|  | ee50b58e00 | ||
|  | 1eb60ab100 | ||
|  | 4a20eef351 | ||
|  | 26c9b2c353 | ||
|  | 16374bce9b | ||
|  | 86011d4ea2 | ||
|  | 571165c2bb | ||
|  | ad6700c114 | ||
|  | cc807ec132 | ||
|  | 24e7c68243 | ||
|  | ab25edd37a | ||
|  | be47fde6c2 | 
| @@ -1 +1 @@ | ||||
| src_dir: . | ||||
| src_dir: . | ||||
|   | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -32,4 +32,5 @@ addNewLines.php | ||||
| .env.backup | ||||
| .env.local | ||||
|  | ||||
| tests/_output/* | ||||
| tests/_output/* | ||||
| tests/_output/* | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| # .scrutinizer.yml | ||||
| tools: | ||||
|   external_code_coverage: false | ||||
|   external_code_coverage: false | ||||
|   | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -61,19 +61,19 @@ Everything is organised: | ||||
|  | ||||
| _Please note that everything in these screenshots is fictional and may not be realistic._ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Running and installing | ||||
|  | ||||
|   | ||||
| @@ -20,6 +20,7 @@ class ChartJsAccountChartGenerator implements AccountChartGenerator | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Collection $accounts | ||||
|      * @param Carbon     $start | ||||
|      * @param Carbon     $end | ||||
|   | ||||
| @@ -64,32 +64,7 @@ class GoogleAccountChartGenerator implements AccountChartGenerator | ||||
|      */ | ||||
|     public function frontpage(Collection $accounts, Carbon $start, Carbon $end) | ||||
|     { | ||||
|         $chart = new GChart; | ||||
|         $chart->addColumn(trans('firefly.dayOfMonth'), 'date'); | ||||
|  | ||||
|         $index = 1; | ||||
|         /** @var Account $account */ | ||||
|         foreach ($accounts as $account) { | ||||
|             $chart->addColumn(trans('firefly.balanceFor', ['name' => $account->name]), 'number'); | ||||
|             $chart->addCertainty($index); | ||||
|             $index++; | ||||
|         } | ||||
|         $current = clone $start; | ||||
|         $current->subDay(); | ||||
|         $today = Carbon::now(); | ||||
|         while ($end >= $current) { | ||||
|             $row     = [clone $current]; | ||||
|             $certain = $current < $today; | ||||
|             foreach ($accounts as $account) { | ||||
|                 $row[] = Steam::balance($account, $current); | ||||
|                 $row[] = $certain; | ||||
|             } | ||||
|             $chart->addRowArray($row); | ||||
|             $current->addDay(); | ||||
|         } | ||||
|         $chart->generate(); | ||||
|  | ||||
|         return $chart->getData(); | ||||
|         return $this->all($accounts, $start, $end); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Created by PhpStorm. | ||||
|  * User: sander | ||||
|  * Date: 27/06/15 | ||||
|  * Time: 17:21 | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Generator\Chart\Bill; | ||||
|  | ||||
| @@ -30,28 +24,23 @@ class ChartJsBillChartGenerator implements BillChartGenerator | ||||
|      */ | ||||
|     public function frontpage(Collection $paid, Collection $unpaid) | ||||
|     { | ||||
|  | ||||
|         // loop paid and create single entry: | ||||
|         $paidDescriptions   = []; | ||||
|         $paidAmount         = 0; | ||||
|         $unpaidDescriptions = []; | ||||
|         $unpaidAmount       = 0; | ||||
|  | ||||
|         bcscale(2); | ||||
|  | ||||
|         /** @var TransactionJournal $entry */ | ||||
|         foreach ($paid as $entry) { | ||||
|  | ||||
|         foreach ($paid as $entry) { // loop paid and create single entry: | ||||
|             $paidDescriptions[] = $entry->description; | ||||
|             $paidAmount += floatval($entry->amount); | ||||
|             $paidAmount         = bcadd($paidAmount, $entry->amount); | ||||
|         } | ||||
|  | ||||
|         // loop unpaid: | ||||
|         /** @var Bill $entry */ | ||||
|         foreach ($unpaid as $entry) { | ||||
|         foreach ($unpaid as $entry) { // loop unpaid: | ||||
|             $description          = $entry[0]->name . ' (' . $entry[1]->format('jS M Y') . ')'; | ||||
|             $amount               = ($entry[0]->amount_max + $entry[0]->amount_min) / 2; | ||||
|             $unpaidDescriptions[] = $description; | ||||
|             $unpaidAmount += $amount; | ||||
|             $unpaidAmount         = bcadd($unpaidAmount, $amount); | ||||
|             unset($amount, $description); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -30,12 +30,14 @@ class GoogleBillChartGenerator implements BillChartGenerator | ||||
|         $unpaidDescriptions = []; | ||||
|         $unpaidAmount       = 0; | ||||
|  | ||||
|         bcscale(2); | ||||
|  | ||||
|  | ||||
|         /** @var TransactionJournal $entry */ | ||||
|         foreach ($paid as $entry) { | ||||
|  | ||||
|             $paidDescriptions[] = $entry->description; | ||||
|             $paidAmount += floatval($entry->amount); | ||||
|             $paidAmount         = bcadd($paidAmount, $entry->amount); | ||||
|         } | ||||
|  | ||||
|         // loop unpaid: | ||||
| @@ -44,7 +46,7 @@ class GoogleBillChartGenerator implements BillChartGenerator | ||||
|             $description          = $entry[0]->name . ' (' . $entry[1]->format('jS M Y') . ')'; | ||||
|             $amount               = ($entry[0]->amount_max + $entry[0]->amount_min) / 2; | ||||
|             $unpaidDescriptions[] = $description; | ||||
|             $unpaidAmount += $amount; | ||||
|             $unpaidAmount         = bcadd($unpaidAmount, $amount); | ||||
|             unset($amount, $description); | ||||
|         } | ||||
|  | ||||
| @@ -77,7 +79,12 @@ class GoogleBillChartGenerator implements BillChartGenerator | ||||
|  | ||||
|         /** @var TransactionJournal $result */ | ||||
|         foreach ($entries as $result) { | ||||
|             $chart->addRow(clone $result->date, floatval($bill->amount_max), floatval($bill->amount_min), floatval($result->amount)); | ||||
|             $chart->addRow( | ||||
|                 clone $result->date, | ||||
|                 floatval($bill->amount_max), | ||||
|                 floatval($bill->amount_min), | ||||
|                 floatval($result->amount) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         $chart->generate(); | ||||
|   | ||||
| @@ -28,7 +28,6 @@ class ChartJsBudgetChartGenerator implements BudgetChartGenerator | ||||
|         $format   = Config::get('firefly.' . $dateFormat . '.' . $language); | ||||
|  | ||||
|         $data = [ | ||||
|             'count'    => 1, | ||||
|             'labels'   => [], | ||||
|             'datasets' => [ | ||||
|                 [ | ||||
| @@ -45,6 +44,8 @@ class ChartJsBudgetChartGenerator implements BudgetChartGenerator | ||||
|  | ||||
|         } | ||||
|  | ||||
|         $data['count'] = count($data['datasets']); | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
| @@ -118,7 +119,6 @@ class ChartJsBudgetChartGenerator implements BudgetChartGenerator | ||||
|         $format   = Config::get('firefly.month.' . $language); | ||||
|  | ||||
|         $data = [ | ||||
|             'count'    => 0, | ||||
|             'labels'   => [], | ||||
|             'datasets' => [], | ||||
|         ]; | ||||
|   | ||||
| @@ -37,6 +37,7 @@ class GoogleBudgetChartGenerator implements BudgetChartGenerator | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Collection $entries | ||||
|      * | ||||
|      * @return array | ||||
|   | ||||
| @@ -17,7 +17,7 @@ class ChartJsCategoryChartGenerator implements CategoryChartGenerator | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $entries | ||||
|      * @param string $dateFormat | ||||
|      * @param string     $dateFormat | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
| @@ -76,6 +76,7 @@ class ChartJsCategoryChartGenerator implements CategoryChartGenerator | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param Collection $entries | ||||
|      * | ||||
|      * @return array | ||||
|   | ||||
| @@ -99,6 +99,7 @@ class GoogleCategoryChartGenerator implements CategoryChartGenerator | ||||
|             $chart->addRowArray($entry); | ||||
|         } | ||||
|         $chart->generate(); | ||||
|  | ||||
|         return $chart->getData(); | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
| namespace FireflyIII\Generator\Chart\Report; | ||||
|  | ||||
| use Config; | ||||
| use Grumpydictator\Gchart\GChart; | ||||
| use Illuminate\Support\Collection; | ||||
| use Preferences; | ||||
|  | ||||
| @@ -62,7 +61,7 @@ class ChartJsReportChartGenerator implements ReportChartGenerator | ||||
|  | ||||
|         $data                          = [ | ||||
|             'count'    => 2, | ||||
|             'labels'   => [], | ||||
|             'labels'   => [trans('firefly.sum_of_year'), trans('firefly.average_of_year')], | ||||
|             'datasets' => [ | ||||
|                 [ | ||||
|                     'label' => trans('firefly.income'), | ||||
| @@ -78,6 +77,7 @@ class ChartJsReportChartGenerator implements ReportChartGenerator | ||||
|         $data['datasets'][1]['data'][] = round($expense, 2); | ||||
|         $data['datasets'][0]['data'][] = round(($income / $count), 2); | ||||
|         $data['datasets'][1]['data'][] = round(($expense / $count), 2); | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php namespace FireflyIII\Handlers\Events; | ||||
|  | ||||
| use App; | ||||
| use FireflyIII\Events\JournalSaved; | ||||
| use Log; | ||||
|  | ||||
| @@ -36,7 +35,7 @@ class RescanJournal | ||||
|         Log::debug('Triggered saved event for journal #' . $journal->id . ' (' . $journal->description . ')'); | ||||
|  | ||||
|         /** @var \FireflyIII\Repositories\Bill\BillRepositoryInterface $repository */ | ||||
|         $repository = App::make('FireflyIII\Repositories\Bill\BillRepositoryInterface'); | ||||
|         $repository = app('FireflyIII\Repositories\Bill\BillRepositoryInterface'); | ||||
|         $list       = $journal->user->bills()->where('active', 1)->where('automatch', 1)->get(); | ||||
|  | ||||
|         Log::debug('Found ' . $list->count() . ' bills to check.'); | ||||
|   | ||||
							
								
								
									
										38
									
								
								app/Helpers/Csv/Converter/AccountId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/Helpers/Csv/Converter/AccountId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class AccountId | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class AccountId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Account | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|  | ||||
|             /** @var Account $account */ | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|  | ||||
|             /** @var Account $account */ | ||||
|             $account = Auth::user()->accounts()->find($this->value); | ||||
|  | ||||
|             if (!is_null($account)) { | ||||
|                 Log::debug('Found ' . $account->accountType->type . ' named "******" with ID: ' . $this->value.' (not mapped) '); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								app/Helpers/Csv/Converter/Amount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								app/Helpers/Csv/Converter/Amount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\Account; | ||||
|  | ||||
| /** | ||||
|  * Class Amount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class Amount extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (is_numeric($this->value)) { | ||||
|             return $this->value; | ||||
|         } | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										68
									
								
								app/Helpers/Csv/Converter/AssetAccountIban.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								app/Helpers/Csv/Converter/AssetAccountIban.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
|  | ||||
| /** | ||||
|  * Class AssetAccountIban | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class AssetAccountIban extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|  | ||||
|             return $account; | ||||
|         } | ||||
|         if (strlen($this->value) > 0) { | ||||
|             // find or create new account: | ||||
|             $account     = $this->findAccount(); | ||||
|             $accountType = AccountType::where('type', 'Asset account')->first(); | ||||
|  | ||||
|             if (is_null($account)) { | ||||
|                 // create it if doesn't exist. | ||||
|                 $account = Account::firstOrCreateEncrypted( | ||||
|                     [ | ||||
|                         'name'            => $this->value, | ||||
|                         'iban'            => $this->value, | ||||
|                         'user_id'         => Auth::user()->id, | ||||
|                         'account_type_id' => $accountType->id, | ||||
|                         'active'          => 1, | ||||
|                     ] | ||||
|                 ); | ||||
|             } | ||||
|  | ||||
|             return $account; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function findAccount() | ||||
|     { | ||||
|         $set = Auth::user()->accounts()->accountTypeIn(['Default account', 'Asset account'])->get(['accounts.*']); | ||||
|         /** @var Account $entry */ | ||||
|         foreach ($set as $entry) { | ||||
|             if ($entry->iban == $this->value) { | ||||
|  | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										51
									
								
								app/Helpers/Csv/Converter/AssetAccountName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								app/Helpers/Csv/Converter/AssetAccountName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
|  | ||||
| /** | ||||
|  * Class AssetAccountName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class AssetAccountName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|  | ||||
|             return $account; | ||||
|         } | ||||
|         // find or create new account: | ||||
|         $accountType = AccountType::where('type', 'Asset account')->first(); | ||||
|         $set         = Auth::user()->accounts()->accountTypeIn(['Asset account', 'Default account'])->get(); | ||||
|         /** @var Account $entry */ | ||||
|         foreach ($set as $entry) { | ||||
|             if ($entry->name == $this->value) { | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // create it if doesnt exist. | ||||
|         $account = Account::firstOrCreateEncrypted( | ||||
|             [ | ||||
|                 'name'            => $this->value, | ||||
|                 'iban'            => '', | ||||
|                 'user_id'         => Auth::user()->id, | ||||
|                 'account_type_id' => $accountType->id, | ||||
|                 'active'          => 1, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										122
									
								
								app/Helpers/Csv/Converter/BasicConverter.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								app/Helpers/Csv/Converter/BasicConverter.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| /** | ||||
|  * Class BasicConverter | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class BasicConverter | ||||
| { | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|     /** @var string */ | ||||
|     protected $field; | ||||
|     /** @var int */ | ||||
|     protected $index; | ||||
|     /** @var  array */ | ||||
|     protected $mapped; | ||||
|     /** @var string */ | ||||
|     protected $role; | ||||
|     /** @var string */ | ||||
|     protected $value; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getData() | ||||
|     { | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getField() | ||||
|     { | ||||
|         return $this->field; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $field | ||||
|      */ | ||||
|     public function setField($field) | ||||
|     { | ||||
|         $this->field = $field; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return int | ||||
|      */ | ||||
|     public function getIndex() | ||||
|     { | ||||
|         return $this->index; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param int $index | ||||
|      */ | ||||
|     public function setIndex($index) | ||||
|     { | ||||
|         $this->index = $index; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMapped() | ||||
|     { | ||||
|         return $this->mapped; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $mapped | ||||
|      */ | ||||
|     public function setMapped($mapped) | ||||
|     { | ||||
|         $this->mapped = $mapped; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getRole() | ||||
|     { | ||||
|         return $this->role; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $role | ||||
|      */ | ||||
|     public function setRole($role) | ||||
|     { | ||||
|         $this->role = $role; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getValue() | ||||
|     { | ||||
|         return $this->value; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $value | ||||
|      */ | ||||
|     public function setValue($value) | ||||
|     { | ||||
|         $this->value = $value; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										30
									
								
								app/Helpers/Csv/Converter/BillId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/Helpers/Csv/Converter/BillId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Bill; | ||||
|  | ||||
| /** | ||||
|  * Class BillId | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class BillId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Bill | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $bill = Auth::user()->bills()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $bill = Auth::user()->bills()->find($this->value); | ||||
|         } | ||||
|  | ||||
|         return $bill; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										38
									
								
								app/Helpers/Csv/Converter/BillName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/Helpers/Csv/Converter/BillName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Bill; | ||||
|  | ||||
| /** | ||||
|  * Class BillName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class BillName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Bill | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         $bill = null; | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $bill = Auth::user()->bills()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|  | ||||
|             $bills = Auth::user()->bills()->get(); | ||||
|             /** @var Bill $bill */ | ||||
|             foreach ($bills as $bill) { | ||||
|                 if ($bill->name == $this->value) { | ||||
|                     return $bill; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $bill; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								app/Helpers/Csv/Converter/BudgetId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/Helpers/Csv/Converter/BudgetId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Budget; | ||||
|  | ||||
| /** | ||||
|  * Class AccountId | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class BudgetId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Budget | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $budget = Auth::user()->budgets()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $budget = Auth::user()->budgets()->find($this->value); | ||||
|         } | ||||
|  | ||||
|         return $budget; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										35
									
								
								app/Helpers/Csv/Converter/BudgetName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								app/Helpers/Csv/Converter/BudgetName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Budget; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class BudgetName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Budget | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $budget = Auth::user()->budgets()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $budget = Budget::firstOrCreateEncrypted( | ||||
|                 [ | ||||
|                     'name'    => $this->value, | ||||
|                     'user_id' => Auth::user()->id, | ||||
|                     'active'  => true, | ||||
|                 ] | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         return $budget; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								app/Helpers/Csv/Converter/CategoryId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/Helpers/Csv/Converter/CategoryId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Category; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryId | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CategoryId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Category | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $category = Auth::user()->categories()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $category = Auth::user()->categories()->find($this->value); | ||||
|         } | ||||
|  | ||||
|         return $category; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Converter/CategoryName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Converter/CategoryName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Category; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CategoryName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Category | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         // is mapped? Then it's easy! | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $category = Auth::user()->categories()->find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $category = Category::firstOrCreateEncrypted( | ||||
|                 [ | ||||
|                     'name'    => $this->value, | ||||
|                     'user_id' => Auth::user()->id | ||||
|                 ] | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         return $category; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										49
									
								
								app/Helpers/Csv/Converter/ConverterInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								app/Helpers/Csv/Converter/ConverterInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| /** | ||||
|  * Interface ConverterInterface | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| interface ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return mixed | ||||
|      */ | ||||
|     public function convert(); | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data); | ||||
|  | ||||
|     /** | ||||
|      * @param string $field | ||||
|      * | ||||
|      */ | ||||
|     public function setField($field); | ||||
|  | ||||
|     /** | ||||
|      * @param int $index | ||||
|      */ | ||||
|     public function setIndex($index); | ||||
|  | ||||
|     /** | ||||
|      * @param array $mapped | ||||
|      */ | ||||
|     public function setMapped($mapped); | ||||
|  | ||||
|     /** | ||||
|      * @param string $role | ||||
|      */ | ||||
|     public function setRole($role); | ||||
|  | ||||
|     /** | ||||
|      * @param string $value | ||||
|      */ | ||||
|     public function setValue($value); | ||||
|  | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyCode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyCode.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
|  | ||||
| /** | ||||
|  * Class CurrencyCode | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CurrencyCode extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return mixed|static | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $currency = TransactionCurrency::find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $currency = TransactionCurrency::whereCode($this->value)->first(); | ||||
|         } | ||||
|  | ||||
|         return $currency; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
|  | ||||
| /** | ||||
|  * Class CurrencyId | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CurrencyId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return mixed|static | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $currency = TransactionCurrency::find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $currency = TransactionCurrency::find($this->value); | ||||
|         } | ||||
|  | ||||
|         return $currency; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencyName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
|  | ||||
| /** | ||||
|  * Class CurrencyName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CurrencyName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return mixed|static | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $currency = TransactionCurrency::find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $currency = TransactionCurrency::whereName($this->value)->first(); | ||||
|         } | ||||
|  | ||||
|         return $currency; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencySymbol.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Helpers/Csv/Converter/CurrencySymbol.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
|  | ||||
| /** | ||||
|  * Class CurrencySymbol | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class CurrencySymbol extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return mixed|static | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $currency = TransactionCurrency::find($this->mapped[$this->index][$this->value]); | ||||
|         } else { | ||||
|             $currency = TransactionCurrency::whereSymbol($this->value)->first(); | ||||
|         } | ||||
|  | ||||
|         return $currency; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								app/Helpers/Csv/Converter/Date.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/Helpers/Csv/Converter/Date.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use Session; | ||||
|  | ||||
| /** | ||||
|  * Class Date | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class Date extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Carbon | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         $format = Session::get('csv-date-format'); | ||||
|  | ||||
|         $date = Carbon::createFromFormat($format, $this->value); | ||||
|  | ||||
|         return $date; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										21
									
								
								app/Helpers/Csv/Converter/Description.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/Helpers/Csv/Converter/Description.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| /** | ||||
|  * Class Description | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class Description extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @return mixed | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         return trim($this->data['description'] . ' ' . $this->value); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										22
									
								
								app/Helpers/Csv/Converter/Ignore.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								app/Helpers/Csv/Converter/Ignore.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use FireflyIII\Models\Account; | ||||
|  | ||||
| /** | ||||
|  * Class Amount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class Ignore extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										57
									
								
								app/Helpers/Csv/Converter/OpposingAccountIban.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/Helpers/Csv/Converter/OpposingAccountIban.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class OpposingAccountIban | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class OpposingAccountIban extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * If mapped, return account. Otherwise, only return the name itself. | ||||
|      * | ||||
|      * @return Account|string | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|  | ||||
|             return $account; | ||||
|         } else { | ||||
|             if (strlen($this->value) > 0) { | ||||
|                 $account = $this->findAccount(); | ||||
|                 if (!is_null($account)) { | ||||
|                     return $account; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return $this->value; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function findAccount() | ||||
|     { | ||||
|         $set = Auth::user()->accounts()->get(); | ||||
|         /** @var Account $account */ | ||||
|         foreach ($set as $account) { | ||||
|             if ($account->iban == $this->value) { | ||||
|                 Log::debug('OpposingAccountIban::convert found an Account (#' . $account->id . ': ******) with IBAN ******'); | ||||
|  | ||||
|                 return $account; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										32
									
								
								app/Helpers/Csv/Converter/OpposingAccountId.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/Helpers/Csv/Converter/OpposingAccountId.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
|  | ||||
| /** | ||||
|  * Class OpposingName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class OpposingAccountId extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @return Account | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|  | ||||
|         } else { | ||||
|             $account = Auth::user()->accounts()->find($this->value); | ||||
|         } | ||||
|  | ||||
|         return $account; | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										31
									
								
								app/Helpers/Csv/Converter/OpposingAccountName.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								app/Helpers/Csv/Converter/OpposingAccountName.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
|  | ||||
| /** | ||||
|  * Class OpposingName | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class OpposingAccountName extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * If mapped, return account. Otherwise, only return the name itself. | ||||
|      * | ||||
|      * @return Account|string | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if (isset($this->mapped[$this->index][$this->value])) { | ||||
|             $account = Auth::user()->accounts()->find($this->mapped[$this->index][$this->value]); | ||||
|  | ||||
|             return $account; | ||||
|         } else { | ||||
|             return $this->value; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								app/Helpers/Csv/Converter/RabobankDebetCredit.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								app/Helpers/Csv/Converter/RabobankDebetCredit.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Class RabobankDebetCredit | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class RabobankDebetCredit extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @return mixed | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         if ($this->value == 'D') { | ||||
|             return -1; | ||||
|         } | ||||
|  | ||||
|         return 1; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										40
									
								
								app/Helpers/Csv/Converter/TagsComma.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/Helpers/Csv/Converter/TagsComma.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Models\Tag; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class TagsComma | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class TagsComma extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Bill | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         $tags = new Collection; | ||||
|  | ||||
|         $strings = explode(',', $this->value); | ||||
|         foreach ($strings as $string) { | ||||
|             $tag = Tag::firstOrCreateEncrypted( | ||||
|                 [ | ||||
|                     'tag'     => $string, | ||||
|                     'tagMode' => 'nothing', | ||||
|                     'user_id' => Auth::user()->id, | ||||
|                 ] | ||||
|             ); | ||||
|             $tags->push($tag); | ||||
|         } | ||||
|         $tags = $tags->merge($this->data['tags']); | ||||
|  | ||||
|         return $tags; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										40
									
								
								app/Helpers/Csv/Converter/TagsSpace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/Helpers/Csv/Converter/TagsSpace.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Converter; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Models\Tag; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class TagsSpace | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Converter | ||||
|  */ | ||||
| class TagsSpace extends BasicConverter implements ConverterInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return Bill | ||||
|      */ | ||||
|     public function convert() | ||||
|     { | ||||
|         $tags = new Collection; | ||||
|  | ||||
|         $strings = explode(' ', $this->value); | ||||
|         foreach ($strings as $string) { | ||||
|             $tag = Tag::firstOrCreateEncrypted( | ||||
|                 [ | ||||
|                     'tag'     => $string, | ||||
|                     'tagMode' => 'nothing', | ||||
|                     'user_id' => Auth::user()->id, | ||||
|                 ] | ||||
|             ); | ||||
|             $tags->push($tag); | ||||
|         } | ||||
|         $tags = $tags->merge($this->data['tags']); | ||||
|  | ||||
|         return $tags; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										283
									
								
								app/Helpers/Csv/Data.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								app/Helpers/Csv/Data.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,283 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv; | ||||
|  | ||||
| use Crypt; | ||||
| use League\Csv\Reader; | ||||
| use Session; | ||||
|  | ||||
| /** | ||||
|  * Class Data | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv | ||||
|  */ | ||||
| class Data | ||||
| { | ||||
|  | ||||
|     /** @var string */ | ||||
|     protected $csvFileContent; | ||||
|  | ||||
|     /** @var string */ | ||||
|     protected $csvFileLocation; | ||||
|     /** @var  string */ | ||||
|     protected $dateFormat; | ||||
|     /** @var  bool */ | ||||
|     protected $hasHeaders; | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $map = []; | ||||
|     /** @var  array */ | ||||
|     protected $mapped = []; | ||||
|     /** @var  Reader */ | ||||
|     protected $reader; | ||||
|     /** @var  array */ | ||||
|     protected $roles = []; | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $specifix = []; | ||||
|  | ||||
|     /** @var int */ | ||||
|     protected $importAccount = 0; | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         $this->sessionHasHeaders(); | ||||
|         $this->sessionDateFormat(); | ||||
|         $this->sessionCsvFileLocation(); | ||||
|         $this->sessionMap(); | ||||
|         $this->sessionRoles(); | ||||
|         $this->sessionMapped(); | ||||
|         $this->sessionSpecifix(); | ||||
|         $this->sessionImportAccount(); | ||||
|     } | ||||
|  | ||||
|     protected function sessionHasHeaders() | ||||
|     { | ||||
|         if (Session::has('csv-has-headers')) { | ||||
|             $this->hasHeaders = (bool)Session::get('csv-has-headers'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionImportAccount() | ||||
|     { | ||||
|         if (Session::has('csv-import-account')) { | ||||
|             $this->importAccount = intval(Session::get('csv-import-account')); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionDateFormat() | ||||
|     { | ||||
|         if (Session::has('csv-date-format')) { | ||||
|             $this->dateFormat = (string)Session::get('csv-date-format'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionCsvFileLocation() | ||||
|     { | ||||
|         if (Session::has('csv-file')) { | ||||
|             $this->csvFileLocation = (string)Session::get('csv-file'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionMap() | ||||
|     { | ||||
|         if (Session::has('csv-map')) { | ||||
|             $this->map = (array)Session::get('csv-map'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionRoles() | ||||
|     { | ||||
|         if (Session::has('csv-roles')) { | ||||
|             $this->roles = (array)Session::get('csv-roles'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionMapped() | ||||
|     { | ||||
|         if (Session::has('csv-mapped')) { | ||||
|             $this->mapped = (array)Session::get('csv-mapped'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function sessionSpecifix() | ||||
|     { | ||||
|         if (Session::has('csv-specifix')) { | ||||
|             $this->specifix = (array)Session::get('csv-specifix'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getDateFormat() | ||||
|     { | ||||
|         return $this->dateFormat; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param mixed $dateFormat | ||||
|      */ | ||||
|     public function setDateFormat($dateFormat) | ||||
|     { | ||||
|         Session::put('csv-date-format', $dateFormat); | ||||
|         $this->dateFormat = $dateFormat; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param int $importAccount | ||||
|      */ | ||||
|     public function setImportAccount($importAccount) | ||||
|     { | ||||
|         Session::put('csv-import-account', $importAccount); | ||||
|         $this->importAccount = $importAccount; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function hasHeaders() | ||||
|     { | ||||
|         return $this->hasHeaders; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param bool $hasHeaders | ||||
|      */ | ||||
|     public function setHasHeaders($hasHeaders) | ||||
|     { | ||||
|         Session::put('csv-has-headers', $hasHeaders); | ||||
|         $this->hasHeaders = $hasHeaders; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         return $this->map; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $map | ||||
|      */ | ||||
|     public function setMap(array $map) | ||||
|     { | ||||
|         Session::put('csv-map', $map); | ||||
|         $this->map = $map; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMapped() | ||||
|     { | ||||
|         return $this->mapped; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $mapped | ||||
|      */ | ||||
|     public function setMapped(array $mapped) | ||||
|     { | ||||
|         Session::put('csv-mapped', $mapped); | ||||
|         $this->mapped = $mapped; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Reader | ||||
|      */ | ||||
|     public function getReader() | ||||
|     { | ||||
|  | ||||
|         if (strlen($this->csvFileContent) === 0) { | ||||
|             $this->loadCsvFile(); | ||||
|         } | ||||
|  | ||||
|         if (is_null($this->reader)) { | ||||
|             $this->reader = Reader::createFromString($this->getCsvFileContent()); | ||||
|         } | ||||
|  | ||||
|         return $this->reader; | ||||
|     } | ||||
|  | ||||
|     protected function loadCsvFile() | ||||
|     { | ||||
|         $file             = $this->getCsvFileLocation(); | ||||
|         $content          = file_get_contents($file); | ||||
|         $contentDecrypted = Crypt::decrypt($content); | ||||
|         $this->setCsvFileContent($contentDecrypted); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getCsvFileLocation() | ||||
|     { | ||||
|         return $this->csvFileLocation; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $csvFileLocation | ||||
|      */ | ||||
|     public function setCsvFileLocation($csvFileLocation) | ||||
|     { | ||||
|         Session::put('csv-file', $csvFileLocation); | ||||
|         $this->csvFileLocation = $csvFileLocation; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getCsvFileContent() | ||||
|     { | ||||
|         return $this->csvFileContent; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $csvFileContent | ||||
|      */ | ||||
|     public function setCsvFileContent($csvFileContent) | ||||
|     { | ||||
|         $this->csvFileContent = $csvFileContent; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getRoles() | ||||
|     { | ||||
|         return $this->roles; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $roles | ||||
|      */ | ||||
|     public function setRoles(array $roles) | ||||
|     { | ||||
|         Session::put('csv-roles', $roles); | ||||
|         $this->roles = $roles; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getSpecifix() | ||||
|     { | ||||
|         return is_array($this->specifix) ? $this->specifix : []; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $specifix | ||||
|      */ | ||||
|     public function setSpecifix($specifix) | ||||
|     { | ||||
|         Session::put('csv-specifix', $specifix); | ||||
|         $this->specifix = $specifix; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										371
									
								
								app/Helpers/Csv/Importer.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										371
									
								
								app/Helpers/Csv/Importer.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,371 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv; | ||||
|  | ||||
| use Auth; | ||||
| use Config; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Csv\Converter\ConverterInterface; | ||||
| use FireflyIII\Helpers\Csv\PostProcessing\PostProcessorInterface; | ||||
| use FireflyIII\Helpers\Csv\Specifix\SpecifixInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Transaction; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Models\TransactionType; | ||||
| use Illuminate\Support\Collection; | ||||
| use Illuminate\Support\MessageBag; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class Importer | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv | ||||
|  */ | ||||
| class Importer | ||||
| { | ||||
|  | ||||
|     /** @var Data */ | ||||
|     protected $data; | ||||
|     /** @var array */ | ||||
|     protected $errors; | ||||
|     /** @var  array */ | ||||
|     protected $importData; | ||||
|     /** @var  array */ | ||||
|     protected $importRow; | ||||
|     /** @var int */ | ||||
|     protected $imported = 0; | ||||
|     /** @var array */ | ||||
|     protected $map; | ||||
|     /** @var  array */ | ||||
|     protected $mapped; | ||||
|     /** @var  array */ | ||||
|     protected $roles; | ||||
|     /** @var  int */ | ||||
|     protected $rows = 0; | ||||
|     /** @var array */ | ||||
|     protected $specifix = []; | ||||
|  | ||||
|     /** @var  Collection */ | ||||
|     protected $journals; | ||||
|  | ||||
|     /** | ||||
|      * Used by CsvController. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getErrors() | ||||
|     { | ||||
|         return $this->errors; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Used by CsvController | ||||
|      * | ||||
|      * @return int | ||||
|      */ | ||||
|     public function getImported() | ||||
|     { | ||||
|         return $this->imported; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Used by CsvController | ||||
|      * | ||||
|      * @return int | ||||
|      */ | ||||
|     public function getRows() | ||||
|     { | ||||
|         return $this->rows; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Collection | ||||
|      */ | ||||
|     public function getJournals() | ||||
|     { | ||||
|         return $this->journals; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function run() | ||||
|     { | ||||
|         set_time_limit(0); | ||||
|  | ||||
|         $this->journals = new Collection; | ||||
|         $this->map      = $this->data->getMap(); | ||||
|         $this->roles    = $this->data->getRoles(); | ||||
|         $this->mapped   = $this->data->getMapped(); | ||||
|         $this->specifix = $this->data->getSpecifix(); | ||||
|  | ||||
|         foreach ($this->data->getReader() as $index => $row) { | ||||
|             if ($this->parseRow($index)) { | ||||
|                 Log::debug('--- Importing row ' . $index); | ||||
|                 $this->rows++; | ||||
|                 $result = $this->importRow($row); | ||||
|                 if (!($result instanceof TransactionJournal)) { | ||||
|                     Log::error('Caught error at row #' . $index . ': ' . $result); | ||||
|                     $this->errors[$index] = $result; | ||||
|                 } else { | ||||
|                     $this->imported++; | ||||
|                     $this->journals->push($result); | ||||
|                 } | ||||
|                 Log::debug('---'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param int $index | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function parseRow($index) | ||||
|     { | ||||
|         return (($this->data->hasHeaders() && $index > 1) || !$this->data->hasHeaders()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param $row | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * @return string|bool | ||||
|      */ | ||||
|     protected function importRow($row) | ||||
|     { | ||||
|  | ||||
|         $data = $this->getFiller(); // These fields are necessary to create a new transaction journal. Some are optional | ||||
|         foreach ($row as $index => $value) { | ||||
|             $role  = isset($this->roles[$index]) ? $this->roles[$index] : '_ignore'; | ||||
|             $class = Config::get('csv.roles.' . $role . '.converter'); | ||||
|             $field = Config::get('csv.roles.' . $role . '.field'); | ||||
|  | ||||
|             Log::debug('Column #' . $index . ' (role: ' . $role . ') : converter ' . $class . ' stores its data into field ' . $field . ':'); | ||||
|  | ||||
|             /** @var ConverterInterface $converter */ | ||||
|             $converter = app('FireflyIII\Helpers\Csv\Converter\\' . $class); | ||||
|             $converter->setData($data); // the complete array so far. | ||||
|             $converter->setField($field); | ||||
|             $converter->setIndex($index); | ||||
|             $converter->setMapped($this->mapped); | ||||
|             $converter->setValue($value); | ||||
|             $converter->setRole($role); | ||||
|             $data[$field] = $converter->convert(); | ||||
|         } | ||||
|         // move to class vars. | ||||
|         $this->importData = $data; | ||||
|         $this->importRow  = $row; | ||||
|         unset($data, $row); | ||||
|         // post processing and validating. | ||||
|         $this->postProcess(); | ||||
|         $result = $this->validateData(); | ||||
|  | ||||
|         if (!($result === true)) { | ||||
|             return $result; // return error. | ||||
|         } | ||||
|         $journal = $this->createTransactionJournal(); | ||||
|  | ||||
|         return $journal; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function getFiller() | ||||
|     { | ||||
|         $filler = []; | ||||
|         foreach (Config::get('csv.roles') as $role) { | ||||
|             if (isset($role['field'])) { | ||||
|                 $fieldName          = $role['field']; | ||||
|                 $filler[$fieldName] = null; | ||||
|             } | ||||
|         } | ||||
|         // some extra's: | ||||
|         $filler['bill-id']                 = null; | ||||
|         $filler['opposing-account-object'] = null; | ||||
|         $filler['asset-account-object']    = null; | ||||
|         $filler['amount-modifier']         = '1'; | ||||
|  | ||||
|         return $filler; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Row denotes the original data. | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function postProcess() | ||||
|     { | ||||
|         // do bank specific fixes (must be enabled but now all of them. | ||||
|  | ||||
|         foreach ($this->getSpecifix() as $className) { | ||||
|             /** @var SpecifixInterface $specifix */ | ||||
|             $specifix = app('FireflyIII\Helpers\Csv\Specifix\\' . $className); | ||||
|             $specifix->setData($this->importData); | ||||
|             $specifix->setRow($this->importRow); | ||||
|             Log::debug('Now post-process specifix named ' . $className . ':'); | ||||
|             $this->importData = $specifix->fix(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         $set = Config::get('csv.post_processors'); | ||||
|         foreach ($set as $className) { | ||||
|             /** @var PostProcessorInterface $postProcessor */ | ||||
|             $postProcessor = app('FireflyIII\Helpers\Csv\PostProcessing\\' . $className); | ||||
|             $postProcessor->setData($this->importData); | ||||
|             Log::debug('Now post-process processor named ' . $className . ':'); | ||||
|             $this->importData = $postProcessor->process(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getSpecifix() | ||||
|     { | ||||
|         return is_array($this->specifix) ? $this->specifix : []; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return bool|string | ||||
|      */ | ||||
|     protected function validateData() | ||||
|     { | ||||
|         if (is_null($this->importData['date']) && is_null($this->importData['date-rent'])) { | ||||
|             return 'No date value for this row.'; | ||||
|         } | ||||
|         if (is_null($this->importData['opposing-account-object'])) { | ||||
|             return 'Opposing account is null'; | ||||
|         } | ||||
|  | ||||
|         if (!($this->importData['asset-account-object'] instanceof Account)) { | ||||
|             return 'No asset account to import into.'; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return TransactionJournal|string | ||||
|      */ | ||||
|     protected function createTransactionJournal() | ||||
|     { | ||||
|         bcscale(2); | ||||
|         $date = $this->importData['date']; | ||||
|         if (is_null($this->importData['date'])) { | ||||
|             $date = $this->importData['date-rent']; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         $transactionType = $this->getTransactionType(); // defaults to deposit | ||||
|         $errors          = new MessageBag; | ||||
|         $journal         = TransactionJournal::create( | ||||
|             ['user_id'     => Auth::user()->id, 'transaction_type_id' => $transactionType->id, 'transaction_currency_id' => $this->importData['currency']->id, | ||||
|              'description' => $this->importData['description'], 'completed' => 0, 'date' => $date, 'bill_id' => $this->importData['bill-id'],] | ||||
|         ); | ||||
|         if ($journal->getErrors()->count() == 0) { | ||||
|             // first transaction | ||||
|             $accountId   = $this->importData['asset-account-object']->id; // create first transaction: | ||||
|             $amount      = $this->importData['amount']; | ||||
|             $transaction = Transaction::create(['transaction_journal_id' => $journal->id, 'account_id' => $accountId, 'amount' => $amount]); | ||||
|             $errors      = $transaction->getErrors(); | ||||
|  | ||||
|             // second transaction | ||||
|             $accountId   = $this->importData['opposing-account-object']->id; // create second transaction: | ||||
|             $amount      = bcmul($this->importData['amount'], -1); | ||||
|             $transaction = Transaction::create(['transaction_journal_id' => $journal->id, 'account_id' => $accountId, 'amount' => $amount]); | ||||
|             $errors      = $transaction->getErrors()->merge($errors); | ||||
|         } | ||||
|         if ($errors->count() == 0) { | ||||
|             $journal->completed = 1; | ||||
|             $journal->save(); | ||||
|         } else { | ||||
|             $text = join(',', $errors->all()); | ||||
|  | ||||
|             return $text; | ||||
|         } | ||||
|         $this->saveBudget($journal); | ||||
|         $this->saveCategory($journal); | ||||
|         $this->saveTags($journal); | ||||
|  | ||||
|         // some debug info: | ||||
|         $journalId = $journal->id; | ||||
|         $type      = $journal->transactionType->type; | ||||
|         /** @var Account $asset */ | ||||
|         $asset = $this->importData['asset-account-object']; | ||||
|         /** @var Account $opposing */ | ||||
|         $opposing = $this->importData['opposing-account-object']; | ||||
|  | ||||
|         Log::info('Created journal #' . $journalId . ' of type ' . $type . '!'); | ||||
|         Log::info('Asset account ****** (#' . $asset->id . ') lost/gained: ' . $this->importData['amount']); | ||||
|         Log::info($opposing->accountType->type . ' ****** (#' . $opposing->id . ') lost/gained: ' . bcmul($this->importData['amount'], -1)); | ||||
|  | ||||
|         return $journal; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return TransactionType | ||||
|      */ | ||||
|     protected function getTransactionType() | ||||
|     { | ||||
|         $transactionType = TransactionType::where('type', 'Deposit')->first(); | ||||
|         if ($this->importData['amount'] < 0) { | ||||
|             $transactionType = TransactionType::where('type', 'Withdrawal')->first(); | ||||
|         } | ||||
|  | ||||
|         if (in_array($this->importData['opposing-account-object']->accountType->type, ['Asset account', 'Default account'])) { | ||||
|             $transactionType = TransactionType::where('type', 'Transfer')->first(); | ||||
|         } | ||||
|  | ||||
|         return $transactionType; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param TransactionJournal $journal | ||||
|      */ | ||||
|     protected function saveBudget(TransactionJournal $journal) | ||||
|     { | ||||
|         // add budget: | ||||
|         if (!is_null($this->importData['budget'])) { | ||||
|             $journal->budgets()->save($this->importData['budget']); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param TransactionJournal $journal | ||||
|      */ | ||||
|     protected function saveCategory(TransactionJournal $journal) | ||||
|     { | ||||
|         // add category: | ||||
|         if (!is_null($this->importData['category'])) { | ||||
|             $journal->categories()->save($this->importData['category']); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param TransactionJournal $journal | ||||
|      */ | ||||
|     protected function saveTags(TransactionJournal $journal) | ||||
|     { | ||||
|         if (!is_null($this->importData['tags'])) { | ||||
|             foreach ($this->importData['tags'] as $tag) { | ||||
|                 $journal->tags()->save($tag); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Data $data | ||||
|      */ | ||||
|     public function setData($data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Mapper/AnyAccount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Mapper/AnyAccount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
|  | ||||
| /** | ||||
|  * Class AnyAccount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class AnyAccount implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->accounts()->with('accountType')->orderBy('accounts.name', 'ASC')->get(['accounts.*']); | ||||
|  | ||||
|         $list = []; | ||||
|         /** @var Account $account */ | ||||
|         foreach ($result as $account) { | ||||
|             $list[$account->id] = $account->name . ' (' . $account->accountType->type . ')'; | ||||
|         } | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										45
									
								
								app/Helpers/Csv/Mapper/AssetAccount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								app/Helpers/Csv/Mapper/AssetAccount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use Illuminate\Database\Eloquent\Relations\HasMany; | ||||
|  | ||||
| /** | ||||
|  * Class AssetAccount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class AssetAccount implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->accounts()->with( | ||||
|             ['accountmeta' => function (HasMany $query) { | ||||
|                 $query->where('name', 'accountRole'); | ||||
|             }] | ||||
|         )->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC')->get(['accounts.*']); | ||||
|  | ||||
|         $list = []; | ||||
|  | ||||
|         /** @var Account $account */ | ||||
|         foreach ($result as $account) { | ||||
|             $name = $account->name; | ||||
|             if (strlen($account->iban) > 0) { | ||||
|                 $name .= ' (' . $account->iban . ')'; | ||||
|             } | ||||
|             $list[$account->id] = $name; | ||||
|         } | ||||
|  | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Mapper/Bill.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Mapper/Bill.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Bill as BillModel; | ||||
|  | ||||
| /** | ||||
|  * Class Bill | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class Bill implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->bills()->get(['bills.*']); | ||||
|         $list   = []; | ||||
|  | ||||
|         /** @var BillModel $bill */ | ||||
|         foreach ($result as $bill) { | ||||
|             $list[$bill->id] = $bill->name . ' [' . $bill->match . ']'; | ||||
|         } | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Mapper/Budget.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Mapper/Budget.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Budget as BudgetModel; | ||||
|  | ||||
| /** | ||||
|  * Class Budget | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class Budget implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->budgets()->get(['budgets.*']); | ||||
|         $list   = []; | ||||
|  | ||||
|         /** @var BudgetModel $budget */ | ||||
|         foreach ($result as $budget) { | ||||
|             $list[$budget->id] = $budget->name; | ||||
|         } | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Mapper/Category.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Mapper/Category.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Category as CategoryModel; | ||||
|  | ||||
| /** | ||||
|  * Class Category | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class Category implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->categories()->get(['categories.*']); | ||||
|         $list   = []; | ||||
|  | ||||
|         /** @var CategoryModel $category */ | ||||
|         foreach ($result as $category) { | ||||
|             $list[$category->id] = $category->name; | ||||
|         } | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								app/Helpers/Csv/Mapper/MapperInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Helpers/Csv/Mapper/MapperInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| /** | ||||
|  * Interface MapperInterface | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| interface MapperInterface | ||||
| { | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap(); | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Helpers/Csv/Mapper/Tag.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Helpers/Csv/Mapper/Tag.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Tag as TagModel; | ||||
|  | ||||
| /** | ||||
|  * Class Tag | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class Tag implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $result = Auth::user()->budgets()->get(['tags.*']); | ||||
|         $list   = []; | ||||
|  | ||||
|         /** @var TagModel $tag */ | ||||
|         foreach ($result as $tag) { | ||||
|             $list[$tag->id] = $tag->tag; | ||||
|         } | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										32
									
								
								app/Helpers/Csv/Mapper/TransactionCurrency.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/Helpers/Csv/Mapper/TransactionCurrency.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Mapper; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency as TC; | ||||
|  | ||||
| /** | ||||
|  * Class TransactionCurrency | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Mapper | ||||
|  */ | ||||
| class TransactionCurrency implements MapperInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMap() | ||||
|     { | ||||
|         $currencies = TC::get(); | ||||
|         $list       = []; | ||||
|         foreach ($currencies as $currency) { | ||||
|             $list[$currency->id] = $currency->name . ' (' . $currency->code . ')'; | ||||
|         } | ||||
|  | ||||
|         asort($list); | ||||
|  | ||||
|         $list = [0 => trans('firefly.csv_do_not_map')] + $list; | ||||
|  | ||||
|         return $list; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										35
									
								
								app/Helpers/Csv/PostProcessing/Amount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								app/Helpers/Csv/PostProcessing/Amount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| <?php | ||||
|  | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| /** | ||||
|  * Class Amount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class Amount implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|         bcscale(2); | ||||
|         $this->data['amount'] = bcmul($this->data['amount'], $this->data['amount-modifier']); | ||||
|  | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										185
									
								
								app/Helpers/Csv/PostProcessing/AssetAccount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								app/Helpers/Csv/PostProcessing/AssetAccount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use Log; | ||||
| use Validator; | ||||
|  | ||||
| /** | ||||
|  * Class AssetAccount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class AssetAccount implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|         $result = $this->checkIdNameObject(); // has object in ID or Name? | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         $result = $this->checkIbanString(); | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         $result = $this->checkNameString(); | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function checkIdNameObject() | ||||
|     { | ||||
|         if ($this->data['asset-account-id'] instanceof Account) { // first priority. try to find the account based on ID, if any | ||||
|             $this->data['asset-account-object'] = $this->data['asset-account-id']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|         if ($this->data['asset-account-iban'] instanceof Account) { // second: try to find the account based on IBAN, if any. | ||||
|             $this->data['asset-account-object'] = $this->data['asset-account-iban']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array|null | ||||
|      */ | ||||
|     protected function checkIbanString() | ||||
|     { | ||||
|         $rules     = ['iban' => 'iban']; | ||||
|         $check     = ['iban' => $this->data['asset-account-iban']]; | ||||
|         $validator = Validator::make($check, $rules); | ||||
|         if (!$validator->fails()) { | ||||
|             $this->data['asset-account-object'] = $this->parseIbanString(); | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function parseIbanString() | ||||
|     { | ||||
|         // create by name and/or iban. | ||||
|         $accounts = Auth::user()->accounts()->get(); | ||||
|         foreach ($accounts as $entry) { | ||||
|             if ($entry->iban == $this->data['asset-account-iban']) { | ||||
|  | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|         $account = $this->createAccount(); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function createAccount() | ||||
|     { | ||||
|         $accountType = $this->getAccountType(); | ||||
|  | ||||
|         // create if not exists: | ||||
|         $name    = is_string($this->data['asset-account-name']) && strlen($this->data['asset-account-name']) > 0 ? $this->data['asset-account-name'] | ||||
|             : $this->data['asset-account-iban']; | ||||
|         $account = Account::firstOrCreateEncrypted( | ||||
|             [ | ||||
|                 'user_id'         => Auth::user()->id, | ||||
|                 'account_type_id' => $accountType->id, | ||||
|                 'name'            => $name, | ||||
|                 'iban'            => $this->data['asset-account-iban'], | ||||
|                 'active'          => true, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return AccountType | ||||
|      */ | ||||
|     protected function getAccountType() | ||||
|     { | ||||
|         return AccountType::where('type', 'Asset account')->first(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array|null | ||||
|      */ | ||||
|     protected function checkNameString() | ||||
|     { | ||||
|         if ($this->data['asset-account-name'] instanceof Account) { // third: try to find account based on name, if any. | ||||
|             $this->data['asset-account-object'] = $this->data['asset-account-name']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|         if (is_string($this->data['asset-account-name'])) { | ||||
|             $this->data['asset-account-object'] = $this->parseNameString(); | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function parseNameString() | ||||
|     { | ||||
|         $accountType = $this->getAccountType(); | ||||
|         $accounts    = Auth::user()->accounts()->where('account_type_id', $accountType->id)->get(); | ||||
|         foreach ($accounts as $entry) { | ||||
|             if ($entry->name == $this->data['asset-account-name']) { | ||||
|                 Log::debug('Found an asset account with this name (#' . $entry->id . ': ******)'); | ||||
|  | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|         // create if not exists: | ||||
|         $account = Account::firstOrCreateEncrypted( | ||||
|             [ | ||||
|                 'user_id'         => Auth::user()->id, | ||||
|                 'account_type_id' => $accountType->id, | ||||
|                 'name'            => $this->data['asset-account-name'], | ||||
|                 'iban'            => '', | ||||
|                 'active'          => true, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										37
									
								
								app/Helpers/Csv/PostProcessing/Bill.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								app/Helpers/Csv/PostProcessing/Bill.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| /** | ||||
|  * Class Bill | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class Bill implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|  | ||||
|         // get bill id. | ||||
|         if (!is_null($this->data['bill'])) { | ||||
|             $this->data['bill-id'] = $this->data['bill']->id; | ||||
|         } | ||||
|  | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										41
									
								
								app/Helpers/Csv/PostProcessing/Currency.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								app/Helpers/Csv/PostProcessing/Currency.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * Class Currency | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class Currency implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|  | ||||
|         // fix currency | ||||
|         if (is_null($this->data['currency'])) { | ||||
|             $currencyPreference     = Preferences::get('currencyPreference', 'EUR'); | ||||
|             $this->data['currency'] = TransactionCurrency::whereCode($currencyPreference->data)->first(); | ||||
|         } | ||||
|  | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										38
									
								
								app/Helpers/Csv/PostProcessing/Description.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/Helpers/Csv/PostProcessing/Description.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| /** | ||||
|  * Class Description | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class Description implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|         $this->data['description'] = trim($this->data['description']); | ||||
|         if (strlen($this->data['description']) == 0) { | ||||
|             $this->data['description'] = trans('firefly.csv_empty_description'); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|  | ||||
|         $this->data = $data; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										210
									
								
								app/Helpers/Csv/PostProcessing/OpposingAccount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								app/Helpers/Csv/PostProcessing/OpposingAccount.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
| use Auth; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use Log; | ||||
| use Validator; | ||||
|  | ||||
| /** | ||||
|  * Class OpposingAccount | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| class OpposingAccount implements PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** @var  array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|         // three values: | ||||
|         // opposing-account-id, opposing-account-iban, opposing-account-name | ||||
|  | ||||
|  | ||||
|         $result = $this->checkIdNameObject(); | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         $result = $this->checkIbanString(); | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         $result = $this->checkNameString(); | ||||
|         if (!is_null($result)) { | ||||
|             return $result; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function checkIdNameObject() | ||||
|     { | ||||
|         if ($this->data['opposing-account-id'] instanceof Account) { // first priority. try to find the account based on ID, if any | ||||
|             Log::debug('OpposingAccountPostProcession: opposing-account-id is an Account.'); | ||||
|             $this->data['opposing-account-object'] = $this->data['opposing-account-id']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|         if ($this->data['opposing-account-iban'] instanceof Account) { // second: try to find the account based on IBAN, if any. | ||||
|             Log::debug('OpposingAccountPostProcession: opposing-account-iban is an Account.'); | ||||
|             $this->data['opposing-account-object'] = $this->data['opposing-account-iban']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array|null | ||||
|      */ | ||||
|     protected function checkIbanString() | ||||
|     { | ||||
|         $rules     = ['iban' => 'iban']; | ||||
|         $iban      = $this->data['opposing-account-iban']; | ||||
|         $check     = ['iban' => $iban]; | ||||
|         $validator = Validator::make($check, $rules); | ||||
|         if (is_string($iban) && strlen($iban) > 0 && !$validator->fails()) { | ||||
|  | ||||
|             Log::debug('OpposingAccountPostProcession: opposing-account-iban is a string (******).'); | ||||
|             $this->data['opposing-account-object'] = $this->parseIbanString(); | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function parseIbanString() | ||||
|     { | ||||
|         // create by name and/or iban. | ||||
|         $accounts = Auth::user()->accounts()->get(); | ||||
|         foreach ($accounts as $entry) { | ||||
|             if ($entry->iban == $this->data['opposing-account-iban']) { | ||||
|                 Log::debug('OpposingAccountPostProcession: opposing-account-iban matches an Account.'); | ||||
|  | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|         $account = $this->createAccount(); | ||||
|  | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function createAccount() | ||||
|     { | ||||
|         $accountType = $this->getAccountType(); | ||||
|  | ||||
|         // create if not exists: | ||||
|         $name    = is_string($this->data['opposing-account-name']) && strlen($this->data['opposing-account-name']) > 0 ? $this->data['opposing-account-name'] | ||||
|             : $this->data['opposing-account-iban']; | ||||
|         $account = Account::firstOrCreateEncrypted( | ||||
|             [ | ||||
|                 'user_id'         => Auth::user()->id, | ||||
|                 'account_type_id' => $accountType->id, | ||||
|                 'name'            => $name, | ||||
|                 'iban'            => $this->data['opposing-account-iban'], | ||||
|                 'active'          => true, | ||||
|             ] | ||||
|         ); | ||||
|         Log::debug('OpposingAccountPostProcession: created a new account.'); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return AccountType | ||||
|      */ | ||||
|     protected function getAccountType() | ||||
|     { | ||||
|         // opposing account type: | ||||
|         if ($this->data['amount'] < 0) { | ||||
|             // create expense account: | ||||
|  | ||||
|             return AccountType::where('type', 'Expense account')->first(); | ||||
|         } else { | ||||
|             // create revenue account: | ||||
|  | ||||
|             return AccountType::where('type', 'Revenue account')->first(); | ||||
|  | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array|null | ||||
|      */ | ||||
|     protected function checkNameString() | ||||
|     { | ||||
|         if ($this->data['opposing-account-name'] instanceof Account) { // third: try to find account based on name, if any. | ||||
|             Log::debug('OpposingAccountPostProcession: opposing-account-name is an Account.'); | ||||
|             $this->data['opposing-account-object'] = $this->data['opposing-account-name']; | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|         if (is_string($this->data['opposing-account-name'])) { | ||||
|  | ||||
|             $this->data['opposing-account-object'] = $this->parseNameString(); | ||||
|  | ||||
|             return $this->data; | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return Account|null | ||||
|      */ | ||||
|     protected function parseNameString() | ||||
|     { | ||||
|         $accountType = $this->getAccountType(); | ||||
|         $accounts    = Auth::user()->accounts()->where('account_type_id', $accountType->id)->get(); | ||||
|         foreach ($accounts as $entry) { | ||||
|             if ($entry->name == $this->data['opposing-account-name']) { | ||||
|                 Log::debug('Found an account with this name (#' . $entry->id . ': ******)'); | ||||
|  | ||||
|                 return $entry; | ||||
|             } | ||||
|         } | ||||
|         // create if not exists: | ||||
|         $account = Account::firstOrCreateEncrypted( | ||||
|             [ | ||||
|                 'user_id'         => Auth::user()->id, | ||||
|                 'account_type_id' => $accountType->id, | ||||
|                 'name'            => $this->data['opposing-account-name'], | ||||
|                 'iban'            => '', | ||||
|                 'active'          => true, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								app/Helpers/Csv/PostProcessing/PostProcessorInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/Helpers/Csv/PostProcessing/PostProcessorInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Created by PhpStorm. | ||||
|  * User: sander | ||||
|  * Date: 05/07/15 | ||||
|  * Time: 19:20 | ||||
|  */ | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\PostProcessing; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Interface PostProcessorInterface | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\PostProcessing | ||||
|  */ | ||||
| interface PostProcessorInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function process(); | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData(array $data); | ||||
| } | ||||
							
								
								
									
										45
									
								
								app/Helpers/Csv/Specifix/Dummy.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								app/Helpers/Csv/Specifix/Dummy.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Specifix; | ||||
|  | ||||
| /** | ||||
|  * Class Dummy | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Specifix | ||||
|  */ | ||||
| class Dummy | ||||
| { | ||||
|     /** @var array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** @var array */ | ||||
|     protected $row; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function fix() | ||||
|     { | ||||
|         return $this->data; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData($data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $row | ||||
|      */ | ||||
|     public function setRow($row) | ||||
|     { | ||||
|         $this->row = $row; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										66
									
								
								app/Helpers/Csv/Specifix/RabobankDescription.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								app/Helpers/Csv/Specifix/RabobankDescription.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv\Specifix; | ||||
|  | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class RabobankDescription | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Specifix | ||||
|  */ | ||||
| class RabobankDescription | ||||
| { | ||||
|     /** @var array */ | ||||
|     protected $data; | ||||
|  | ||||
|     /** @var array */ | ||||
|     protected $row; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function fix() | ||||
|     { | ||||
|         $this->rabobankFixEmptyOpposing(); | ||||
|  | ||||
|         return $this->data; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Fixes Rabobank specific thing. | ||||
|      */ | ||||
|     protected function rabobankFixEmptyOpposing() | ||||
|     { | ||||
|         Log::debug('RaboSpecifix: Opposing account name is "******".'); | ||||
|         if (is_string($this->data['opposing-account-name']) && strlen($this->data['opposing-account-name']) == 0) { | ||||
|             Log::debug('RaboSpecifix: opp-name is zero length, changed to: "******"'); | ||||
|             $this->data['opposing-account-name'] = $this->row[10]; | ||||
|  | ||||
|             Log::debug('Description was: "******".'); | ||||
|             $this->data['description'] = trim(str_replace($this->row[10], '', $this->data['description'])); | ||||
|             Log::debug('Description is now: "******".'); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData($data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $row | ||||
|      */ | ||||
|     public function setRow($row) | ||||
|     { | ||||
|         $this->row = $row; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										25
									
								
								app/Helpers/Csv/Specifix/SpecifixInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								app/Helpers/Csv/Specifix/SpecifixInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv\Specifix; | ||||
|  | ||||
| /** | ||||
|  * Interface SpecifixInterface | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv\Specifix | ||||
|  */ | ||||
| interface SpecifixInterface | ||||
| { | ||||
|     /** | ||||
|      * Implement bank and locale related fixes. | ||||
|      */ | ||||
|     public function fix(); | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function setData($data); | ||||
|  | ||||
|     /** | ||||
|      * @param array $row | ||||
|      */ | ||||
|     public function setRow($row); | ||||
| } | ||||
							
								
								
									
										192
									
								
								app/Helpers/Csv/Wizard.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								app/Helpers/Csv/Wizard.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | ||||
| <?php | ||||
| namespace FireflyIII\Helpers\Csv; | ||||
|  | ||||
| use Auth; | ||||
| use Config; | ||||
| use Crypt; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Csv\Mapper\MapperInterface; | ||||
| use League\Csv\Reader; | ||||
| use ReflectionException; | ||||
| use Session; | ||||
| use Log; | ||||
| /** | ||||
|  * Class Wizard | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv | ||||
|  */ | ||||
| class Wizard implements WizardInterface | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @param Reader $reader | ||||
|      * @param array  $map | ||||
|      * @param bool   $hasHeaders | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMappableValues($reader, array $map, $hasHeaders) | ||||
|     { | ||||
|         $values = []; | ||||
|         /* | ||||
|          * Loop over the CSV and collect mappable data: | ||||
|          */ | ||||
|         $keys = array_keys($map); | ||||
|         foreach ($reader as $index => $row) { | ||||
|             if ($this->useRow($hasHeaders, $index)) { | ||||
|                 // collect all map values | ||||
|  | ||||
|                 foreach ($keys as $column) { | ||||
|                     $values[$column][] = $row[$column]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         /* | ||||
|          * Make each one unique. | ||||
|          */ | ||||
|         $values = $this->uniqueRecursive($values); | ||||
|  | ||||
|         return $values; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $roles | ||||
|      * @param mixed $map | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function processSelectedMapping(array $roles, $map) | ||||
|     { | ||||
|         $configRoles = Config::get('csv.roles'); | ||||
|         $maps        = []; | ||||
|  | ||||
|  | ||||
|         if (is_array($map)) { | ||||
|             foreach ($map as $index => $field) { | ||||
|                 if (isset($roles[$index])) { | ||||
|                     $name = $roles[$index]; | ||||
|                     if ($configRoles[$name]['mappable']) { | ||||
|                         $maps[$index] = $name; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $maps; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param mixed $input | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function processSelectedRoles($input) | ||||
|     { | ||||
|         $roles = []; | ||||
|  | ||||
|  | ||||
|         /* | ||||
|          * Store all rows for each column: | ||||
|          */ | ||||
|         if (is_array($input)) { | ||||
|             foreach ($input as $index => $role) { | ||||
|                 if ($role != '_ignore') { | ||||
|                     $roles[$index] = $role; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $roles; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $fields | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function sessionHasValues(array $fields) | ||||
|     { | ||||
|         foreach ($fields as $field) { | ||||
|             if (!Session::has($field)) { | ||||
|                 Log::error('Session is missing field: ' . $field); | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $map | ||||
|      * | ||||
|      * @return array | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function showOptions(array $map) | ||||
|     { | ||||
|         $options = []; | ||||
|         foreach ($map as $index => $columnRole) { | ||||
|  | ||||
|             $mapper = Config::get('csv.roles.' . $columnRole . '.mapper'); | ||||
|             if (is_null($mapper)) { | ||||
|                 throw new FireflyException('Cannot map field of type "' . $columnRole . '".'); | ||||
|             } | ||||
|             $class = 'FireflyIII\Helpers\Csv\Mapper\\' . $mapper; | ||||
|             try { | ||||
|                 /** @var MapperInterface $mapObject */ | ||||
|                 $mapObject = app($class); | ||||
|             } catch (ReflectionException $e) { | ||||
|                 throw new FireflyException('Column "' . $columnRole . '" cannot be mapped because class ' . $mapper . ' does not exist.'); | ||||
|             } | ||||
|             $set             = $mapObject->getMap(); | ||||
|             $options[$index] = $set; | ||||
|         } | ||||
|  | ||||
|         return $options; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param $path | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function storeCsvFile($path) | ||||
|     { | ||||
|         $time             = str_replace(' ', '-', microtime()); | ||||
|         $fileName         = 'csv-upload-' . Auth::user()->id . '-' . $time . '.csv.encrypted'; | ||||
|         $fullPath         = storage_path('upload') . DIRECTORY_SEPARATOR . $fileName; | ||||
|         $content          = file_get_contents($path); | ||||
|         $contentEncrypted = Crypt::encrypt($content); | ||||
|         file_put_contents($fullPath, $contentEncrypted); | ||||
|  | ||||
|         return $fullPath; | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param bool $hasHeaders | ||||
|      * @param int  $index | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function useRow($hasHeaders, $index) | ||||
|     { | ||||
|         return ($hasHeaders && $index > 1) || !$hasHeaders; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param array $array | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function uniqueRecursive(array $array) | ||||
|     { | ||||
|         foreach ($array as $column => $found) { | ||||
|             $array[$column] = array_unique($found); | ||||
|         } | ||||
|  | ||||
|         return $array; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								app/Helpers/Csv/WizardInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								app/Helpers/Csv/WizardInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Helpers\Csv; | ||||
|  | ||||
| use League\Csv\Reader; | ||||
|  | ||||
| /** | ||||
|  * Interface WizardInterface | ||||
|  * | ||||
|  * @package FireflyIII\Helpers\Csv | ||||
|  */ | ||||
| interface WizardInterface | ||||
| { | ||||
|     /** | ||||
|      * @param Reader $reader | ||||
|      * @param array  $map | ||||
|      * @param bool   $hasHeaders | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getMappableValues($reader, array $map, $hasHeaders); | ||||
|  | ||||
|     /** | ||||
|      * @param array $roles | ||||
|      * @param mixed $map | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function processSelectedMapping(array $roles, $map); | ||||
|  | ||||
|     /** | ||||
|      * @param mixed $input | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function processSelectedRoles($input); | ||||
|  | ||||
|     /** | ||||
|      * @param array $fields | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function sessionHasValues(array $fields); | ||||
|  | ||||
|     /** | ||||
|      * @param array $map | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function showOptions(array $map); | ||||
|  | ||||
|     /** | ||||
|      * @param $path | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function storeCsvFile($path); | ||||
|  | ||||
| } | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Helpers\Report; | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Helpers\Collection\Account as AccountCollection; | ||||
| use FireflyIII\Helpers\Collection\Balance; | ||||
| @@ -60,9 +59,10 @@ class ReportHelper implements ReportHelperInterface | ||||
|  | ||||
|  | ||||
|         $accounts = $this->query->getAllAccounts($date, $end, $shared); | ||||
|         $start    = 0; | ||||
|         $end      = 0; | ||||
|         $diff     = 0; | ||||
|         $start    = '0'; | ||||
|         $end      = '0'; | ||||
|         $diff     = '0'; | ||||
|         bcscale(2); | ||||
|  | ||||
|         // remove cash account, if any: | ||||
|         $accounts = $accounts->filter( | ||||
| @@ -77,9 +77,9 @@ class ReportHelper implements ReportHelperInterface | ||||
|  | ||||
|         // summarize: | ||||
|         foreach ($accounts as $account) { | ||||
|             $start += $account->startBalance; | ||||
|             $end += $account->endBalance; | ||||
|             $diff += ($account->endBalance - $account->startBalance); | ||||
|             $start = bcadd($start, $account->startBalance); | ||||
|             $end   = bcadd($end, $account->endBalance); | ||||
|             $diff  = bcadd($diff, ($account->endBalance - $account->startBalance)); | ||||
|         } | ||||
|  | ||||
|         $object = new AccountCollection; | ||||
| @@ -114,8 +114,8 @@ class ReportHelper implements ReportHelperInterface | ||||
|      */ | ||||
|     public function getBalanceReport(Carbon $start, Carbon $end, $shared) | ||||
|     { | ||||
|         $repository    = App::make('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); | ||||
|         $tagRepository = App::make('FireflyIII\Repositories\Tag\TagRepositoryInterface'); | ||||
|         $repository    = app('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); | ||||
|         $tagRepository = app('FireflyIII\Repositories\Tag\TagRepositoryInterface'); | ||||
|         $balance       = new Balance; | ||||
|  | ||||
|         // build a balance header: | ||||
| @@ -199,16 +199,15 @@ class ReportHelper implements ReportHelperInterface | ||||
|      * This method generates a full report for the given period on all | ||||
|      * the users bills and their payments. | ||||
|      * | ||||
|      * @param Carbon  $start | ||||
|      * @param Carbon  $end | ||||
|      * @param boolean $shared | ||||
|      * @param Carbon $start | ||||
|      * @param Carbon $end | ||||
|      * | ||||
|      * @return BillCollection | ||||
|      */ | ||||
|     public function getBillReport(Carbon $start, Carbon $end, $shared) | ||||
|     public function getBillReport(Carbon $start, Carbon $end) | ||||
|     { | ||||
|         /** @var \FireflyIII\Repositories\Bill\BillRepositoryInterface $repository */ | ||||
|         $repository = App::make('FireflyIII\Repositories\Bill\BillRepositoryInterface'); | ||||
|         $repository = app('FireflyIII\Repositories\Bill\BillRepositoryInterface'); | ||||
|         $bills      = $repository->getBills(); | ||||
|         $collection = new BillCollection; | ||||
|  | ||||
| @@ -253,7 +252,7 @@ class ReportHelper implements ReportHelperInterface | ||||
|     { | ||||
|         $object = new BudgetCollection; | ||||
|         /** @var \FireflyIII\Repositories\Budget\BudgetRepositoryInterface $repository */ | ||||
|         $repository = App::make('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); | ||||
|         $repository = app('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); | ||||
|         $set        = $repository->getBudgets(); | ||||
|  | ||||
|         foreach ($set as $budget) { | ||||
| @@ -323,7 +322,7 @@ class ReportHelper implements ReportHelperInterface | ||||
|          * GET CATEGORIES: | ||||
|          */ | ||||
|         /** @var \FireflyIII\Repositories\Category\CategoryRepositoryInterface $repository */ | ||||
|         $repository = App::make('FireflyIII\Repositories\Category\CategoryRepositoryInterface'); | ||||
|         $repository = app('FireflyIII\Repositories\Category\CategoryRepositoryInterface'); | ||||
|         $set        = $repository->getCategories(); | ||||
|         foreach ($set as $category) { | ||||
|             $spent           = $repository->spentInPeriodCorrected($category, $start, $end, $shared); | ||||
|   | ||||
| @@ -35,13 +35,12 @@ interface ReportHelperInterface | ||||
|      * This method generates a full report for the given period on all | ||||
|      * the users bills and their payments. | ||||
|      * | ||||
|      * @param Carbon  $start | ||||
|      * @param Carbon  $end | ||||
|      * @param boolean $shared | ||||
|      * @param Carbon $start | ||||
|      * @param Carbon $end | ||||
|      * | ||||
|      * @return BillCollection | ||||
|      */ | ||||
|     public function getBillReport(Carbon $start, Carbon $end, $shared); | ||||
|     public function getBillReport(Carbon $start, Carbon $end); | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon  $start | ||||
|   | ||||
| @@ -21,7 +21,11 @@ use Steam; | ||||
| class ReportQuery implements ReportQueryInterface | ||||
| { | ||||
|     /** | ||||
|      * See ReportQueryInterface::incomeInPeriodCorrected | ||||
|      * See ReportQueryInterface::incomeInPeriodCorrected. | ||||
|      * | ||||
|      * This method's length is caused mainly by the query build stuff. Therefor: | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.ExcessiveMethodLength) | ||||
|      * | ||||
|      * @param Carbon $start | ||||
|      * @param Carbon $end | ||||
| @@ -54,9 +58,7 @@ class ReportQuery implements ReportQueryInterface | ||||
|             $query->where('transaction_types.type', 'Withdrawal'); // any withdrawal is fine. | ||||
|         } | ||||
|         $query->orderBy('transaction_journals.date'); | ||||
|  | ||||
|         // get everything | ||||
|         $data = $query->get( | ||||
|         $data = $query->get( // get everything | ||||
|             ['transaction_journals.*', 'transaction_types.type', 'ac_to.name as name', 'ac_to.id as account_id', 'ac_to.encrypted as account_encrypted'] | ||||
|         ); | ||||
|  | ||||
| @@ -227,11 +229,10 @@ class ReportQuery implements ReportQueryInterface | ||||
|      * @param Account $account | ||||
|      * @param Carbon  $start | ||||
|      * @param Carbon  $end | ||||
|      * @param bool    $shared | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function spentNoBudget(Account $account, Carbon $start, Carbon $end, $shared = false) | ||||
|     public function spentNoBudget(Account $account, Carbon $start, Carbon $end) | ||||
|     { | ||||
|         return | ||||
|             Auth::user()->transactionjournals() | ||||
|   | ||||
| @@ -71,11 +71,10 @@ interface ReportQueryInterface | ||||
|      * @param Account $account | ||||
|      * @param Carbon  $start | ||||
|      * @param Carbon  $end | ||||
|      * @param bool    $shared | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function spentNoBudget(Account $account, Carbon $start, Carbon $end, $shared = false); | ||||
|     public function spentNoBudget(Account $account, Carbon $start, Carbon $end); | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -3,12 +3,12 @@ | ||||
| use Auth; | ||||
| use Carbon\Carbon; | ||||
| use Config; | ||||
| use ExpandedForm; | ||||
| use FireflyIII\Http\Requests\AccountFormRequest; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use Steam; | ||||
| use URL; | ||||
| @@ -58,17 +58,19 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @return \Illuminate\View\View | ||||
|      */ | ||||
|     public function delete(Account $account) | ||||
|     public function delete(AccountRepositoryInterface $repository, Account $account) | ||||
|     { | ||||
|         $typeName = Config::get('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]); | ||||
|         $typeName    = Config::get('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $subTitle    = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]); | ||||
|         $accountList = Expandedform::makeSelectList($repository->getAccounts([$account->accountType->type]), true); | ||||
|         unset($accountList[$account->id]); | ||||
|  | ||||
|         // put previous url in session | ||||
|         Session::put('accounts.delete.url', URL::previous()); | ||||
|         Session::flash('gaEventCategory', 'accounts'); | ||||
|         Session::flash('gaEventAction', 'delete-' . $typeName); | ||||
|  | ||||
|         return view('accounts.delete', compact('account', 'subTitle')); | ||||
|         return view('accounts.delete', compact('account', 'subTitle', 'accountList')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -79,17 +81,17 @@ class AccountController extends Controller | ||||
|      */ | ||||
|     public function destroy(AccountRepositoryInterface $repository, Account $account) | ||||
|     { | ||||
|  | ||||
|         $type     = $account->accountType->type; | ||||
|         $typeName = Config::get('firefly.shortNamesByFullName.' . $type); | ||||
|         $name     = $account->name; | ||||
|         $moveTo   = Auth::user()->accounts()->find(intval(Input::get('move_account_before_delete'))); | ||||
|  | ||||
|         $repository->destroy($account); | ||||
|         $repository->destroy($account, $moveTo); | ||||
|  | ||||
|         Session::flash('success', trans('firefly.' . $typeName . '_deleted', ['name' => $name])); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::to(Session::get('accounts.delete.url')); | ||||
|         return redirect(Session::get('accounts.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -154,12 +156,23 @@ class AccountController extends Controller | ||||
|          * HERE WE ARE | ||||
|          */ | ||||
|         $start = clone Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = clone Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         $start->subDay(); | ||||
|  | ||||
|         // start balances: | ||||
|         $ids = []; | ||||
|         foreach ($accounts as $account) { | ||||
|             $ids[] = $account->id; | ||||
|         } | ||||
|  | ||||
|         $startBalances = Steam::balancesById($ids, $start); | ||||
|         $endBalances   = Steam::balancesById($ids, $end); | ||||
|  | ||||
|         $accounts->each( | ||||
|             function (Account $account) use ($start, $repository) { | ||||
|                 $account->lastActivityDate = $repository->getLastActivity($account); | ||||
|                 $account->startBalance     = Steam::balance($account, $start); | ||||
|                 $account->endBalance       = Steam::balance($account, clone Session::get('end', Carbon::now()->endOfMonth())); | ||||
|             function (Account $account) use ($startBalances, $endBalances) { | ||||
|                 $account->lastActivityDate = null;//$repository->getLastActivity($account); | ||||
|                 $account->startBalance     = isset($startBalances[$account->id]) ? $startBalances[$account->id] : null; | ||||
|                 $account->endBalance       = isset($endBalances[$account->id]) ? $endBalances[$account->id] : null; | ||||
|             } | ||||
|         ); | ||||
|  | ||||
| @@ -199,13 +212,15 @@ class AccountController extends Controller | ||||
|             'virtualBalance'         => floatval($request->input('virtualBalance')), | ||||
|             'active'                 => true, | ||||
|             'user'                   => Auth::user()->id, | ||||
|             'iban'                   => $request->input('iban'), | ||||
|             'accountRole'            => $request->input('accountRole'), | ||||
|             'openingBalance'         => floatval($request->input('openingBalance')), | ||||
|             'openingBalanceDate'     => new Carbon((string)$request->input('openingBalanceDate')), | ||||
|             'openingBalanceCurrency' => intval($request->input('balance_currency_id')), | ||||
|  | ||||
|         ]; | ||||
|         $account     = $repository->store($accountData); | ||||
|  | ||||
|         $account = $repository->store($accountData); | ||||
|  | ||||
|         Session::flash('success', 'New account "' . $account->name . '" stored!'); | ||||
|         Preferences::mark(); | ||||
| @@ -214,13 +229,11 @@ class AccountController extends Controller | ||||
|             // set value so create routine will not overwrite URL: | ||||
|             Session::put('accounts.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('accounts.create')->withInput(); | ||||
|             return redirect(route('accounts.create', [$request->input('what')]))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('accounts.create.url')); | ||||
|  | ||||
|  | ||||
|         return redirect(Session::get('accounts.create.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -237,6 +250,7 @@ class AccountController extends Controller | ||||
|             'name'                   => $request->input('name'), | ||||
|             'active'                 => $request->input('active'), | ||||
|             'user'                   => Auth::user()->id, | ||||
|             'iban'                   => $request->input('iban'), | ||||
|             'accountRole'            => $request->input('accountRole'), | ||||
|             'virtualBalance'         => floatval($request->input('virtualBalance')), | ||||
|             'openingBalance'         => floatval($request->input('openingBalance')), | ||||
| @@ -246,6 +260,7 @@ class AccountController extends Controller | ||||
|             'ccMonthlyPaymentDate'   => $request->input('ccMonthlyPaymentDate'), | ||||
|         ]; | ||||
|  | ||||
|  | ||||
|         $repository->update($account, $accountData); | ||||
|  | ||||
|         Session::flash('success', 'Account "' . $account->name . '" updated.'); | ||||
| @@ -255,11 +270,11 @@ class AccountController extends Controller | ||||
|             // set value so edit routine will not overwrite URL: | ||||
|             Session::put('accounts.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('accounts.edit', [$account->id])->withInput(['return_to_edit' => 1]); | ||||
|             return redirect(route('accounts.edit', [$account->id]))->withInput(['return_to_edit' => 1]); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('accounts.edit.url')); | ||||
|         return redirect(Session::get('accounts.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| <?php namespace FireflyIII\Http\Controllers\Auth; | ||||
|  | ||||
| use App; | ||||
| use Auth; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Role; | ||||
| @@ -44,6 +43,8 @@ class AuthController extends Controller | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|  | ||||
|         $this->middleware('guest', ['except' => 'getLogout']); | ||||
|     } | ||||
|  | ||||
| @@ -109,7 +110,7 @@ class AuthController extends Controller | ||||
|             return redirect($this->redirectPath()); | ||||
|         } | ||||
|         // @codeCoverageIgnoreStart | ||||
|         App::abort(500, 'Not a user!'); | ||||
|         abort(500, 'Not a user!'); | ||||
|  | ||||
|         return redirect('/'); | ||||
|         // @codeCoverageIgnoreEnd | ||||
|   | ||||
| @@ -36,6 +36,7 @@ class PasswordController extends Controller | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|  | ||||
|         $this->middleware('guest'); | ||||
|     } | ||||
|   | ||||
| @@ -7,7 +7,6 @@ use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use URL; | ||||
| use View; | ||||
| @@ -79,8 +78,7 @@ class BillController extends Controller | ||||
|         Session::flash('success', 'The bill was deleted.'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::to(Session::get('bills.delete.url')); | ||||
|  | ||||
|         return redirect(Session::get('bills.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -133,7 +131,7 @@ class BillController extends Controller | ||||
|         if (intval($bill->active) == 0) { | ||||
|             Session::flash('warning', 'Inactive bills cannot be scanned.'); | ||||
|  | ||||
|             return Redirect::to(URL::previous()); | ||||
|             return redirect(URL::previous()); | ||||
|         } | ||||
|  | ||||
|         $journals = $repository->getPossiblyRelatedJournals($bill); | ||||
| @@ -146,7 +144,7 @@ class BillController extends Controller | ||||
|         Session::flash('success', 'Rescanned everything.'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::to(URL::previous()); | ||||
|         return redirect(URL::previous()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -182,11 +180,11 @@ class BillController extends Controller | ||||
|             // set value so create routine will not overwrite URL: | ||||
|             Session::put('bills.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('bills.create')->withInput(); | ||||
|             return redirect(route('bills.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('bills.create.url')); | ||||
|         return redirect(Session::get('bills.create.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
| @@ -209,11 +207,11 @@ class BillController extends Controller | ||||
|             // set value so edit routine will not overwrite URL: | ||||
|             Session::put('bills.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('bills.edit', [$bill->id])->withInput(['return_to_edit' => 1]); | ||||
|             return redirect(route('bills.edit', [$bill->id]))->withInput(['return_to_edit' => 1]); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('bills.edit.url')); | ||||
|         return redirect(Session::get('bills.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,6 @@ use FireflyIII\Models\LimitRepetition; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Response; | ||||
| use Session; | ||||
| use URL; | ||||
| @@ -106,7 +105,7 @@ class BudgetController extends Controller | ||||
|         Preferences::mark(); | ||||
|  | ||||
|  | ||||
|         return Redirect::to(Session::get('budgets.delete.url')); | ||||
|         return redirect(Session::get('budgets.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -200,7 +199,7 @@ class BudgetController extends Controller | ||||
|         Preferences::set('budgetIncomeTotal' . $date, intval(Input::get('amount'))); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::route('budgets.index'); | ||||
|         return redirect(route('budgets.index')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -254,11 +253,11 @@ class BudgetController extends Controller | ||||
|             // set value so create routine will not overwrite URL: | ||||
|             Session::put('budgets.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('budgets.create')->withInput(); | ||||
|             return redirect(route('budgets.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('budgets.create.url')); | ||||
|         return redirect(Session::get('budgets.create.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
| @@ -285,11 +284,11 @@ class BudgetController extends Controller | ||||
|             // set value so edit routine will not overwrite URL: | ||||
|             Session::put('budgets.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('budgets.edit', [$budget->id])->withInput(['return_to_edit' => 1]); | ||||
|             return redirect(route('budgets.edit', [$budget->id]))->withInput(['return_to_edit' => 1]); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('budgets.edit.url')); | ||||
|         return redirect(Session::get('budgets.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -8,7 +8,6 @@ use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use URL; | ||||
| use View; | ||||
| @@ -80,7 +79,7 @@ class CategoryController extends Controller | ||||
|         Session::flash('success', 'The  category "' . e($name) . '" was deleted.'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::to(Session::get('categories.delete.url')); | ||||
|         return redirect(Session::get('categories.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -178,10 +177,10 @@ class CategoryController extends Controller | ||||
|         if (intval(Input::get('create_another')) === 1) { | ||||
|             Session::put('categories.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('categories.create')->withInput(); | ||||
|             return redirect(route('categories.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|         return Redirect::route('categories.index'); | ||||
|         return redirect(route('categories.index')); | ||||
|     } | ||||
|  | ||||
|  | ||||
| @@ -206,11 +205,11 @@ class CategoryController extends Controller | ||||
|         if (intval(Input::get('return_to_edit')) === 1) { | ||||
|             Session::put('categories.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('categories.edit', [$category->id]); | ||||
|             return redirect(route('categories.edit', [$category->id])); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('categories.edit.url')); | ||||
|         return redirect(Session::get('categories.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Account; | ||||
| @@ -31,7 +30,7 @@ class AccountController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\Account\AccountChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\Account\AccountChartGenerator'); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,18 +2,14 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Support\CacheProperties; | ||||
| use Illuminate\Support\Collection; | ||||
| use Response; | ||||
| use Session; | ||||
| use Steam; | ||||
|  | ||||
| /** | ||||
|  * Class BillController | ||||
| @@ -33,26 +29,21 @@ class BillController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\Bill\BillChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\Bill\BillChartGenerator'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Shows all bills and whether or not theyve been paid this month (pie chart). | ||||
|      * | ||||
|      * @param BillRepositoryInterface    $repository | ||||
|      * @param AccountRepositoryInterface $accounts | ||||
|      * @param BillRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Symfony\Component\HttpFoundation\Response | ||||
|      */ | ||||
|     public function frontpage(BillRepositoryInterface $repository, AccountRepositoryInterface $accounts) | ||||
|     public function frontpage(BillRepositoryInterface $repository) | ||||
|     { | ||||
|  | ||||
|         $start = Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|  | ||||
|  | ||||
|         // chart properties for cache: | ||||
|         $cache = new CacheProperties(); | ||||
|         $cache = new CacheProperties(); // chart properties for cache: | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('bills'); | ||||
| @@ -61,46 +52,13 @@ class BillController extends Controller | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         $bills  = $repository->getActiveBills(); | ||||
|         $paid   = new Collection; // journals. | ||||
|         $unpaid = new Collection; // bills | ||||
|         $set = $repository->getBillsForChart($start, $end); | ||||
|  | ||||
|         // optionally expand this set with credit card data | ||||
|         $set    = $repository->getCreditCardInfoForChart($set, $start, $end); | ||||
|         $paid   = $set->get('paid'); | ||||
|         $unpaid = $set->get('unpaid'); | ||||
|  | ||||
|         /** @var Bill $bill */ | ||||
|         foreach ($bills as $bill) { | ||||
|             $ranges = $repository->getRanges($bill, $start, $end); | ||||
|  | ||||
|             foreach ($ranges as $range) { | ||||
|                 // paid a bill in this range? | ||||
|                 $journals = $repository->getJournalsInRange($bill, $range['start'], $range['end']); | ||||
|                 if ($journals->count() == 0) { | ||||
|                     $unpaid->push([$bill, $range['start']]); | ||||
|                 } else { | ||||
|                     $paid = $paid->merge($journals); | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $creditCards = $accounts->getCreditCards(); | ||||
|         foreach ($creditCards as $creditCard) { | ||||
|             $balance = Steam::balance($creditCard, $end, true); | ||||
|             $date    = new Carbon($creditCard->getMeta('ccMonthlyPaymentDate')); | ||||
|             if ($balance < 0) { | ||||
|                 // unpaid! create a fake bill that matches the amount. | ||||
|                 $description = $creditCard->name; | ||||
|                 $amount      = $balance * -1; | ||||
|                 $fakeBill    = $repository->createFakeBill($description, $date, $amount); | ||||
|                 unset($description, $amount); | ||||
|                 $unpaid->push([$fakeBill, $date]); | ||||
|             } | ||||
|             if ($balance == 0) { | ||||
|                 // find transfer(s) TO the credit card which should account for | ||||
|                 // anything paid. If not, the CC is not yet used. | ||||
|                 $journals = $accounts->getTransfersInRange($creditCard, $start, $end); | ||||
|                 $paid     = $paid->merge($journals); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // build chart: | ||||
|         $data = $this->generator->frontpage($paid, $unpaid); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Budget; | ||||
| @@ -33,7 +32,7 @@ class BudgetController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\Budget\BudgetChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\Budget\BudgetChartGenerator'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -93,6 +92,7 @@ class BudgetController extends Controller | ||||
|     { | ||||
|         $start = clone $repetition->startdate; | ||||
|         $end   = $repetition->enddate; | ||||
|         bcscale(2); | ||||
|  | ||||
|         // chart properties for cache: | ||||
|         $cache = new CacheProperties(); | ||||
| @@ -113,8 +113,8 @@ class BudgetController extends Controller | ||||
|             /* | ||||
|              * Sum of expenses on this day: | ||||
|              */ | ||||
|             $sum = $repository->expensesOnDayCorrected($budget, $start); | ||||
|             $amount += $sum; | ||||
|             $sum    = $repository->expensesOnDayCorrected($budget, $start); | ||||
|             $amount = bcadd($amount, $sum); | ||||
|             $entries->push([clone $start, $amount]); | ||||
|             $start->addDay(); | ||||
|         } | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Category; | ||||
| @@ -32,7 +31,7 @@ class CategoryController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\Category\CategoryChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\Category\CategoryChartGenerator'); | ||||
|     } | ||||
|  | ||||
|  | ||||
| @@ -176,9 +175,7 @@ class CategoryController extends Controller | ||||
|         $start = new Carbon($year . '-01-01'); | ||||
|         $end   = new Carbon($year . '-12-31'); | ||||
|  | ||||
|  | ||||
|         // chart properties for cache: | ||||
|         $cache = new CacheProperties; | ||||
|         $cache = new CacheProperties; // chart properties for cache: | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty('category'); | ||||
| @@ -192,14 +189,11 @@ class CategoryController extends Controller | ||||
|         $entries    = new Collection; | ||||
|  | ||||
|         while ($start < $end) { | ||||
|             // month is the current end of the period: | ||||
|             $month = clone $start; | ||||
|             $month = clone $start; // month is the current end of the period | ||||
|             $month->endOfMonth(); | ||||
|             // make a row: | ||||
|             $row = [clone $start]; | ||||
|             $row = [clone $start]; // make a row: | ||||
|  | ||||
|             // each budget, fill the row: | ||||
|             foreach ($categories as $category) { | ||||
|             foreach ($categories as $category) { // each budget, fill the row | ||||
|                 $spent = $repository->spentInPeriodCorrected($category, $start, $month, $shared); | ||||
|                 $row[] = $spent; | ||||
|             } | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
| use App; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| @@ -29,7 +28,7 @@ class PiggyBankController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\PiggyBank\PiggyBankChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\PiggyBank\PiggyBankChartGenerator'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
| namespace FireflyIII\Http\Controllers\Chart; | ||||
|  | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Helpers\Report\ReportQueryInterface; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| @@ -29,7 +28,7 @@ class ReportController extends Controller | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         // create chart generator: | ||||
|         $this->generator = App::make('FireflyIII\Generator\Chart\Report\ReportChartGenerator'); | ||||
|         $this->generator = app('FireflyIII\Generator\Chart\Report\ReportChartGenerator'); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										410
									
								
								app/Http/Controllers/CsvController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										410
									
								
								app/Http/Controllers/CsvController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,410 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Http\Controllers; | ||||
|  | ||||
| use Config; | ||||
| use ExpandedForm; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Csv\Data; | ||||
| use FireflyIII\Helpers\Csv\Importer; | ||||
| use FireflyIII\Helpers\Csv\WizardInterface; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Illuminate\Http\Request; | ||||
| use Input; | ||||
| use Log; | ||||
| use Preferences; | ||||
| use Session; | ||||
| use View; | ||||
|  | ||||
| /** | ||||
|  * Class CsvController | ||||
|  * | ||||
|  * @package FireflyIII\Http\Controllers | ||||
|  */ | ||||
| class CsvController extends Controller | ||||
| { | ||||
|  | ||||
|     /** @var  Data */ | ||||
|     protected $data; | ||||
|     /** @var  WizardInterface */ | ||||
|     protected $wizard; | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         View::share('title', trans('firefly.csv')); | ||||
|         View::share('mainTitleIcon', 'fa-file-text-o'); | ||||
|  | ||||
|         if (Config::get('firefly.csv_import_enabled') === false) { | ||||
|             throw new FireflyException('CSV Import is not enabled.'); | ||||
|         } | ||||
|  | ||||
|         $this->wizard = app('FireflyIII\Helpers\Csv\WizardInterface'); | ||||
|         $this->data   = app('FireflyIII\Helpers\Csv\Data'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Define column roles and mapping. | ||||
|      * | ||||
|      * STEP THREE | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View | ||||
|      */ | ||||
|     public function columnRoles() | ||||
|     { | ||||
|  | ||||
|         $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-import-account']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|  | ||||
|         $subTitle       = trans('firefly.csv_define_column_roles'); | ||||
|         $firstRow       = $this->data->getReader()->fetchOne(); | ||||
|         $count          = count($firstRow); | ||||
|         $headers        = []; | ||||
|         $example        = $this->data->getReader()->fetchOne(1); | ||||
|         $availableRoles = []; | ||||
|         $roles          = $this->data->getRoles(); | ||||
|         $map            = $this->data->getMap(); | ||||
|  | ||||
|         for ($i = 1; $i <= $count; $i++) { | ||||
|             $headers[] = trans('firefly.csv_column') . ' #' . $i; | ||||
|         } | ||||
|         if ($this->data->hasHeaders()) { | ||||
|             $headers = $firstRow; | ||||
|         } | ||||
|  | ||||
|         foreach (Config::get('csv.roles') as $name => $role) { | ||||
|             $availableRoles[$name] = trans('firefly.csv_column_' . $name);//$role['name']; | ||||
|         } | ||||
|         ksort($availableRoles); | ||||
|  | ||||
|         return view('csv.column-roles', compact('availableRoles', 'map', 'roles', 'headers', 'example', 'subTitle')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Optional download of mapping. | ||||
|      * | ||||
|      * STEP FOUR THREE-A | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse|string | ||||
|      */ | ||||
|     public function downloadConfig() | ||||
|     { | ||||
|         $fields = ['csv-date-format', 'csv-has-headers']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|         $data = [ | ||||
|             'date-format' => Session::get('csv-date-format'), | ||||
|             'has-headers' => Session::get('csv-has-headers') | ||||
|         ]; | ||||
|         if (Session::has('csv-map')) { | ||||
|             $data['map'] = Session::get('csv-map'); | ||||
|         } | ||||
|         if (Session::has('csv-roles')) { | ||||
|             $data['roles'] = Session::get('csv-roles'); | ||||
|         } | ||||
|         if (Session::has('csv-mapped')) { | ||||
|             $data['mapped'] = Session::get('csv-mapped'); | ||||
|         } | ||||
|  | ||||
|         if (Session::has('csv-specifix')) { | ||||
|             $data['specifix'] = Session::get('csv-specifix'); | ||||
|         } | ||||
|  | ||||
|         $result = json_encode($data, JSON_PRETTY_PRINT); | ||||
|         $name   = 'csv-configuration-' . date('Y-m-d') . '.json'; | ||||
|  | ||||
|         header('Content-disposition: attachment; filename=' . $name); | ||||
|         header('Content-type: application/json'); | ||||
|         echo $result; | ||||
|  | ||||
|         return ''; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return \Illuminate\View\View | ||||
|      */ | ||||
|     public function downloadConfigPage() | ||||
|     { | ||||
|         $subTitle = trans('firefly.csv_download_config_title'); | ||||
|  | ||||
|         return view('csv.download-config', compact('subTitle')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This method shows the initial upload form. | ||||
|      * | ||||
|      * STEP ONE | ||||
|      * | ||||
|      * @return \Illuminate\View\View | ||||
|      */ | ||||
|     public function index(AccountRepositoryInterface $repository) | ||||
|     { | ||||
|         $subTitle = trans('firefly.csv_import'); | ||||
|  | ||||
|         Session::forget('csv-date-format'); | ||||
|         Session::forget('csv-has-headers'); | ||||
|         Session::forget('csv-file'); | ||||
|         Session::forget('csv-import-account'); | ||||
|         Session::forget('csv-map'); | ||||
|         Session::forget('csv-roles'); | ||||
|         Session::forget('csv-mapped'); | ||||
|         Session::forget('csv-specifix'); | ||||
|  | ||||
|         // get list of supported specifix | ||||
|         $specifix = []; | ||||
|         foreach (Config::get('csv.specifix') as $entry) { | ||||
|             $specifix[$entry] = trans('firefly.csv_specifix_' . $entry); | ||||
|         } | ||||
|  | ||||
|         // get a list of asset accounts: | ||||
|         $accounts = ExpandedForm::makeSelectList($repository->getAccounts(['Asset account', 'Default account'])); | ||||
|  | ||||
|         // can actually upload? | ||||
|         $uploadPossible = is_writable(storage_path('upload')); | ||||
|         $path           = storage_path('upload'); | ||||
|  | ||||
|         return view('csv.index', compact('subTitle', 'uploadPossible', 'path', 'specifix', 'accounts')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse the file. | ||||
|      * | ||||
|      * STEP FOUR | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse | ||||
|      */ | ||||
|     public function initialParse() | ||||
|     { | ||||
|         $fields = ['csv-file', 'csv-date-format', 'csv-has-headers']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|  | ||||
|         // process given roles and mapping: | ||||
|         $roles = $this->wizard->processSelectedRoles(Input::get('role')); | ||||
|         $maps  = $this->wizard->processSelectedMapping($roles, Input::get('map')); | ||||
|  | ||||
|         Session::put('csv-map', $maps); | ||||
|         Session::put('csv-roles', $roles); | ||||
|  | ||||
|         // Go back when no roles defined: | ||||
|         if (count($roles) === 0) { | ||||
|             Session::flash('warning', 'Please select some roles.'); | ||||
|  | ||||
|             return redirect(route('csv.column-roles')); | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * Continue with map specification when necessary. | ||||
|          */ | ||||
|         if (count($maps) > 0) { | ||||
|             return redirect(route('csv.map')); | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * Or simply start processing. | ||||
|          */ | ||||
|  | ||||
|         // proceed to download config | ||||
|         return redirect(route('csv.download-config-page')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * Map first if necessary, | ||||
|      * | ||||
|      * STEP FIVE. | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function map() | ||||
|     { | ||||
|  | ||||
|         // Make sure all fields we need are accounted for. | ||||
|         $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|         /* | ||||
|          * The "options" array contains all options the user has | ||||
|          * per column, where the key represents the column. | ||||
|          * | ||||
|          * For each key there is an array which in turn represents | ||||
|          * all the options available: grouped by ID. | ||||
|          * | ||||
|          * options[column index] = [ | ||||
|          *       field id => field identifier. | ||||
|          * ] | ||||
|          */ | ||||
|         try { | ||||
|             $options = $this->wizard->showOptions($this->data->getMap()); | ||||
|         } catch (FireflyException $e) { | ||||
|             return view('error', ['message' => $e->getMessage()]); | ||||
|         } | ||||
|  | ||||
|         // After these values are prepped, read the actual CSV file | ||||
|         $reader     = $this->data->getReader(); | ||||
|         $map        = $this->data->getMap(); | ||||
|         $hasHeaders = $this->data->hasHeaders(); | ||||
|         $values     = $this->wizard->getMappableValues($reader, $map, $hasHeaders); | ||||
|         $map        = $this->data->getMap(); | ||||
|         $mapped     = $this->data->getMapped(); | ||||
|         $subTitle   = trans('firefly.csv_map_values'); | ||||
|  | ||||
|         return view('csv.map', compact('map', 'options', 'values', 'mapped', 'subTitle')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * Finally actually process the CSV file. | ||||
|      * | ||||
|      * STEP SEVEN | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View | ||||
|      */ | ||||
|     public function process() | ||||
|     { | ||||
|         /* | ||||
|          * Make sure all fields we need are accounted for. | ||||
|          */ | ||||
|         $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles', 'csv-mapped']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|  | ||||
|         Log::debug('Created importer'); | ||||
|         $importer = new Importer; | ||||
|         $importer->setData($this->data); | ||||
|         try { | ||||
|             $importer->run(); | ||||
|         } catch (FireflyException $e) { | ||||
|             Log::error('Catch error: ' . $e->getMessage()); | ||||
|  | ||||
|             return view('error', ['message' => $e->getMessage()]); | ||||
|         } | ||||
|         Log::debug('Done importing!'); | ||||
|  | ||||
|         $rows     = $importer->getRows(); | ||||
|         $errors   = $importer->getErrors(); | ||||
|         $imported = $importer->getImported(); | ||||
|         $journals = $importer->getJournals(); | ||||
|  | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         $subTitle = trans('firefly.csv_process_title'); | ||||
|  | ||||
|         return view('csv.process', compact('rows', 'errors', 'imported', 'subTitle', 'journals')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store the mapping the user has made. This is | ||||
|      * | ||||
|      * STEP SIX | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse | ||||
|      */ | ||||
|     public function saveMapping() | ||||
|     { | ||||
|         /* | ||||
|          * Make sure all fields we need are accounted for. | ||||
|          */ | ||||
|         $fields = ['csv-file', 'csv-date-format', 'csv-has-headers', 'csv-map', 'csv-roles']; | ||||
|         if (!$this->wizard->sessionHasValues($fields)) { | ||||
|             Session::flash('warning', 'Could not recover upload.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|  | ||||
|         // save mapping to session. | ||||
|         $mapped = []; | ||||
|         if (!is_array(Input::get('mapping'))) { | ||||
|             Session::flash('warning', 'Invalid mapping.'); | ||||
|  | ||||
|             return redirect(route('csv.map')); | ||||
|         } | ||||
|  | ||||
|         foreach (Input::get('mapping') as $index => $data) { | ||||
|             $mapped[$index] = []; | ||||
|             foreach ($data as $value => $mapping) { | ||||
|                 if (intval($mapping) !== 0) { | ||||
|                     $mapped[$index][$value] = $mapping; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         Session::put('csv-mapped', $mapped); | ||||
|  | ||||
|         // proceed to process. | ||||
|         return redirect(route('csv.download-config-page')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * This method processes the file, puts it away somewhere safe | ||||
|      * and sends you onwards. | ||||
|      * | ||||
|      * STEP TWO | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse | ||||
|      */ | ||||
|     public function upload(Request $request) | ||||
|     { | ||||
|         if (!$request->hasFile('csv')) { | ||||
|             Session::flash('warning', 'No file uploaded.'); | ||||
|  | ||||
|             return redirect(route('csv.index')); | ||||
|         } | ||||
|  | ||||
|         $fullPath                   = $this->wizard->storeCsvFile($request->file('csv')->getRealPath()); | ||||
|         $settings                   = []; | ||||
|         $settings['date-format']    = Input::get('date_format'); | ||||
|         $settings['has-headers']    = intval(Input::get('has_headers')) === 1; | ||||
|         $settings['specifix']       = Input::get('specifix'); | ||||
|         $settings['import-account'] = intval(Input::get('csv_import_account')); | ||||
|         $settings['map']            = []; | ||||
|         $settings['mapped']         = []; | ||||
|         $settings['roles']          = []; | ||||
|  | ||||
|         if ($request->hasFile('csv_config')) { // Process config file if present. | ||||
|             $data = file_get_contents($request->file('csv_config')->getRealPath()); | ||||
|             $json = json_decode($data, true); | ||||
|             if (is_array($json)) { | ||||
|                 $settings = array_merge($settings, $json); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $this->data->setCsvFileLocation($fullPath); | ||||
|         $this->data->setDateFormat($settings['date-format']); | ||||
|         $this->data->setHasHeaders($settings['has-headers']); | ||||
|         $this->data->setMap($settings['map']); | ||||
|         $this->data->setMapped($settings['mapped']); | ||||
|         $this->data->setRoles($settings['roles']); | ||||
|         $this->data->setSpecifix($settings['specifix']); | ||||
|         $this->data->setImportAccount($settings['import-account']); | ||||
|  | ||||
|         return redirect(route('csv.column-roles')); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -7,7 +7,6 @@ use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use URL; | ||||
| use View; | ||||
| @@ -65,7 +64,7 @@ class CurrencyController extends Controller | ||||
|         Cache::forget('FFCURRENCYSYMBOL'); | ||||
|         Cache::forget('FFCURRENCYCODE'); | ||||
|  | ||||
|         return Redirect::route('currency.index'); | ||||
|         return redirect(route('currency.index')); | ||||
|  | ||||
|     } | ||||
|  | ||||
| @@ -81,7 +80,7 @@ class CurrencyController extends Controller | ||||
|         if ($repository->countJournals($currency) > 0) { | ||||
|             Session::flash('error', 'Cannot delete ' . e($currency->name) . ' because there are still transactions attached to it.'); | ||||
|  | ||||
|             return Redirect::route('currency.index'); | ||||
|             return redirect(route('currency.index')); | ||||
|         } | ||||
|  | ||||
|         // put previous url in session | ||||
| @@ -106,7 +105,7 @@ class CurrencyController extends Controller | ||||
|         if ($repository->countJournals($currency) > 0) { | ||||
|             Session::flash('error', 'Cannot destroy ' . e($currency->name) . ' because there are still transactions attached to it.'); | ||||
|  | ||||
|             return Redirect::route('currency.index'); | ||||
|             return redirect(route('currency.index')); | ||||
|         } | ||||
|  | ||||
|         Session::flash('success', 'Currency "' . e($currency->name) . '" deleted'); | ||||
| @@ -114,7 +113,7 @@ class CurrencyController extends Controller | ||||
|             $currency->delete(); | ||||
|         } | ||||
|  | ||||
|         return Redirect::to(Session::get('currency.delete.url')); | ||||
|         return redirect(Session::get('currency.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -178,11 +177,11 @@ class CurrencyController extends Controller | ||||
|         if (intval(Input::get('create_another')) === 1) { | ||||
|             Session::put('currency.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('currency.create')->withInput(); | ||||
|             return redirect(route('currency.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('currency.create.url')); | ||||
|         return redirect(Session::get('currency.create.url')); | ||||
|  | ||||
|  | ||||
|     } | ||||
| @@ -207,11 +206,11 @@ class CurrencyController extends Controller | ||||
|         if (intval(Input::get('return_to_edit')) === 1) { | ||||
|             Session::put('currency.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('currency.edit', [$currency->id]); | ||||
|             return redirect(route('currency.edit', [$currency->id])); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('currency.edit.url')); | ||||
|         return redirect(Session::get('currency.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,8 @@ use Config; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Input; | ||||
| use Log; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Route; | ||||
| use Session; | ||||
| use Steam; | ||||
| @@ -40,6 +40,9 @@ class HomeController extends Controller | ||||
|      */ | ||||
|     public function flush() | ||||
|     { | ||||
|  | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         // get all tags. | ||||
|         // update all counts: | ||||
|         $tags = Tag::get(); | ||||
| @@ -56,7 +59,7 @@ class HomeController extends Controller | ||||
|  | ||||
|         Session::clear(); | ||||
|  | ||||
|         return Redirect::route('index'); | ||||
|         return redirect(route('index')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -68,10 +71,10 @@ class HomeController extends Controller | ||||
|     { | ||||
|         $types = Config::get('firefly.accountTypesByIdentifier.asset'); | ||||
|         $count = $repository->countAccounts($types); | ||||
|  | ||||
|         bcscale(2); | ||||
|  | ||||
|         if ($count == 0) { | ||||
|             return Redirect::route('new-user.index'); | ||||
|             return redirect(route('new-user.index')); | ||||
|         } | ||||
|  | ||||
|         $title         = 'Firefly'; | ||||
| @@ -81,6 +84,7 @@ class HomeController extends Controller | ||||
|         $frontPage     = Preferences::get('frontPageAccounts', []); | ||||
|         $start         = Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end           = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         $showTour      = Preferences::get('tour', true)->data; | ||||
|  | ||||
|         $accounts = $repository->getFrontpageAccounts($frontPage); | ||||
|         $savings  = $repository->getSavingsAccounts(); | ||||
| @@ -90,7 +94,7 @@ class HomeController extends Controller | ||||
|  | ||||
|         $savingsTotal = 0; | ||||
|         foreach ($savings as $savingAccount) { | ||||
|             $savingsTotal += Steam::balance($savingAccount, $end); | ||||
|             $savingsTotal = bcadd($savingsTotal, Steam::balance($savingAccount, $end)); | ||||
|         } | ||||
|  | ||||
|         $sum = $repository->sumOfEverything(); | ||||
| @@ -111,7 +115,9 @@ class HomeController extends Controller | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return view('index', compact('count', 'title', 'savings', 'subTitle', 'mainTitleIcon', 'transactions', 'savingsTotal', 'piggyBankAccounts')); | ||||
|         return view( | ||||
|             'index', compact('count', 'showTour', 'title', 'savings', 'subTitle', 'mainTitleIcon', 'transactions', 'savingsTotal', 'piggyBankAccounts') | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -123,8 +129,9 @@ class HomeController extends Controller | ||||
|         if (!Auth::user()->hasRole('owner')) { | ||||
|             Session::flash('warning', 'This page is broken.'); | ||||
|  | ||||
|             return Redirect::route('index'); | ||||
|             return redirect(route('index')); | ||||
|         } | ||||
|         Log::debug('Make log.'); | ||||
|  | ||||
|         // get all routes: | ||||
|         $routeCollection = Route::getRoutes(); | ||||
|   | ||||
| @@ -12,6 +12,7 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use FireflyIII\Support\CacheProperties; | ||||
| use Illuminate\Support\Collection; | ||||
| use Preferences; | ||||
| use Response; | ||||
| use Session; | ||||
| use Steam; | ||||
| @@ -24,6 +25,43 @@ use Steam; | ||||
| class JsonController extends Controller | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function endTour() | ||||
|     { | ||||
|         Preferences::set('tour', false); | ||||
|  | ||||
|         return Response::json('true'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function tour() | ||||
|     { | ||||
|         $pref = Preferences::get('tour', true); | ||||
|         if (!$pref) { | ||||
|             abort(404); | ||||
|         } | ||||
|         $headers = ['main-content', 'sidebar-toggle', 'account-menu', 'budget-menu', 'report-menu', 'transaction-menu', 'option-menu', 'main-content-end']; | ||||
|         $steps   = []; | ||||
|         foreach ($headers as $header) { | ||||
|             $steps[] = [ | ||||
|                 'element' => '#' . $header, | ||||
|                 'title'   => trans('help.' . $header . '-title'), | ||||
|                 'content' => trans('help.' . $header . '-text'), | ||||
|             ]; | ||||
|         } | ||||
|         $steps[0]['orphan']    = true;// orphan and backdrop for first element. | ||||
|         $steps[0]['backdrop']  = true; | ||||
|         $steps[1]['placement'] = 'left';// sidebar position left: | ||||
|         $steps[7]['orphan']    = true; // final in the center again. | ||||
|         $steps[7]['backdrop']  = true; | ||||
|         $template              = view('json.tour')->render(); | ||||
|  | ||||
|         return Response::json(['steps' => $steps, 'template' => $template]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BillRepositoryInterface    $repository | ||||
| @@ -34,8 +72,10 @@ class JsonController extends Controller | ||||
|      */ | ||||
|     public function boxBillsPaid(BillRepositoryInterface $repository, AccountRepositoryInterface $accountRepository) | ||||
|     { | ||||
|         $start = Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end   = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         $start  = Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end    = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         $amount = 0; | ||||
|         bcscale(2); | ||||
|  | ||||
|         // works for json too! | ||||
|         $cache = new CacheProperties; | ||||
| @@ -45,37 +85,27 @@ class JsonController extends Controller | ||||
|         if ($cache->has()) { | ||||
|             return Response::json($cache->get()); // @codeCoverageIgnore | ||||
|         } | ||||
|  | ||||
|         $amount = 0; | ||||
|  | ||||
|  | ||||
|         // these two functions are the same as the chart | ||||
|         $bills = $repository->getActiveBills(); | ||||
|         $bills = $repository->getActiveBills(); // these two functions are the same as the chart | ||||
|  | ||||
|         /** @var Bill $bill */ | ||||
|         foreach ($bills as $bill) { | ||||
|             $amount += $repository->billPaymentsInRange($bill, $start, $end); | ||||
|             $amount = bcadd($amount, $repository->billPaymentsInRange($bill, $start, $end)); | ||||
|         } | ||||
|         unset($bill, $bills); | ||||
|  | ||||
|         /** | ||||
|          * Find credit card accounts and possibly unpaid credit card bills. | ||||
|          */ | ||||
|         $creditCards = $accountRepository->getCreditCards(); | ||||
|         // if the balance is not zero, the monthly payment is still underway. | ||||
|         $creditCards = $accountRepository->getCreditCards(); // Find credit card accounts and possibly unpaid credit card bills. | ||||
|         /** @var Account $creditCard */ | ||||
|         foreach ($creditCards as $creditCard) { | ||||
|             $balance = Steam::balance($creditCard, $end, true); | ||||
|             $balance = Steam::balance($creditCard, $end, true); // if the balance is not zero, the monthly payment is still underway. | ||||
|             if ($balance == 0) { | ||||
|                 // find a transfer TO the credit card which should account for | ||||
|                 // anything paid. If not, the CC is not yet used. | ||||
|                 $amount += $accountRepository->getTransfersInRange($creditCard, $start, $end)->sum('amount'); | ||||
|                 $amount = bcadd($amount, $accountRepository->getTransfersInRange($creditCard, $start, $end)->sum('amount')); | ||||
|             } | ||||
|         } | ||||
|         $data = ['box' => 'bills-paid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; | ||||
|         $cache->store($data); | ||||
|  | ||||
|  | ||||
|         return Response::json($data); | ||||
|     } | ||||
|  | ||||
| @@ -90,6 +120,7 @@ class JsonController extends Controller | ||||
|         $amount = 0; | ||||
|         $start  = Session::get('start', Carbon::now()->startOfMonth()); | ||||
|         $end    = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         bcscale(2); | ||||
|  | ||||
|         // works for json too! | ||||
|         $cache = new CacheProperties; | ||||
| @@ -131,7 +162,7 @@ class JsonController extends Controller | ||||
|         /** @var Bill $entry */ | ||||
|         foreach ($unpaid as $entry) { | ||||
|             $current = ($entry[0]->amount_max + $entry[0]->amount_min) / 2; | ||||
|             $amount += $current; | ||||
|             $amount  = bcadd($amount, $current); | ||||
|         } | ||||
|  | ||||
|         $data = ['box' => 'bills-unpaid', 'amount' => Amount::format($amount, false), 'amount_raw' => $amount]; | ||||
|   | ||||
| @@ -7,7 +7,6 @@ use FireflyIII\Http\Requests\NewUserFormRequest; | ||||
| use FireflyIII\Models\AccountMeta; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use View; | ||||
|  | ||||
| @@ -35,7 +34,7 @@ class NewUserController extends Controller | ||||
|         $count = $repository->countAccounts($types); | ||||
|  | ||||
|         if ($count > 0) { | ||||
|             return Redirect::route('index'); | ||||
|             return redirect(route('index')); | ||||
|  | ||||
|         } | ||||
|  | ||||
| @@ -106,6 +105,6 @@ class NewUserController extends Controller | ||||
|         Session::flash('success', 'New account(s) created!'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::route('index'); | ||||
|         return redirect(route('index')); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,7 +11,6 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Illuminate\Support\Collection; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use Steam; | ||||
| use URL; | ||||
| @@ -112,7 +111,7 @@ class PiggyBankController extends Controller | ||||
|         Preferences::mark(); | ||||
|         $repository->destroy($piggyBank); | ||||
|  | ||||
|         return Redirect::to(Session::get('piggy-banks.delete.url')); | ||||
|         return redirect(Session::get('piggy-banks.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -167,6 +166,7 @@ class PiggyBankController extends Controller | ||||
|         /** @var Collection $piggyBanks */ | ||||
|         $piggyBanks = $piggyRepository->getPiggyBanks(); | ||||
|         $end        = Session::get('end', Carbon::now()->endOfMonth()); | ||||
|         bcscale(2); | ||||
|  | ||||
|         $accounts = []; | ||||
|         /** @var PiggyBank $piggyBank */ | ||||
| @@ -189,9 +189,9 @@ class PiggyBankController extends Controller | ||||
|                     'leftToSave'        => $piggyBank->leftToSave | ||||
|                 ]; | ||||
|             } else { | ||||
|                 $accounts[$account->id]['sumOfSaved'] += $piggyBank->savedSoFar; | ||||
|                 $accounts[$account->id]['sumOfTargets'] += floatval($piggyBank->targetamount); | ||||
|                 $accounts[$account->id]['leftToSave'] += $piggyBank->leftToSave; | ||||
|                 $accounts[$account->id]['sumOfSaved']   = bcadd($accounts[$account->id]['sumOfSaved'], $piggyBank->savedSoFar); | ||||
|                 $accounts[$account->id]['sumOfTargets'] = bcadd($accounts[$account->id]['sumOfTargets'], $piggyBank->targetamount); | ||||
|                 $accounts[$account->id]['leftToSave']   = bcadd($accounts[$account->id]['leftToSave'], $piggyBank->leftToSave); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -231,10 +231,11 @@ class PiggyBankController extends Controller | ||||
|         $savedSoFar    = $piggyBank->currentRelevantRep()->currentamount; | ||||
|         $leftToSave    = $piggyBank->targetamount - $savedSoFar; | ||||
|         $maxAmount     = round(min($leftOnAccount, $leftToSave), 2); | ||||
|         bcscale(2); | ||||
|  | ||||
|         if ($amount <= $maxAmount) { | ||||
|             $repetition = $piggyBank->currentRelevantRep(); | ||||
|             $repetition->currentamount += $amount; | ||||
|             $repetition                = $piggyBank->currentRelevantRep(); | ||||
|             $repetition->currentamount = bcadd($repetition->currentamount, $amount); | ||||
|             $repetition->save(); | ||||
|  | ||||
|             // create event | ||||
| @@ -246,7 +247,7 @@ class PiggyBankController extends Controller | ||||
|             Session::flash('error', 'Could not add ' . Amount::format($amount, false) . ' to "' . e($piggyBank->name) . '".'); | ||||
|         } | ||||
|  | ||||
|         return Redirect::route('piggy-banks.index'); | ||||
|         return redirect(route('piggy-banks.index')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -258,12 +259,13 @@ class PiggyBankController extends Controller | ||||
|     public function postRemove(PiggyBankRepositoryInterface $repository, PiggyBank $piggyBank) | ||||
|     { | ||||
|         $amount = floatval(Input::get('amount')); | ||||
|         bcscale(2); | ||||
|  | ||||
|         $savedSoFar = $piggyBank->currentRelevantRep()->currentamount; | ||||
|  | ||||
|         if ($amount <= $savedSoFar) { | ||||
|             $repetition = $piggyBank->currentRelevantRep(); | ||||
|             $repetition->currentamount -= $amount; | ||||
|             $repetition                = $piggyBank->currentRelevantRep(); | ||||
|             $repetition->currentamount = bcsub($repetition->currentamount, $amount); | ||||
|             $repetition->save(); | ||||
|  | ||||
|             // create event | ||||
| @@ -275,7 +277,7 @@ class PiggyBankController extends Controller | ||||
|             Session::flash('error', 'Could not remove ' . Amount::format($amount, false) . ' from "' . e($piggyBank->name) . '".'); | ||||
|         } | ||||
|  | ||||
|         return Redirect::route('piggy-banks.index'); | ||||
|         return redirect(route('piggy-banks.index')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -331,12 +333,12 @@ class PiggyBankController extends Controller | ||||
|         if (intval(Input::get('create_another')) === 1) { | ||||
|             Session::put('piggy-banks.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('piggy-banks.create')->withInput(); | ||||
|             return redirect(route('piggy-banks.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('piggy-banks.create.url')); | ||||
|         return redirect(Session::get('piggy-banks.create.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -366,12 +368,12 @@ class PiggyBankController extends Controller | ||||
|         if (intval(Input::get('return_to_edit')) === 1) { | ||||
|             Session::put('piggy-banks.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('piggy-banks.edit', [$piggyBank->id]); | ||||
|             return redirect(route('piggy-banks.edit', [$piggyBank->id])); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('piggy-banks.edit.url')); | ||||
|         return redirect(Session::get('piggy-banks.edit.url')); | ||||
|  | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -4,7 +4,6 @@ use Config; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Session; | ||||
| use View; | ||||
|  | ||||
| @@ -79,7 +78,7 @@ class PreferencesController extends Controller | ||||
|         Session::flash('success', 'Preferences saved!'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::route('preferences'); | ||||
|         return redirect(route('preferences')); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,6 @@ use FireflyIII\Http\Requests; | ||||
| use FireflyIII\Http\Requests\DeleteAccountFormRequest; | ||||
| use FireflyIII\Http\Requests\ProfileFormRequest; | ||||
| use Hash; | ||||
| use Redirect; | ||||
| use Session; | ||||
|  | ||||
| /** | ||||
| @@ -56,13 +55,13 @@ class ProfileController extends Controller | ||||
|         if (!Hash::check($request->get('current_password'), Auth::user()->password)) { | ||||
|             Session::flash('error', 'Invalid current password!'); | ||||
|  | ||||
|             return Redirect::route('profile.change-password'); | ||||
|             return redirect(route('profile.change-password')); | ||||
|         } | ||||
|         $result = $this->validatePassword($request->get('current_password'), $request->get('new_password')); | ||||
|         if (!($result === true)) { | ||||
|             Session::flash('error', $result); | ||||
|  | ||||
|             return Redirect::route('profile.change-password'); | ||||
|             return redirect(route('profile.change-password')); | ||||
|         } | ||||
|  | ||||
|         // update the user with the new password. | ||||
| @@ -71,7 +70,7 @@ class ProfileController extends Controller | ||||
|  | ||||
|         Session::flash('success', 'Password changed!'); | ||||
|  | ||||
|         return Redirect::route('profile'); | ||||
|         return redirect(route('profile')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -103,7 +102,7 @@ class ProfileController extends Controller | ||||
|         if (!Hash::check($request->get('password'), Auth::user()->password)) { | ||||
|             Session::flash('error', 'Invalid password!'); | ||||
|  | ||||
|             return Redirect::route('profile.delete-account'); | ||||
|             return redirect(route('profile.delete-account')); | ||||
|         } | ||||
|  | ||||
|         // DELETE! | ||||
| @@ -112,7 +111,7 @@ class ProfileController extends Controller | ||||
|         Session::flash('gaEventCategory', 'user'); | ||||
|         Session::flash('gaEventAction', 'delete-account'); | ||||
|  | ||||
|         return Redirect::route('index'); | ||||
|         return redirect(route('index')); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -88,7 +88,7 @@ class ReportController extends Controller | ||||
|         $budgets    = $this->helper->getBudgetReport($start, $end, $shared); | ||||
|         $categories = $this->helper->getCategoryReport($start, $end, $shared); | ||||
|         $balance    = $this->helper->getBalanceReport($start, $end, $shared); | ||||
|         $bills      = $this->helper->getBillReport($start, $end, $shared); | ||||
|         $bills      = $this->helper->getBillReport($start, $end); | ||||
|  | ||||
|         Session::flash('gaEventCategory', 'report'); | ||||
|         Session::flash('gaEventAction', 'month'); | ||||
|   | ||||
| @@ -8,9 +8,9 @@ use FireflyIII\Http\Requests\TagFormRequest; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Repositories\Tag\TagRepositoryInterface; | ||||
| use Illuminate\Support\Collection; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Response; | ||||
| use Session; | ||||
| use URL; | ||||
| @@ -108,7 +108,7 @@ class TagController extends Controller | ||||
|         Session::flash('success', 'Tag "' . e($tagName) . '" was deleted.'); | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         return Redirect::to(route('tags.index')); | ||||
|         return redirect(route('tags.index')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -185,7 +185,16 @@ class TagController extends Controller | ||||
|         // loop each types and get the tags, group them by year. | ||||
|         $collection = []; | ||||
|         foreach ($types as $type) { | ||||
|  | ||||
|             /** @var Collection $tags */ | ||||
|             $tags = Auth::user()->tags()->where('tagMode', $type)->orderBy('date', 'ASC')->get(); | ||||
|  | ||||
|             $tags = $tags->sortBy( | ||||
|                 function (Tag $tag) { | ||||
|                     return strtolower($tag->tag); | ||||
|                 } | ||||
|             ); | ||||
|  | ||||
|             /** @var Tag $tag */ | ||||
|             foreach ($tags as $tag) { | ||||
|                 $year                               = is_null($tag->date) ? trans('firefly.no_year') : $tag->date->year; | ||||
| @@ -221,9 +230,9 @@ class TagController extends Controller | ||||
|     public function store(TagFormRequest $request, TagRepositoryInterface $repository) | ||||
|     { | ||||
|         if (Input::get('setTag') == 'true') { | ||||
|             $latitude  = strlen($request->get('latitude')) > 0 ? $request->get('latitude') : null; | ||||
|             $longitude = strlen($request->get('longitude')) > 0 ? $request->get('longitude') : null; | ||||
|             $zoomLevel = strlen($request->get('zoomLevel')) > 0 ? $request->get('zoomLevel') : null; | ||||
|             $latitude  = $request->get('latitude'); | ||||
|             $longitude = $request->get('longitude'); | ||||
|             $zoomLevel = $request->get('zoomLevel'); | ||||
|         } else { | ||||
|             $latitude  = null; | ||||
|             $longitude = null; | ||||
| @@ -248,11 +257,11 @@ class TagController extends Controller | ||||
|             // set value so create routine will not overwrite URL: | ||||
|             Session::put('tags.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('tags.create')->withInput(); | ||||
|             return redirect(route('tags.create'))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('tags.create.url')); | ||||
|         return redirect(Session::get('tags.create.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
| @@ -295,10 +304,10 @@ class TagController extends Controller | ||||
|             // set value so edit routine will not overwrite URL: | ||||
|             Session::put('tags.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('tags.edit', [$tag->id])->withInput(['return_to_edit' => 1]); | ||||
|             return redirect(route('tags.edit', [$tag->id]))->withInput(['return_to_edit' => 1]); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('tags.edit.url')); | ||||
|         return redirect(Session::get('tags.edit.url')); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| use Auth; | ||||
| use Carbon\Carbon; | ||||
| use Config; | ||||
| use ExpandedForm; | ||||
| use FireflyIII\Events\JournalCreated; | ||||
| use FireflyIII\Events\JournalSaved; | ||||
| @@ -12,7 +13,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Input; | ||||
| use Preferences; | ||||
| use Redirect; | ||||
| use Response; | ||||
| use Session; | ||||
| use URL; | ||||
| @@ -108,7 +108,7 @@ class TransactionController extends Controller | ||||
|         Preferences::mark(); | ||||
|  | ||||
|         // redirect to previous URL: | ||||
|         return Redirect::to(Session::get('transactions.delete.url')); | ||||
|         return redirect(Session::get('transactions.delete.url')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -179,7 +179,7 @@ class TransactionController extends Controller | ||||
|         Session::forget('transactions.edit.fromUpdate'); | ||||
|  | ||||
|  | ||||
|         return View::make('transactions.edit', compact('journal', 'accounts', 'what', 'budgets', 'piggies', 'subTitle'))->with('data', $preFilled); | ||||
|         return view('transactions.edit', compact('journal', 'accounts', 'what', 'budgets', 'piggies', 'subTitle'))->with('data', $preFilled); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -190,31 +190,12 @@ class TransactionController extends Controller | ||||
|      */ | ||||
|     public function index(JournalRepositoryInterface $repository, $what) | ||||
|     { | ||||
|         $types = []; | ||||
|         switch ($what) { | ||||
|             case 'expenses': | ||||
|             case 'withdrawal': | ||||
|                 $subTitleIcon = 'fa-long-arrow-left'; | ||||
|                 $subTitle     = trans('firefly.expenses'); | ||||
|                 $types        = ['Withdrawal']; | ||||
|                 break; | ||||
|             case 'revenue': | ||||
|             case 'deposit': | ||||
|                 $subTitleIcon = 'fa-long-arrow-right'; | ||||
|                 $subTitle     = trans('firefly.income'); | ||||
|                 $types        = ['Deposit']; | ||||
|                 break; | ||||
|             case 'transfer': | ||||
|             case 'transfers': | ||||
|                 $subTitleIcon = 'fa-exchange'; | ||||
|                 $subTitle     = trans('firefly.transfers'); | ||||
|                 $types        = ['Transfer']; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         $page     = intval(Input::get('page')); | ||||
|         $offset   = $page > 0 ? ($page - 1) * 50 : 0; | ||||
|         $journals = $repository->getJournalsOfTypes($types, $offset, $page); | ||||
|         $subTitleIcon = Config::get('firefly.transactionIconsByWhat.' . $what); | ||||
|         $types        = Config::get('firefly.transactionTypesByWhat.' . $what); | ||||
|         $subTitle     = trans('firefly.title_' . $what); | ||||
|         $page         = intval(Input::get('page')); | ||||
|         $offset       = $page > 0 ? ($page - 1) * 50 : 0; | ||||
|         $journals     = $repository->getJournalsOfTypes($types, $offset, $page); | ||||
|  | ||||
|         $journals->setPath('transactions/' . $what); | ||||
|  | ||||
| @@ -295,11 +276,11 @@ class TransactionController extends Controller | ||||
|             // set value so create routine will not overwrite URL: | ||||
|             Session::put('transactions.create.fromStore', true); | ||||
|  | ||||
|             return Redirect::route('transactions.create', [$request->input('what')])->withInput(); | ||||
|             return redirect(route('transactions.create', [$request->input('what')]))->withInput(); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('transactions.create.url')); | ||||
|         return redirect(Session::get('transactions.create.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
| @@ -327,11 +308,11 @@ class TransactionController extends Controller | ||||
|             // set value so edit routine will not overwrite URL: | ||||
|             Session::put('transactions.edit.fromUpdate', true); | ||||
|  | ||||
|             return Redirect::route('transactions.edit', [$journal->id])->withInput(['return_to_edit' => 1]); | ||||
|             return redirect(route('transactions.edit', [$journal->id]))->withInput(['return_to_edit' => 1]); | ||||
|         } | ||||
|  | ||||
|         // redirect to previous URL. | ||||
|         return Redirect::to(Session::get('transactions.edit.url')); | ||||
|         return redirect(Session::get('transactions.edit.url')); | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Middleware; | ||||
|  | ||||
| use App; | ||||
| use Carbon\Carbon; | ||||
| use Closure; | ||||
| use Illuminate\Contracts\Auth\Guard; | ||||
| @@ -65,7 +64,7 @@ class Range | ||||
|             } | ||||
|             if (!Session::has('first')) { | ||||
|                 /** @var \FireflyIII\Repositories\Journal\JournalRepositoryInterface $repository */ | ||||
|                 $repository = App::make('FireflyIII\Repositories\Journal\JournalRepositoryInterface'); | ||||
|                 $repository = app('FireflyIII\Repositories\Journal\JournalRepositoryInterface'); | ||||
|                 $journal    = $repository->first(); | ||||
|                 if ($journal) { | ||||
|                     Session::put('first', $journal->date); | ||||
|   | ||||
| @@ -44,6 +44,7 @@ class AccountFormRequest extends Request | ||||
|             'id'                   => $idRule, | ||||
|             'name'                 => $nameRule, | ||||
|             'openingBalance'       => 'numeric', | ||||
|             'iban'                 => 'iban', | ||||
|             'virtualBalance'       => 'numeric', | ||||
|             'openingBalanceDate'   => 'date', | ||||
|             'accountRole'          => 'in:' . $accountRoles, | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| namespace FireflyIII\Http\Requests; | ||||
|  | ||||
| use App; | ||||
| use Auth; | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| @@ -85,7 +84,7 @@ class JournalFormRequest extends Request | ||||
|                 $rules['category']        = 'between:1,255'; | ||||
|                 break; | ||||
|             default: | ||||
|                 App::abort(500, 'Cannot handle ' . $what); | ||||
|                 abort(500, 'Cannot handle ' . $what); | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -161,6 +161,43 @@ Breadcrumbs::register( | ||||
| } | ||||
| ); | ||||
|  | ||||
| // CSV: | ||||
| Breadcrumbs::register( | ||||
|     'csv.index', function (Generator $breadcrumbs) { | ||||
|     $breadcrumbs->parent('home'); | ||||
|     $breadcrumbs->push(trans('firefly.csv_index_title'), route('csv.index')); | ||||
| } | ||||
| ); | ||||
|  | ||||
| Breadcrumbs::register( | ||||
|     'csv.column-roles', function (Generator $breadcrumbs) { | ||||
|     $breadcrumbs->parent('csv.index'); | ||||
|     $breadcrumbs->push(trans('firefly.csv_define_column_roles'), route('csv.column-roles')); | ||||
| } | ||||
| ); | ||||
|  | ||||
| Breadcrumbs::register( | ||||
|     'csv.map', function (Generator $breadcrumbs) { | ||||
|     $breadcrumbs->parent('csv.index'); | ||||
|     $breadcrumbs->push(trans('firefly.csv_map_values'), route('csv.map')); | ||||
| } | ||||
| ); | ||||
|  | ||||
| Breadcrumbs::register( | ||||
|     'csv.download-config-page', function (Generator $breadcrumbs) { | ||||
|     $breadcrumbs->parent('csv.index'); | ||||
|     $breadcrumbs->push(trans('firefly.csv_download_config'), route('csv.download-config-page')); | ||||
| } | ||||
| ); | ||||
|  | ||||
| Breadcrumbs::register( | ||||
|     'csv.process', function (Generator $breadcrumbs) { | ||||
|     $breadcrumbs->parent('csv.index'); | ||||
|     $breadcrumbs->push(trans('firefly.csv_process_title'), route('csv.process')); | ||||
| } | ||||
| ); | ||||
|  | ||||
|  | ||||
| // currencies. | ||||
| Breadcrumbs::register( | ||||
|     'currency.index', function (Generator $breadcrumbs) { | ||||
|   | ||||
| @@ -181,7 +181,7 @@ Route::group( | ||||
|      * Bills Controller | ||||
|      */ | ||||
|     Route::get('/bills', ['uses' => 'BillController@index', 'as' => 'bills.index']); | ||||
|     Route::get('/bills/rescan/{bill}', ['uses' => 'BillController@rescan', 'as' => 'bills.rescan']); # rescan for matching. | ||||
|     Route::get('/bills/rescan/{bill}', ['uses' => 'BillController@rescan', 'as' => 'bills.rescan']); | ||||
|     Route::get('/bills/create', ['uses' => 'BillController@create', 'as' => 'bills.create']); | ||||
|     Route::get('/bills/edit/{bill}', ['uses' => 'BillController@edit', 'as' => 'bills.edit']); | ||||
|     Route::get('/bills/delete/{bill}', ['uses' => 'BillController@delete', 'as' => 'bills.delete']); | ||||
| @@ -194,7 +194,7 @@ Route::group( | ||||
|      * Budget Controller | ||||
|      */ | ||||
|     Route::get('/budgets', ['uses' => 'BudgetController@index', 'as' => 'budgets.index']); | ||||
|     Route::get('/budgets/income', ['uses' => 'BudgetController@updateIncome', 'as' => 'budgets.income']); # extra. | ||||
|     Route::get('/budgets/income', ['uses' => 'BudgetController@updateIncome', 'as' => 'budgets.income']); | ||||
|     Route::get('/budgets/create', ['uses' => 'BudgetController@create', 'as' => 'budgets.create']); | ||||
|     Route::get('/budgets/edit/{budget}', ['uses' => 'BudgetController@edit', 'as' => 'budgets.edit']); | ||||
|     Route::get('/budgets/delete/{budget}', ['uses' => 'BudgetController@delete', 'as' => 'budgets.delete']); | ||||
| @@ -219,6 +219,21 @@ Route::group( | ||||
|     Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']); | ||||
|     Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * CSV controller | ||||
|      */ | ||||
|     Route::get('/csv', ['uses' => 'CsvController@index', 'as' => 'csv.index']); | ||||
|     Route::post('/csv/upload', ['uses' => 'CsvController@upload', 'as' => 'csv.upload']); | ||||
|     Route::get('/csv/column_roles', ['uses' => 'CsvController@columnRoles', 'as' => 'csv.column-roles']); | ||||
|     Route::post('/csv/initial_parse', ['uses' => 'CsvController@initialParse', 'as' => 'csv.initial_parse']); | ||||
|     Route::get('/csv/map', ['uses' => 'CsvController@map', 'as' => 'csv.map']); | ||||
|     Route::get('/csv/download-config', ['uses' => 'CsvController@downloadConfig', 'as' => 'csv.download-config']); | ||||
|     Route::get('/csv/download', ['uses' => 'CsvController@downloadConfigPage', 'as' => 'csv.download-config-page']); | ||||
|     Route::post('/csv/save_mapping', ['uses' => 'CsvController@saveMapping', 'as' => 'csv.save_mapping']); | ||||
|  | ||||
|     Route::get('/csv/process', ['uses' => 'CsvController@process', 'as' => 'csv.process']); | ||||
|  | ||||
|     /** | ||||
|      * Currency Controller | ||||
|      */ | ||||
| @@ -281,6 +296,9 @@ Route::group( | ||||
|     Route::get('/json/revenue-accounts', ['uses' => 'JsonController@revenueAccounts', 'as' => 'json.revenue-accounts']); | ||||
|     Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']); | ||||
|     Route::get('/json/tags', ['uses' => 'JsonController@tags', 'as' => 'json.tags']); | ||||
|     Route::get('/json/tour', ['uses' => 'JsonController@tour', 'as' => 'json.tour']); | ||||
|     Route::post('/json/end-tour', ['uses' => 'JsonController@endTour']); | ||||
|  | ||||
|     Route::get('/json/box/in', ['uses' => 'JsonController@boxIn', 'as' => 'json.box.in']); | ||||
|     Route::get('/json/box/out', ['uses' => 'JsonController@boxOut', 'as' => 'json.box.out']); | ||||
|     Route::get('/json/box/bills-unpaid', ['uses' => 'JsonController@boxBillsUnpaid', 'as' => 'json.box.paid']); | ||||
| @@ -297,8 +315,8 @@ Route::group( | ||||
|      * Piggy Bank Controller | ||||
|      */ | ||||
|     Route::get('/piggy-banks', ['uses' => 'PiggyBankController@index', 'as' => 'piggy-banks.index']); | ||||
|     Route::get('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@add', 'as' => 'piggy-banks.addMoney']); # add money | ||||
|     Route::get('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@remove', 'as' => 'piggy-banks.removeMoney']); #remove money | ||||
|     Route::get('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@add', 'as' => 'piggy-banks.addMoney']); | ||||
|     Route::get('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@remove', 'as' => 'piggy-banks.removeMoney']); | ||||
|     Route::get('/piggy-banks/create', ['uses' => 'PiggyBankController@create', 'as' => 'piggy-banks.create']); | ||||
|     Route::get('/piggy-banks/edit/{piggyBank}', ['uses' => 'PiggyBankController@edit', 'as' => 'piggy-banks.edit']); | ||||
|     Route::get('/piggy-banks/delete/{piggyBank}', ['uses' => 'PiggyBankController@delete', 'as' => 'piggy-banks.delete']); | ||||
| @@ -306,8 +324,8 @@ Route::group( | ||||
|     Route::post('/piggy-banks/store', ['uses' => 'PiggyBankController@store', 'as' => 'piggy-banks.store']); | ||||
|     Route::post('/piggy-banks/update/{piggyBank}', ['uses' => 'PiggyBankController@update', 'as' => 'piggy-banks.update']); | ||||
|     Route::post('/piggy-banks/destroy/{piggyBank}', ['uses' => 'PiggyBankController@destroy', 'as' => 'piggy-banks.destroy']); | ||||
|     Route::post('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@postAdd', 'as' => 'piggy-banks.add']); # add money | ||||
|     Route::post('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@postRemove', 'as' => 'piggy-banks.remove']); # remove money. | ||||
|     Route::post('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@postAdd', 'as' => 'piggy-banks.add']); | ||||
|     Route::post('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@postRemove', 'as' => 'piggy-banks.remove']); | ||||
|     Route::post('/piggy-banks/sort', ['uses' => 'PiggyBankController@order', 'as' => 'piggy-banks.order']); | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -11,22 +11,23 @@ use Watson\Validating\ValidatingTrait; | ||||
|  * Class Account | ||||
|  * | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                                                                        $id | ||||
|  * @property \Carbon\Carbon                                                                 $created_at | ||||
|  * @property \Carbon\Carbon                                                                 $updated_at | ||||
|  * @property \Carbon\Carbon                                                                 $deleted_at | ||||
|  * @property integer                                                                        $user_id | ||||
|  * @property integer                                                                        $account_type_id | ||||
|  * @property string                                                                         $name | ||||
|  * @property boolean                                                                        $active | ||||
|  * @property boolean                                                                        $encrypted | ||||
|  * @property float                                                                          $virtual_balance | ||||
|  * @property string                                                                         $virtual_balance_encrypted | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\AccountMeta[] $accountMeta | ||||
|  * @property-read \FireflyIII\Models\AccountType                                            $accountType | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[]   $piggyBanks | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Transaction[] $transactions | ||||
|  * @property-read \FireflyIII\User                                                          $user | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property \Carbon\Carbon $deleted_at  | ||||
|  * @property integer $user_id  | ||||
|  * @property integer $account_type_id  | ||||
|  * @property string $name  | ||||
|  * @property boolean $active  | ||||
|  * @property boolean $encrypted  | ||||
|  * @property float $virtual_balance  | ||||
|  * @property string $iban  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\AccountMeta[] $accountMeta  | ||||
|  * @property-read \FireflyIII\Models\AccountType $accountType  | ||||
|  * @property-read mixed $name_for_editform  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Transaction[] $transactions  | ||||
|  * @property-read \FireflyIII\User $user  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereUpdatedAt($value) | ||||
| @@ -37,28 +38,28 @@ use Watson\Validating\ValidatingTrait; | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereActive($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereEncrypted($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereVirtualBalance($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereVirtualBalanceEncrypted($value) | ||||
|  * @method static \FireflyIII\Models\Account accountTypeIn($types) | ||||
|  * @method static \FireflyIII\Models\Account hasMetaValue($name, $value) | ||||
|  * @property boolean                                                                        joinedAccountTypes | ||||
|  * @property mixed                                                                          startBalance | ||||
|  * @property mixed                                                                          endBalance | ||||
|  * @property mixed                                                                          lastActivityDate | ||||
|  * @property mixed                                                                          piggyBalance | ||||
|  * @property mixed                                                                          difference | ||||
|  * @property mixed                                                                          percentage | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account whereIban($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account accountTypeIn($types) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Account hasMetaValue($name, $value) | ||||
|  * @property-read bool $joinedAccountTypes | ||||
|  * @property float $startBalance | ||||
|  * @property float $endBalance | ||||
|  * @property float $piggyBalance | ||||
|  * @property float $percentage | ||||
|  * @property float $difference | ||||
|  * @property \Carbon\Carbon $lastActivityDate | ||||
|  */ | ||||
| class Account extends Model | ||||
| { | ||||
|     use SoftDeletes, ValidatingTrait; | ||||
|  | ||||
|     protected $fillable = ['user_id', 'account_type_id', 'name', 'active', 'virtual_balance']; | ||||
|     protected $fillable = ['user_id', 'account_type_id', 'name', 'active', 'virtual_balance', 'iban']; | ||||
|     protected $hidden   = ['virtual_balance_encrypted', 'encrypted']; | ||||
|     protected $rules | ||||
|                         = [ | ||||
|             'user_id'         => 'required|exists:users,id', | ||||
|             'account_type_id' => 'required|exists:account_types,id', | ||||
|             'name'            => 'required|between:1,1024|uniqueAccountForUser', | ||||
|             'name'            => 'required', | ||||
|             'active'          => 'required|boolean' | ||||
|         ]; | ||||
|  | ||||
| @@ -71,11 +72,12 @@ class Account extends Model | ||||
|     public static function firstOrCreateEncrypted(array $fields) | ||||
|     { | ||||
|         // everything but the name: | ||||
|         $query = Account::orderBy('id'); | ||||
|         foreach ($fields as $name => $value) { | ||||
|             if ($name != 'name') { | ||||
|                 $query->where($name, $value); | ||||
|             } | ||||
|         $query  = Account::orderBy('id'); | ||||
|         $search = $fields; | ||||
|         unset($search['name'], $search['iban']); | ||||
|  | ||||
|         foreach ($search as $name => $value) { | ||||
|             $query->where($name, $value); | ||||
|         } | ||||
|         $set = $query->get(['accounts.*']); | ||||
|         /** @var Account $account */ | ||||
| @@ -84,6 +86,11 @@ class Account extends Model | ||||
|                 return $account; | ||||
|             } | ||||
|         } | ||||
|         // account must have a name. If not set, use IBAN. | ||||
|         if (!isset($fields['name'])) { | ||||
|             $fields['name'] = $fields['iban']; | ||||
|         } | ||||
|  | ||||
|         // create it! | ||||
|         $account = Account::create($fields); | ||||
|  | ||||
| @@ -99,11 +106,11 @@ class Account extends Model | ||||
|     public static function firstOrNullEncrypted(array $fields) | ||||
|     { | ||||
|         // everything but the name: | ||||
|         $query = Account::orderBy('id'); | ||||
|         foreach ($fields as $name => $value) { | ||||
|             if ($name != 'name') { | ||||
|                 $query->where($name, $value); | ||||
|             } | ||||
|         $query  = Account::orderBy('id'); | ||||
|         $search = $fields; | ||||
|         unset($search['name']); | ||||
|         foreach ($search as $name => $value) { | ||||
|             $query->where($name, $value); | ||||
|         } | ||||
|         $set = $query->get(['accounts.*']); | ||||
|         /** @var Account $account */ | ||||
| @@ -143,6 +150,22 @@ class Account extends Model | ||||
|         return ['created_at', 'updated_at', 'deleted_at']; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param $value | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getIbanAttribute($value) | ||||
|     { | ||||
|         if (is_null($value)) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         return Crypt::decrypt($value); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param string $fieldName | ||||
| @@ -236,6 +259,16 @@ class Account extends Model | ||||
|         $query->where($joinName . '.data', json_encode($value)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @param $value | ||||
|      */ | ||||
|     public function setIbanAttribute($value) | ||||
|     { | ||||
|         $this->attributes['iban'] = Crypt::encrypt($value); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|   | ||||
| @@ -6,15 +6,14 @@ use Watson\Validating\ValidatingTrait; | ||||
| /** | ||||
|  * Class AccountMeta | ||||
|  * | ||||
|  * @codeCoverageIgnore | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                         $id | ||||
|  * @property \Carbon\Carbon                  $created_at | ||||
|  * @property \Carbon\Carbon                  $updated_at | ||||
|  * @property integer                         $account_id | ||||
|  * @property string                          $name | ||||
|  * @property string                          $data | ||||
|  * @property-read \FireflyIII\Models\Account $account | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property integer $account_id  | ||||
|  * @property string $name  | ||||
|  * @property string $data  | ||||
|  * @property-read \FireflyIII\Models\Account $account  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountMeta whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountMeta whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountMeta whereUpdatedAt($value) | ||||
|   | ||||
| @@ -5,14 +5,13 @@ use Illuminate\Database\Eloquent\Model; | ||||
| /** | ||||
|  * Class AccountType | ||||
|  * | ||||
|  * @codeCoverageIgnore | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                                                                    $id | ||||
|  * @property \Carbon\Carbon                                                             $created_at | ||||
|  * @property \Carbon\Carbon                                                             $updated_at | ||||
|  * @property string                                                                     $type | ||||
|  * @property boolean                                                                    $editable | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Account[] $accounts | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property string $type  | ||||
|  * @property boolean $editable  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Account[] $accounts  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountType whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountType whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\AccountType whereUpdatedAt($value) | ||||
|   | ||||
| @@ -4,29 +4,26 @@ use Crypt; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
|  | ||||
| /** | ||||
|  * FireflyIII\Models\Bill | ||||
|  * Class Bill | ||||
|  * | ||||
|  * @codeCoverageIgnore Class Bill | ||||
|  * @package            FireflyIII\Models | ||||
|  * @property integer                                                                               $id | ||||
|  * @property \Carbon\Carbon                                                                        $created_at | ||||
|  * @property \Carbon\Carbon                                                                        $updated_at | ||||
|  * @property integer                                                                               $user_id | ||||
|  * @property string                                                                                $name | ||||
|  * @property string                                                                                $match | ||||
|  * @property float                                                                                 $amount_min | ||||
|  * @property string                                                                                $amount_min_encrypted | ||||
|  * @property float                                                                                 $amount_max | ||||
|  * @property string                                                                                $amount_max_encrypted | ||||
|  * @property \Carbon\Carbon                                                                        $date | ||||
|  * @property boolean                                                                               $active | ||||
|  * @property boolean                                                                               $automatch | ||||
|  * @property string                                                                                $repeat_freq | ||||
|  * @property integer                                                                               $skip | ||||
|  * @property boolean                                                                               $name_encrypted | ||||
|  * @property boolean                                                                               $match_encrypted | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals | ||||
|  * @property-read \FireflyIII\User                                                                 $user | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property integer $user_id  | ||||
|  * @property string $name  | ||||
|  * @property string $match  | ||||
|  * @property float $amount_min  | ||||
|  * @property float $amount_max  | ||||
|  * @property \Carbon\Carbon $date  | ||||
|  * @property boolean $active  | ||||
|  * @property boolean $automatch  | ||||
|  * @property string $repeat_freq  | ||||
|  * @property integer $skip  | ||||
|  * @property boolean $name_encrypted  | ||||
|  * @property boolean $match_encrypted  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals  | ||||
|  * @property-read \FireflyIII\User $user  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereUpdatedAt($value) | ||||
| @@ -34,9 +31,7 @@ use Illuminate\Database\Eloquent\Model; | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereName($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereMatch($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereAmountMin($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereAmountMinEncrypted($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereAmountMax($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereAmountMaxEncrypted($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereDate($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereActive($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereAutomatch($value) | ||||
| @@ -44,8 +39,8 @@ use Illuminate\Database\Eloquent\Model; | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereSkip($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereNameEncrypted($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Bill whereMatchEncrypted($value) | ||||
|  * @property mixed                                                                                 nextExpectedMatch | ||||
|  * @property mixed                                                                                 lastFoundMatch | ||||
|  * @property-read \Carbon\Carbon $nextExpectedMatch | ||||
|  * @property-read \Carbon\Carbon $lastFoundMatch | ||||
|  */ | ||||
| class Bill extends Model | ||||
| { | ||||
|   | ||||
| @@ -7,19 +7,18 @@ use Illuminate\Database\Eloquent\SoftDeletes; | ||||
| /** | ||||
|  * Class Budget | ||||
|  * | ||||
|  * @codeCoverageIgnore | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                                                                               $id | ||||
|  * @property \Carbon\Carbon                                                                        $created_at | ||||
|  * @property \Carbon\Carbon                                                                        $updated_at | ||||
|  * @property \Carbon\Carbon                                                                        $deleted_at | ||||
|  * @property string                                                                                $name | ||||
|  * @property integer                                                                               $user_id | ||||
|  * @property boolean                                                                               $active | ||||
|  * @property boolean                                                                               $encrypted | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\BudgetLimit[]        $budgetlimits | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals | ||||
|  * @property-read \FireflyIII\User                                                                 $user | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property \Carbon\Carbon $deleted_at  | ||||
|  * @property string $name  | ||||
|  * @property integer $user_id  | ||||
|  * @property boolean $active  | ||||
|  * @property boolean $encrypted  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\BudgetLimit[] $budgetlimits  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals  | ||||
|  * @property-read \FireflyIII\User $user  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Budget whereUpdatedAt($value) | ||||
| @@ -39,19 +38,17 @@ class Budget extends Model | ||||
|  | ||||
|     /** | ||||
|      * @param array $fields | ||||
|      * @SuppressWarnings(PHPMD.CyclomaticComplexity) | ||||
|      * @codeCoverageIgnore | ||||
|      * | ||||
|      * @return Budget | ||||
|      */ | ||||
|     public static function firstOrCreateEncrypted(array $fields) | ||||
|     { | ||||
|         // everything but the name: | ||||
|         $query = Budget::orderBy('id'); | ||||
|         foreach ($fields as $name => $value) { | ||||
|             if ($name != 'name') { | ||||
|                 $query->where($name, $value); | ||||
|             } | ||||
|         $query  = Budget::orderBy('id'); | ||||
|         $search = $fields; | ||||
|         unset($search['name']); | ||||
|         foreach ($search as $name => $value) { | ||||
|             $query->where($name, $value); | ||||
|         } | ||||
|         $set = $query->get(['budgets.*']); | ||||
|         /** @var Budget $budget */ | ||||
|   | ||||
| @@ -5,26 +5,23 @@ use Illuminate\Database\Eloquent\Model; | ||||
| /** | ||||
|  * Class BudgetLimit | ||||
|  * | ||||
|  * @codeCoverageIgnore | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                                                                            $id | ||||
|  * @property \Carbon\Carbon                                                                     $created_at | ||||
|  * @property \Carbon\Carbon                                                                     $updated_at | ||||
|  * @property integer                                                                            $budget_id | ||||
|  * @property \Carbon\Carbon                                                                     $startdate | ||||
|  * @property float                                                                              $amount | ||||
|  * @property string                                                                             $amount_encrypted | ||||
|  * @property boolean                                                                            $repeats | ||||
|  * @property string                                                                             $repeat_freq | ||||
|  * @property-read \FireflyIII\Models\Budget                                                     $budget | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\LimitRepetition[] $limitrepetitions | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property integer $budget_id  | ||||
|  * @property \Carbon\Carbon $startdate  | ||||
|  * @property float $amount  | ||||
|  * @property boolean $repeats  | ||||
|  * @property string $repeat_freq  | ||||
|  * @property-read \FireflyIII\Models\Budget $budget  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\LimitRepetition[] $limitrepetitions  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereUpdatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereBudgetId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereStartdate($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereAmount($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereAmountEncrypted($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereRepeats($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\BudgetLimit whereRepeatFreq($value) | ||||
|  */ | ||||
|   | ||||
| @@ -8,15 +8,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; | ||||
|  * Class Category | ||||
|  * | ||||
|  * @package FireflyIII\Models | ||||
|  * @property integer                                                                               $id | ||||
|  * @property \Carbon\Carbon                                                                        $created_at | ||||
|  * @property \Carbon\Carbon                                                                        $updated_at | ||||
|  * @property \Carbon\Carbon                                                                        $deleted_at | ||||
|  * @property string                                                                                $name | ||||
|  * @property integer                                                                               $user_id | ||||
|  * @property boolean                                                                               $encrypted | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals | ||||
|  * @property-read \FireflyIII\User                                                                 $user | ||||
|  * @property integer $id  | ||||
|  * @property \Carbon\Carbon $created_at  | ||||
|  * @property \Carbon\Carbon $updated_at  | ||||
|  * @property \Carbon\Carbon $deleted_at  | ||||
|  * @property string $name  | ||||
|  * @property integer $user_id  | ||||
|  * @property boolean $encrypted  | ||||
|  * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionjournals  | ||||
|  * @property-read \FireflyIII\User $user  | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereCreatedAt($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereUpdatedAt($value) | ||||
| @@ -24,8 +24,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereName($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereUserId($value) | ||||
|  * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\Category whereEncrypted($value) | ||||
|  * @property mixed                                                                                 spent | ||||
|  * @property mixed                                                                                 lastActivity | ||||
|  * @property-read float $spent | ||||
|  * @property-read \Carbon\Carbon $lastActivity | ||||
|  */ | ||||
| class Category extends Model | ||||
| { | ||||
| @@ -43,11 +43,12 @@ class Category extends Model | ||||
|     public static function firstOrCreateEncrypted(array $fields) | ||||
|     { | ||||
|         // everything but the name: | ||||
|         $query = Category::orderBy('id'); | ||||
|         foreach ($fields as $name => $value) { | ||||
|             if ($name != 'name') { | ||||
|                 $query->where($name, $value); | ||||
|             } | ||||
|         $query  = Category::orderBy('id'); | ||||
|         $search = $fields; | ||||
|         unset($search['name']); | ||||
|         foreach ($search as $name => $value) { | ||||
|             $query->where($name, $value); | ||||
|  | ||||
|         } | ||||
|         $set = $query->get(['categories.*']); | ||||
|         /** @var Category $category */ | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user