Проверка оплаты - PullRequest
       3

Проверка оплаты

0 голосов
/ 03 октября 2019

За каждый платеж студент может пройти обучение.

Например, я кодирую платеж для студента Menier.

enter image description here

Затем я кодирую тренинг для студентаMenier.

enter image description here

Это правильно!

Теперь, когда я кодирую другой платеж для того же студента Menier

enter image description here

Я не могу добавить тренинг, этоблокировка ???

enter image description here

Как обнулить чек после каждого платежа студента?

$conflitpayment = Payment::where('fk_student', $request->get('fk_student'))
        ->whereDate('date_payment', ">" , $date_seance)
        ->first();

        if(isset($conflitpayment)){
            return redirect()->route('trainings.index')
                ->with('error', 'Payment! ');
        }

        $thisStudentsTrainings = Training::with(['payments' => function($query) use($fk_student){
        $query->where('fk_student', $fk_student);
        }])->get();

        $hasPaidForThisTraining = $thisStudentsTrainings ->contains('id', $request->get('fk_training'));



        if( count($thisStudentsTrainings) >= 1) { 
            return redirect()->route('trainings.index')
            ->with('error', 'No payment ! ');
        }



        else{
            Training::create($request->all());
                return redirect()->route('trainings.index')
                    ->with('success', 'Add');
        }

Спасибо за вашу помощь.

Контроллер Обучение

public function store(Request $request)
    {
        $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_motorbike' => 'required',
                'fk_former' => 'required',
                'fk_student' => 'required',
                'fk_typeseance' => 'required'


        ]);


       $date_seance = $request->get('date_seance'); 
       $hour_start = $request->get('hour_start'); 
       $hour_end = $request->get('hour_end'); 
       $fk_motorbike = $request->get('fk_motorbike');
       $fk_student = $request->get('fk_student');
       $fk_former = $request->get('fk_former');
       $fk_typeseance = $request->get('fk_typeseance');

       $paiements = Payment::where('fk_student', $request->get('fk_student'))->first();

        if(!isset($paiements)){ 
            return redirect()->route('trainings.index')
                    ->with('error', 'No payment, no training!');
        }


        $conflitpayment = Payment::where('fk_student', $request->get('fk_student'))
        ->whereDate('date_payment', ">" , $date_seance)
        ->first();

        if(isset($conflitpayment)){
            return redirect()->route('trainings.index')
                ->with('error', 'Payment! ');
        }


        $PaymentHasBeenMadeForThisTraining = Payment::where('fk_student', $fk_student)  
        ->where('fk_training', $request->get('fk_training')) 
        ->first(); 

        $thisStudentsTrainings = Training::with(['payments' => function($query) use($fk_student){
        $query->where('fk_student', $fk_student);
        }])->get();

        $hasPaidForThisTraining = $thisStudentsTrainings->contains('id', $request->get('fk_training'));



        if( count($thisStudentsTrainings) >= 1) { 
            return redirect()->route('trainings.index')
            ->with('error', 'No payment ! ');
        }



        else{
            Training::create($request->all());
                return redirect()->route('trainings.index')
                    ->with('success', 'Add');
        }



    }

1 Ответ

1 голос
/ 04 октября 2019

Я не знаю, что это за контроллер, и что его кормит. Но, похоже, что код работает правильно против того, для чего он написан. Похоже, что ученик блокирует добавление оплаты к обучению, за которое он уже заплатил.

Эта строка:

$hasPaidForThisTraining = $thisStudentsTrainings ->contains('id', $request->get('fk_training'));

Просматривает все тренинги, которые проводит студент, а затемпроверяет, является ли идентификатор обучения, переданный из формы, тем же, за который он пытается заплатить. Если это совпадение, то заблокируйте его от оплаты. Кажется, это работает (хотя я не уверен, что нужен самый первый запрос для $conflitpayment или если он правильный - но это не проблема здесь). Чего я не понимаю, так это почему чеки на оплату производятся в том же разделе, что и создание нового тренинга. Проверки для нескольких платежей, вероятно, должны проводиться методом создание платежа , а не обучением - поскольку вы пытаетесь заблокировать несколько платежей, а не обязательно обучение.

