mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-22 20:16:22 +00:00 
			
		
		
		
	Extend report capability for issue #396 and related report issues.
This commit is contained in:
		
							
								
								
									
										137
									
								
								app/Generator/Report/Audit/MonthReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								app/Generator/Report/Audit/MonthReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| <?php | ||||
| /** | ||||
|  * MonthReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Audit; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Generator\Report\ReportGeneratorInterface; | ||||
| use FireflyIII\Helpers\Collector\JournalCollector; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Transaction; | ||||
| use Illuminate\Support\Collection; | ||||
| use Steam; | ||||
|  | ||||
| /** | ||||
|  * Class MonthReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Standard | ||||
|  */ | ||||
| class MonthReportGenerator implements ReportGeneratorInterface | ||||
| { | ||||
|     /** @var  Collection */ | ||||
|     private $accounts; | ||||
|     /** @var  Carbon */ | ||||
|     private $end; | ||||
|     /** @var  Carbon */ | ||||
|     private $start; | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function generate(): string | ||||
|     { | ||||
|  | ||||
|  | ||||
|         $auditData = []; | ||||
|         $dayBefore = clone $this->start; | ||||
|         $dayBefore->subDay(); | ||||
|         /** @var Account $account */ | ||||
|         foreach ($this->accounts as $account) { | ||||
|             // balance the day before: | ||||
|             $id               = $account->id; | ||||
|             $dayBeforeBalance = Steam::balance($account, $dayBefore); | ||||
|             $collector        = new JournalCollector(auth()->user()); | ||||
|             $collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end); | ||||
|             $journals     = $collector->getJournals(); | ||||
|             $journals     = $journals->reverse(); | ||||
|             $startBalance = $dayBeforeBalance; | ||||
|  | ||||
|  | ||||
|             /** @var Transaction $journal */ | ||||
|             foreach ($journals as $transaction) { | ||||
|                 $transaction->before = $startBalance; | ||||
|                 $transactionAmount   = $transaction->transaction_amount; | ||||
|                 $newBalance          = bcadd($startBalance, $transactionAmount); | ||||
|                 $transaction->after  = $newBalance; | ||||
|                 $startBalance        = $newBalance; | ||||
|             } | ||||
|  | ||||
|             /* | ||||
|              * Reverse set again. | ||||
|              */ | ||||
|             $auditData[$id]['journals']         = $journals->reverse(); | ||||
|             $auditData[$id]['exists']           = $journals->count() > 0; | ||||
|             $auditData[$id]['end']              = $this->end->formatLocalized(strval(trans('config.month_and_day'))); | ||||
|             $auditData[$id]['endBalance']       = Steam::balance($account, $this->end); | ||||
|             $auditData[$id]['dayBefore']        = $dayBefore->formatLocalized(strval(trans('config.month_and_day'))); | ||||
|             $auditData[$id]['dayBeforeBalance'] = $dayBeforeBalance; | ||||
|         } | ||||
|  | ||||
|         $reportType = 'audit'; | ||||
|         $accountIds = join(',', $this->accounts->pluck('id')->toArray()); | ||||
|  | ||||
|         $hideable    = ['buttons', 'icon', 'description', 'balance_before', 'amount', 'balance_after', 'date', | ||||
|                         'interest_date', 'book_date', 'process_date', | ||||
|                         // three new optional fields. | ||||
|                         'due_date', 'payment_date', 'invoice_date', | ||||
|                         'from', 'to', 'budget', 'category', 'bill', | ||||
|                         // more new optional fields | ||||
|                         'internal_reference', 'notes', | ||||
|  | ||||
|                         'create_date', 'update_date', | ||||
|         ]; | ||||
|         $defaultShow = ['icon', 'description', 'balance_before', 'amount', 'balance_after', 'date', 'to']; | ||||
|  | ||||
|         return view('reports.audit.report', compact('reportType', 'accountIds', 'auditData', 'hideable', 'defaultShow')) | ||||
|             ->with('start', $this->start)->with('end', $this->end)->with('accounts', $this->accounts) | ||||
|             ->render(); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $accounts | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setAccounts(Collection $accounts): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->accounts = $accounts; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setEndDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->end = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setStartDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->start = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								app/Generator/Report/Audit/MultiYearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/Generator/Report/Audit/MultiYearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?php | ||||
| /** | ||||
|  * MultiYearReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Audit; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Class MultiYearReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Audit | ||||
|  */ | ||||
| class MultiYearReportGenerator extends MonthReportGenerator | ||||
| { | ||||
|     /** | ||||
|      * Doesn't do anything different. | ||||
|      */ | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Generator/Report/Audit/YearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Generator/Report/Audit/YearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
| /** | ||||
|  * YearReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Audit; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Class YearReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Audit | ||||
|  */ | ||||
| class YearReportGenerator extends MonthReportGenerator | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * Doesn't do anything different. | ||||
|      */ | ||||
| } | ||||
							
								
								
									
										58
									
								
								app/Generator/Report/ReportGeneratorFactory.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/Generator/Report/ReportGeneratorFactory.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| <?php | ||||
| /** | ||||
|  * ReportGeneratorFactory.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
|  | ||||
| /** | ||||
|  * Class ReportGeneratorFactory | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report | ||||
|  */ | ||||
| class ReportGeneratorFactory | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @param string $type | ||||
|      * @param Carbon $start | ||||
|      * @param Carbon $end | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public static function reportGenerator(string $type, Carbon $start, Carbon $end): ReportGeneratorInterface | ||||
|     { | ||||
|         $period = 'Month'; | ||||
|         // more than one year date difference means multi year report. | ||||
|         if ($start->diffInMonths($end) > 12) { | ||||
|             $period = 'MultiYear'; | ||||
|         } | ||||
|         // more than two months date difference means year report. | ||||
|         if ($start->diffInMonths($end) > 1) { | ||||
|             $period = 'Year'; | ||||
|         } | ||||
|  | ||||
|         $class = sprintf('FireflyIII\Generator\Report\%s\%sReportGenerator', $type, $period); | ||||
|         if (class_exists($class)) { | ||||
|             /** @var ReportGeneratorInterface $obj */ | ||||
|             $obj = new $class; | ||||
|             $obj->setStartDate($start); | ||||
|             $obj->setEndDate($end); | ||||
|  | ||||
|             return $obj; | ||||
|         } | ||||
|         throw new FireflyException(sprintf('Class "%s" does not exist.', $class)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								app/Generator/Report/ReportGeneratorInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								app/Generator/Report/ReportGeneratorInterface.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| <?php | ||||
| /** | ||||
|  * ReportGeneratorInterface.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Interface ReportGeneratorInterface | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report | ||||
|  */ | ||||
| interface ReportGeneratorInterface | ||||
| { | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function generate(): string; | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $accounts | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setAccounts(Collection $accounts): ReportGeneratorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setEndDate(Carbon $date): ReportGeneratorInterface; | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setStartDate(Carbon $date): ReportGeneratorInterface; | ||||
|  | ||||
| } | ||||
							
								
								
									
										90
									
								
								app/Generator/Report/Standard/MonthReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								app/Generator/Report/Standard/MonthReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| <?php | ||||
| /** | ||||
|  * MonthReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Standard; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Generator\Report\ReportGeneratorInterface; | ||||
| use FireflyIII\Helpers\Report\ReportHelperInterface; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class MonthReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Standard | ||||
|  */ | ||||
| class MonthReportGenerator implements ReportGeneratorInterface | ||||
| { | ||||
|     /** @var  Collection */ | ||||
|     private $accounts; | ||||
|     /** @var  Carbon */ | ||||
|     private $end; | ||||
|     /** @var  Carbon */ | ||||
|     private $start; | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function generate(): string | ||||
|     { | ||||
|         $helper = app(ReportHelperInterface::class); | ||||
|         $bills  = $helper->getBillReport($this->start, $this->end, $this->accounts); | ||||
|  | ||||
|         // and some id's, joined: | ||||
|         $accountIds = join(',', $this->accounts->pluck('id')->toArray()); | ||||
|         $reportType = 'default'; | ||||
|  | ||||
|         // continue! | ||||
|         return view( | ||||
|             'reports.default.month', | ||||
|             compact('bills', 'accountIds', 'reportType') | ||||
|         )->with('start', $this->start)->with('end', $this->end)->render(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $accounts | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setAccounts(Collection $accounts): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->accounts = $accounts; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setEndDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->end = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setStartDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->start = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										87
									
								
								app/Generator/Report/Standard/MultiYearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								app/Generator/Report/Standard/MultiYearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| <?php | ||||
| /** | ||||
|  * MultiYearReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Standard; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Generator\Report\ReportGeneratorInterface; | ||||
| use FireflyIII\Helpers\Report\ReportHelperInterface; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class MonthReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Standard | ||||
|  */ | ||||
| class MultiYearReportGenerator implements ReportGeneratorInterface | ||||
| { | ||||
|     /** @var  Collection */ | ||||
|     private $accounts; | ||||
|     /** @var  Carbon */ | ||||
|     private $end; | ||||
|     /** @var  Carbon */ | ||||
|     private $start; | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function generate(): string | ||||
|     { | ||||
|         // and some id's, joined: | ||||
|         $accountIds = join(',', $this->accounts->pluck('id')->toArray()); | ||||
|         $reportType = 'default'; | ||||
|  | ||||
|         // continue! | ||||
|         return view( | ||||
|             'reports.default.multi-year', | ||||
|             compact('accountIds', 'reportType') | ||||
|         )->with('start', $this->start)->with('end', $this->end)->render(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $accounts | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setAccounts(Collection $accounts): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->accounts = $accounts; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setEndDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->end = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setStartDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->start = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										87
									
								
								app/Generator/Report/Standard/YearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								app/Generator/Report/Standard/YearReportGenerator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| <?php | ||||
| /** | ||||
|  * YearReportGenerator.php | ||||
|  * Copyright (C) 2016 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This software may be modified and distributed under the terms of the | ||||
|  * Creative Commons Attribution-ShareAlike 4.0 International License. | ||||
|  * | ||||
|  * See the LICENSE file for details. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types = 1); | ||||
|  | ||||
| namespace FireflyIII\Generator\Report\Standard; | ||||
|  | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Generator\Report\ReportGeneratorInterface; | ||||
| use FireflyIII\Helpers\Report\ReportHelperInterface; | ||||
| use Illuminate\Support\Collection; | ||||
|  | ||||
| /** | ||||
|  * Class MonthReportGenerator | ||||
|  * | ||||
|  * @package FireflyIII\Generator\Report\Standard | ||||
|  */ | ||||
| class YearReportGenerator implements ReportGeneratorInterface | ||||
| { | ||||
|     /** @var  Collection */ | ||||
|     private $accounts; | ||||
|     /** @var  Carbon */ | ||||
|     private $end; | ||||
|     /** @var  Carbon */ | ||||
|     private $start; | ||||
|  | ||||
|     /** | ||||
|      * @return string | ||||
|      */ | ||||
|     public function generate(): string | ||||
|     { | ||||
|         // and some id's, joined: | ||||
|         $accountIds = join(',', $this->accounts->pluck('id')->toArray()); | ||||
|         $reportType = 'default'; | ||||
|  | ||||
|         // continue! | ||||
|         return view( | ||||
|             'reports.default.year', | ||||
|             compact('accountIds', 'reportType') | ||||
|         )->with('start', $this->start)->with('end', $this->end)->render(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Collection $accounts | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setAccounts(Collection $accounts): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->accounts = $accounts; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setEndDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->end = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Carbon $date | ||||
|      * | ||||
|      * @return ReportGeneratorInterface | ||||
|      */ | ||||
|     public function setStartDate(Carbon $date): ReportGeneratorInterface | ||||
|     { | ||||
|         $this->start = $date; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user