支票付款

时间:2019-10-02 23:44:01

标签: laravel laravel-5

对于每笔付款,学生都可以接受培训。

例如,我为学生 // Download file $file = "http://url.com/file.pdf"; $ch = curl_init($file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); $file_content = curl_exec($ch); curl_close($ch); // Add to zip $zip->addFromString($fname, $file_content); 的付款进行了编码。

enter image description here

然后,我对学生Menier的培训进行编码。

enter image description here

是正确的!

现在,当我为同一个学生Menier编码另一笔付款时

enter image description here

我无法添加培训,它正在阻止???

enter image description here

在学生每次付款后如何将支票归零?

Menier

谢谢您的帮助。

控制器培训

$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');
        }

1 个答案:

答案 0 :(得分:1)

我不知道这个控制器是什么,或者是什么在给它供电。但是,看来代码正在正确地执行与编写的代码相反的工作。看来是在阻止学生向已付款的培训添加付款。

此行:

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

查看学生接受的所有培训,然后检查从表格传递的培训ID是否与他要付费的培训ID相同。如果匹配,则阻止他付款。这似乎可行(尽管我不确定是否需要对$conflitpayment进行第一个查询,或者它是否正确-但这不是这里的问题)。我不明白的是,为什么在创建新培训的同一部分中要支票付款。检查多次付款的方法可能应该是创建付款方式,而不是培训-因为您要阻止多次付款,而不一定是培训。

我怀疑可能正在发生的事情是,添加新培训的表单正在通过 payment 表单运行。或者付款和培训表单正在通过控制器中的相同方法。即,您在表单上有一个fk_training字段,并且该字段带有值。如果要创建新培训,则该方法中不应包含fk_training字段。将付款if-checks的逻辑与创建新付款的逻辑分离为不同的方法,这应该可以解决您的问题。

如果此字段是通过表格填写的,并且是现有的培训,即使是在付款方式上,也会阻止创建新培训

编辑

您在注释中指出“为2项培训支付1项费用。在这2项培训之后,我再次支付。”这与代码所做的非常不同。该代码先前检查了学生是否为特殊培训付费,如果是,则停止付款。您的评论背后的逻辑现在非常不同。并使代码更加复杂。

要使其正常工作,您需要回答一些问题。首先,他们需要支付两次不同的培训费用吗?如果是这样,我们是否仍要阻止他们支付两次相同的培训费用?我认为是,这意味着$hasPaidForThisTraining检查是正确的。

但是,如果,并且他们可以支付两次具有相同ID的培训费用,那么我们必须更改if-check来计数他有多少次支付相同的查询。现在,如果他们一次付款,它将失败。

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

或者您可能想检查他们是否已经支付了两次培训费用并且已经到期? IE浏览器,他们现在需要再次付款?如果您直接在学生的培训中附加了付款,并且您只能为一项培训付费,这并不太难:

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

您可以针对需要核实他们是否已付款的每次培训进行此操作。但是,这变得很复杂-如果您说他们可以为任何两次培训付费,然后如果他们接受了这些培训,则他们需要再次付费。您需要先缩小逻辑范围,然后才能进行编码。允许“使用”付款的参数是什么?是根据日期吗?如果是这样,如果学生不参加该课程怎么办?您如何在代码中说明这一点?或者,如果他们花了一个钱又想买另外两个呢?他们可以这样做吗?如果可以,那么确定要支付第二笔款项的决心是什么?

我无法在代码中表示这一点,因为我无法理解所有规则,为了将其限制在代码中,您需要了解这些规则。我建议您简化这种方式。让您的问题中的上述方法仅做一件事或两件事-也许检查一下是否已为所涉课程付款。然后再检查一下他们是否还有“信用”。

我认为您永远不会使用这种方法来创建培训。如果存在fk_training的外键(必须在此函数中,否则查询将失败),则已经存在可能无法通过if-check的培训。因此,它将永远不会像当前编码那样创建新的编码。建议您重新考虑本节的工作原理,并从新培训的 creation 中分离出付款支票。他们是否为此培训付费?是的,如果可以,他们是否有资格参加下一次培训?如果不是这样,请在他们有机会进行培训之前,在表格上标记他们不可用。首先获得付款是一项单独的操作-然后在他们获得信用后再开始创建新的培训。

这甚至很难解释-我认为如果简化一下,您的生活就会轻松很多。以前,您可以按培训核对付款-一对一,并且根据这些规则可以正常工作。如果要允许两次付款,您要么需要制定复杂的规则...,要么只是将付款记为学生帐户的贷项,然后他们就可以根据系统中的贷项来选择课程。如果您的实际使用情况可以解决此问题,则简单得多。