mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Lots of new code for recurring transactions. #1469
This commit is contained in:
		| @@ -26,7 +26,9 @@ namespace FireflyIII\Http\Controllers\Recurring; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Http\Requests\RecurrenceFormRequest; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use Illuminate\Http\Request; | ||||
|  | ||||
| @@ -38,6 +40,8 @@ class CreateController extends Controller | ||||
| { | ||||
|     /** @var BudgetRepositoryInterface */ | ||||
|     private $budgets; | ||||
|     /** @var PiggyBankRepositoryInterface */ | ||||
|     private $piggyBanks; | ||||
|     /** @var RecurringRepositoryInterface */ | ||||
|     private $recurring; | ||||
|  | ||||
| @@ -55,8 +59,9 @@ class CreateController extends Controller | ||||
|                 app('view')->share('title', trans('firefly.recurrences')); | ||||
|                 app('view')->share('subTitle', trans('firefly.create_new_recurrence')); | ||||
|  | ||||
|                 $this->recurring = app(RecurringRepositoryInterface::class); | ||||
|                 $this->budgets   = app(BudgetRepositoryInterface::class); | ||||
|                 $this->recurring  = app(RecurringRepositoryInterface::class); | ||||
|                 $this->budgets    = app(BudgetRepositoryInterface::class); | ||||
|                 $this->piggyBanks = app(PiggyBankRepositoryInterface::class); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
| @@ -64,6 +69,8 @@ class CreateController extends Controller | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View | ||||
|      */ | ||||
|     public function create(Request $request) | ||||
| @@ -71,6 +78,8 @@ class CreateController extends Controller | ||||
|         // todo refactor to expandedform method. | ||||
|         $budgets         = app('expandedform')->makeSelectListWithEmpty($this->budgets->getActiveBudgets()); | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrency(); | ||||
|         $piggyBanks      = $this->piggyBanks->getPiggyBanksWithAmount(); | ||||
|         $piggies        = app('expandedform')->makeSelectListWithEmpty($piggyBanks); | ||||
|         $tomorrow        = new Carbon; | ||||
|         $tomorrow->addDay(); | ||||
|  | ||||
| @@ -90,7 +99,18 @@ class CreateController extends Controller | ||||
|         ]; | ||||
|         $request->session()->flash('preFilled', $preFilled); | ||||
|  | ||||
|         return view('recurring.create', compact('tomorrow', 'preFilled','typesOfRepetitions', 'defaultCurrency', 'budgets')); | ||||
|         return view('recurring.create', compact('tomorrow', 'preFilled', 'piggies', 'typesOfRepetitions', 'defaultCurrency', 'budgets')); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param RecurrenceFormRequest $request | ||||
|      */ | ||||
|     public function store(RecurrenceFormRequest $request) | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $this->recurring->store($data); | ||||
|         var_dump($data); | ||||
|         exit; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -76,9 +76,20 @@ class IndexController extends Controller | ||||
|         $return           = []; | ||||
|         $start            = Carbon::createFromFormat('Y-m-d', $request->get('start')); | ||||
|         $end              = Carbon::createFromFormat('Y-m-d', $request->get('end')); | ||||
|         $firstDate        = Carbon::createFromFormat('Y-m-d', $request->get('first_date')); | ||||
|         $endDate          = '' !== (string)$request->get('end_date') ? Carbon::createFromFormat('Y-m-d', $request->get('end_date')) : null; | ||||
|         $endsAt           = (string)$request->get('ends'); | ||||
|         $repetitionType   = explode(',', $request->get('type'))[0]; | ||||
|         $repetitions      = (int)$request->get('reps'); | ||||
|         $repetitionMoment = ''; | ||||
|         $start->startOfDay(); | ||||
|  | ||||
|         // if $firstDate is beyond $end, simply return an empty array. | ||||
|         if ($firstDate->gt($end)) { | ||||
|             return Response::json([]); | ||||
|         } | ||||
|         // if $firstDate is beyond start, use that one: | ||||
|         $actualStart = clone $firstDate; | ||||
|  | ||||
|         switch ($repetitionType) { | ||||
|             default: | ||||
| @@ -90,32 +101,51 @@ class IndexController extends Controller | ||||
|                 $repetitionMoment = explode(',', $request->get('type'))[1] ?? '1'; | ||||
|                 break; | ||||
|             case 'ndom': | ||||
|                 $repetitionMoment = explode(',', $request->get('type'))[1] ?? '1,1'; | ||||
|                 $repetitionMoment = str_ireplace('ndom,', '', $request->get('type')); | ||||
|                 break; | ||||
|             case 'yearly': | ||||
|                 $repetitionMoment = explode(',', $request->get('type'))[1] ?? '2018-01-01'; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         $repetition                    = new RecurrenceRepetition; | ||||
|         $repetition->repetition_type   = $repetitionType; | ||||
|         $repetition->repetition_moment = $repetitionMoment; | ||||
|         $repetition->repetition_skip   = (int)$request->get('skip'); | ||||
|  | ||||
|         var_dump($repository->getXOccurrences($repetition, $start, 5)); | ||||
|         exit; | ||||
|  | ||||
|  | ||||
|         // calculate events in range, depending on type: | ||||
|         $actualEnd = clone $end; | ||||
|         switch ($endsAt) { | ||||
|             default: | ||||
|                 throw new FireflyException(sprintf('Cannot generate events for "%s"', $endsAt)); | ||||
|                 throw new FireflyException(sprintf('Cannot generate events for type that ends at "%s".', $endsAt)); | ||||
|             case 'forever': | ||||
|                 // simply generate up until $end. No change from default behavior. | ||||
|                 $occurrences = $repository->getOccurrencesInRange($repetition, $actualStart, $actualEnd); | ||||
|                 break; | ||||
|             case 'until_date': | ||||
|                 $actualEnd   = $endDate ?? clone $end; | ||||
|                 $occurrences = $repository->getOccurrencesInRange($repetition, $actualStart, $actualEnd); | ||||
|                 break; | ||||
|             case 'times': | ||||
|                 $occurrences = $repository->getXOccurrences($repetition, $actualStart, $repetitions); | ||||
|                 break; | ||||
|  | ||||
|         } | ||||
|  | ||||
|  | ||||
|         /** @var Carbon $current */ | ||||
|         foreach ($occurrences as $current) { | ||||
|             if ($current->gte($start)) { | ||||
|                 $event    = [ | ||||
|                     'id'        => $repetitionType . $firstDate->format('Ymd'), | ||||
|                     'title'     => 'X', | ||||
|                     'allDay'    => true, | ||||
|                     'start'     => $current->format('Y-m-d'), | ||||
|                     'end'       => $current->format('Y-m-d'), | ||||
|                     'editable'  => false, | ||||
|                     'rendering' => 'background', | ||||
|                 ]; | ||||
|                 $return[] = $event; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return Response::json($return); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -37,6 +37,7 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Illuminate\Http\RedirectResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Log; | ||||
| use Preferences; | ||||
| @@ -218,7 +219,7 @@ class SingleController extends Controller | ||||
|      * | ||||
|      * @internal param JournalRepositoryInterface $repository | ||||
|      */ | ||||
|     public function destroy(TransactionJournal $transactionJournal) | ||||
|     public function destroy(TransactionJournal $transactionJournal): RedirectResponse | ||||
|     { | ||||
|         // @codeCoverageIgnoreStart | ||||
|         if ($this->isOpeningBalance($transactionJournal)) { | ||||
| @@ -329,9 +330,10 @@ class SingleController extends Controller | ||||
|      * @param JournalFormRequest         $request | ||||
|      * @param JournalRepositoryInterface $repository | ||||
|      * | ||||
|      * @return \Illuminate\Http\RedirectResponse | ||||
|      * @return RedirectResponse | ||||
|      * @throws \FireflyIII\Exceptions\FireflyException | ||||
|      */ | ||||
|     public function store(JournalFormRequest $request, JournalRepositoryInterface $repository) | ||||
|     public function store(JournalFormRequest $request, JournalRepositoryInterface $repository): RedirectResponse | ||||
|     { | ||||
|         $doSplit       = 1 === (int)$request->get('split_journal'); | ||||
|         $createAnother = 1 === (int)$request->get('create_another'); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user