Laravel: разделить на ежемесячные платежи

#laravel

#laravel

Вопрос:

В функции хранения контроллера у меня есть этот код:

 public function store(RegisterAccountsRequest $request){
        if($request->installment > 1){
            foreach(range(1, $request->installment) as $installment) {
                $data = new Financial;
                $data->type = $request->type[0];
                $data->payment = $request->payment[0];
                $data->description = $request->description;
                $data->status = $request->status;
                $data->name = $request->name . " ( {$installment} / {$request->installment} )";
                $data->value = ( $request->value / $request->installment );
                if ($request->amount_paid == '0.00') {
                    $data->effective = 0;
                } else {
                    $data->effective = 1;
                }
                $data->installment = $installment;
                $data->due_date = $request->due_date;

                $data->save();

                $cf = new ClientFinancial;
                $cf->client_id = Auth::user()->id;
                $cf->financial_id = Financial::orderBy('id', 'desc')->first()->id;
                $cf->save();
            }
        } else {
                $data = new Financial;
                $data->type = $request->type[0];
                $data->payment = $request->payment[0];
                $data->description = $request->description;
                $data->status = $request->status;
                $data->name = $request->name;
                $data->value = $request->value;
                if ($request->amount_paid == '0.00') {
                    $data->effective = 0;
                } else {
                    $data->effective = 1;
                }
                $data->installment = 1;
                $data->due_date = $request->due_date;
                $data->save();

                $cf = new ClientFinancial;
                $cf->client_id = Auth::user()->id;
                $cf->financial_id = Financial::orderBy('id', 'desc')->first()->id;
                $cf->save();
        }

        return redirect()->route('admin.financials.index')
            ->with('success', "Conta cadastrada com sucesso!", $data);
    }
  

Когда $request->installment значение больше 1, затем выполняется первая часть кода e, он должен выполнить некоторые вычисления, которые я не понимаю, как хранить каждый взнос за каждый месяц, например:

 due_date
________

30/10/2020
30/11/2020
30/12/2020

etc.
  

Надеюсь, я достаточно ясно выразился.
Помогите, пожалуйста!

Комментарии:

1. Чтобы убедиться, что я вас правильно понял: вы хотите, чтобы у каждого взноса был срок оплаты с шагом в 1 месяц (где взнос> 1)? Вы хотите, чтобы это приращение начиналось с $request->due_date ?

2. Да, именно так!

Ответ №1:

Я думаю, вам нужно что-то вроде этого:

 public function store(RegisterAccountsRequest $request){
    if($request->installment > 1){
        $dueDate = Carbon::createFromFormat('d/m/Y', $request->due_date);
        foreach(range(1, $request->installment) as $installment) {
            $data = new Financial;
            $data->type = $request->type[0];
            $data->payment = $request->payment[0];
            $data->description = $request->description;
            $data->status = $request->status;
            $data->name = $request->name . " ( {$installment} / {$request->installment} )";
            $data->value = ( $request->value / $request->installment );
            if ($request->amount_paid == '0.00') {
                $data->effective = 0;
            } else {
                $data->effective = 1;
            }
            $data->installment = $installment;
            $data->due_date = $dueDate->format('d/m/Y');
            $dueDate->addMonth();
            $data->save();

            $cf = new ClientFinancial;
            $cf->client_id = Auth::user()->id;
            $cf->financial_id = Financial::orderBy('id', 'desc')->first()->id;
            $cf->save();
        }
    } else {
        $data = new Financial;
        $data->type = $request->type[0];
        $data->payment = $request->payment[0];
        $data->description = $request->description;
        $data->status = $request->status;
        $data->name = $request->name;
        $data->value = $request->value;
        if ($request->amount_paid == '0.00') {
            $data->effective = 0;
        } else {
            $data->effective = 1;
        }
        $data->installment = 1;
        $data->due_date = $request->due_date;
        $data->save();

        $cf = new ClientFinancial;
        $cf->client_id = Auth::user()->id;
        $cf->financial_id = Financial::orderBy('id', 'desc')->first()->id;
        $cf->save();
    }

    return redirect()->route('admin.financials.index')
        ->with('success', "Conta cadastrada com sucesso!", $data);
}
  

В этом случае я создаю экземпляр Carbon (carbon docs) с датой due_date .
После использования значения, подобного so $data->due_date = $dueDate->format('d/m/Y'); , а затем добавления одного месяца, подобного so $dueDate->addMonth(); , у меня есть новый месяц, доступный для каждой итерации.

Комментарии:

1. Спасибо @Rob Biermann. Это работает как ветер, и это не так сложно, как я думал!