Я подозреваю, чточто эта форма для добавления нового обучения проходит через форму payment . ИЛИ формы оплаты и обучения проходят через тот же метод в вашем контроллере. То есть у вас есть поле fk_training в форме, и оно входит в этот метод со значением. Если вы создаете новое обучение, у вас не должно быть поля fk_training в этом методе. Отделите логику if-проверок для платежей от логики создания нового платежа на разные методы, и это должно решить вашу проблему.

Если это поле проходит через форму, и это уже существующее обучение,даже при способе оплаты это заблокирует создание нового тренинга .

РЕДАКТИРОВАТЬ

Вы отмечаете в комментариях «1 оплата за 2 тренинга. После 2 тренингов я снова плачу». Это очень отличается от того, что делает код. Код ранее проверял, заплатил ли студент за это конкретное обучение, и если это так, остановите оплату. Логика вашего комментария теперь совсем другая. И делает код более сложным.

Есть несколько вопросов, на которые нужно ответить, чтобы это работало. Во-первых, они платят за два разных тренинга? Если да, то хотим ли мы по-прежнему запретить им платить за одно и то же обучение дважды? Я предполагаю, что да, что означает, что проверка $hasPaidForThisTraining правильная.

Но, если не , и они могут оплатить два тренинга с одним и тем же идентификатором, то мы должны изменить проверку if, чтобы подсчитать, сколько раз онзаплатил за тот же запрос. Прямо сейчас, это потерпит неудачу, если они заплатили ОДИН РАЗ.

if( count($thisStudentsTrainings) >= 1) { }  // CHANGE TO >=2

Или вы, возможно, захотите проверить, заплатили ли они за два тренинга, и срок их действия истек? То есть им теперь нужно снова платить? Это не так уж сложно, если у вас есть оплата, прикрепленная непосредственно к обучению студента, и вы можете оплатить только одно обучение:

  $PaymentHasBeenMadeForThisTraining = Payment::where('fk_student', $fk_student)  
    ->where('fk_training', $request->get('fk_training')) 
    ->first(); 

Вы можете сделать это для каждого тренинга, который вам нужно проверить, оплатили ли они,Однако, когда это становится сложным - если вы говорите, что они могут заплатить за любые два тренинга, а затем, если они прошли эти тренинги, то им нужно платить снова. Вам нужно будет сжать логику, прежде чем вы сможете ее кодировать. Какие параметры позволяют использовать платеж? Это основано на дате? Если так, то что, если студент не взял курс? Как вы учитываете это в коде? Или, что, если они заплатили за одного и хотят купить два других? Могут ли они это сделать, и если да, то каково определение того, что второй платеж сделан против?

Я не могу представить это в коде, потому что не могу понять все правила, которые вам нужнызнать, чтобы ограничить его в коде. Я предлагаю вам упростить этот путь вниз. Позвольте приведенному выше методу в вашем вопросе просто сделать one или две вещи - возможно, проверьте, была ли произведена оплата за рассматриваемый курс. Затем еще раз проверьте, не осталось ли у них «кредита».

Не думаю, что вам когда-нибудь удастся создать тренировку по этому методу. Если есть внешний ключ для fk_training (который ДОЛЖЕН быть в этой функции, или запросы не пройдут), УЖЕ есть тренировка, которая может или не может выполнить проверки if. Таким образом, он никогда не создаст новый, как он сейчас закодирован. Я предлагаю вам еще раз подумать, как работает этот раздел, и отделить платежные чеки от создания нового тренинга. IE они заплатили за это обучение? Хорошо, если так, у них есть кредит, оставленный для СЛЕДУЮЩЕГО обучения? Если нет, отметьте, что они не указаны в форме , прежде чем им будет предоставлена ​​возможность создать тренинг. Получите оплату сначала как отдельное действие - затем, когда у них есть кредит, затем разрешите создание нового тренинга.

Это трудно даже объяснить - я думаю, что вы упростите свою жизнь, если упроститеэто вниз. Ранее вы были в порядке, чтобы проверить оплату против обучения - один на один, и это работало нормально на основе этих правил. Если вы хотите разрешить 2 платежа, вам либо нужно придумать сложные правила ... ИЛИ просто позвольте платежу быть зачисленным на счет студента, и они могут пройти курс, основанный на наличии кредита в системе. Намного проще, если ваше реальное использование может справиться с этим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...