Добавить платеж после истечения месячного графика

#php #mysql #laravel #phpmyadmin #laravel-5.2

#php #mysql #laravel #phpmyadmin #laravel-5

Вопрос:

У меня есть две модели, Payment и GroupStarts.

Платеж содержит следующие поля:

идентификатор студента, сумма к оплате, оплата студента, дата оплаты, дата получения, имя_группы

В GroupStarts есть:

имя_группы, group_start, group_end, group_status.

Вот как это должно работать:

Если платеж произведен за один месяц и срок его действия истекает после месяца 1, к нему следует добавить amount_to_pay за месяц 1, и если во 2-м месяце студент ничего не заплатил, мы добавляем сумму к оплате, аналогично: если студент должен заплатить 10 долларов и заплатил, так что долг равен 0, но в следующем месяце он не заплатил, поэтому мы добавляем его к платежу 10 долларов, если в 3-м месяце он не заплатил, мы добавляем еще 10 долларов к этой сумме.

Как я могу это сделать?

Это код, который я пробовал:

 private function getMonthlyUnpayments()
{

  $payments     = Payment::all();
  $unpayment    = 0;
  $totalPayment = 0;

        foreach ($payments as $key => $value) {
            $unpayment     = $value->amount_to_pay;
            $totalPayment  = $value->student_paid;          
        }    

        $studentsAllU     = Student::where('is_canceled', '=', 0)->get();
        $groupAllU        = Gstart::where('group_status', '=', 0)->get();
        $studentGroupAllU = [];
        foreach ($studentsAllU as $key => $value) {

            foreach ($groupAllU as $keys => $valu) {
              foreach ($value->payment as $paymentID) {
                 if ($value->group_id == $valu->group_name) {
                         $studentGroupAllU[] = ['name' => $value->full_name,  'student_id' => $value->id, 'gr_id' => $value->group_id, 'paid' => $paymentID->student_paid, 'to_pay' =>  $paymentID->amount_to_pay, 'due_date' => $paymentID->due_date, 'group_ends' => $valu->group_end];
                      }  
              }                       
                }            
        }
function nb_mois($from, $to)
{
     $fromYear = date("Y", strtotime($from));
        $fromMonth = date("m", strtotime($from));
        $toYear = date("Y", strtotime($to));
        $toMonth = date("m", strtotime($to));
        if ($fromYear == $toYear) {
            return ($toMonth-$fromMonth) 1;
        } else {
            return (12-$fromMonth) 1 $toMonth;
        }
}

function createDateRangeArray($strDateFrom,$strDateTo)
{
    $aryRange=array();

    $iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),     substr($strDateFrom,8,2),substr($strDateFrom,0,4));
    $iDateTo=mktime(1,0,0,substr($strDateTo,5,2),     substr($strDateTo,8,2),substr($strDateTo,0,4));

    if ($iDateTo>=$iDateFrom)
    {
        array_push($aryRange,date('Y-m-d',$iDateFrom));
        while ($iDateFrom<$iDateTo)
        {
            $iDateFrom =86400; 
            array_push($aryRange,date('Y-m-d',$iDateFrom));
        }
    }
    return $aryRange;
}
        $dtArr = [];
        $incrementer = 0;
            $inc = 0;

        foreach ($studentGroupAllU as $key => $value) {

                if ($value['group_ends'] >= $value['due_date']  || $value['paid'] < $value['to_pay']) {
                  if ($value['paid'] < $value['to_pay']) {
                    $incrementer  = ($value['to_pay'] - $value['paid']);
                  }
                  else {
                     $incrementer  = ($value['to_pay']);
                  }

                      $dtArr[] = ['days_left' => count(createDateRangeArray($value['due_date'], $value['group_ends'])), 'group_id_d' => $value['gr_id'], 'paid' => $value['paid'], 'to_pay' => $value['to_pay'], 'student_id' => $value['student_id'], 'owe' => ($inc  =($value['to_pay'] - $value['paid'])), 'dates' =>  createDateRangeArray($value['due_date'], $value['group_ends']),'dates_fron_last_payment' =>  createDateRangeArray($value['due_date'], Carbon::now()->format('Y-m-d')), 'days_fron_last_payments' => count(createDateRangeArray($value['due_date'], Carbon::now()->format('Y-m-d')))];

                }
                    $inc = 0;
        }

function uniqueAssocArray($array, $uniqueKey) {
      $arr = array();

      foreach($array as $key => $item)
      {
         $arr[$item[$uniqueKey]][$key] = $item;

      }

      ksort($arr, SORT_NUMERIC);
      return $arr;
}
$dd = uniqueAssocArray($dtArr, 'group_id_d');
$tpStudentGr = 0;
        // dd($dtArr);
      foreach ($dtArr as $key => $value) {
           foreach ($value['dates'] as $k => $val) {

            if ($val == Carbon::createFromFormat('Y-m-d', $val)->startOfMonth()->format('Y-m-d') amp;amp; $val <= Carbon::now()->startOfMonth()->format('Y-m-d')) {

         if ($value['paid'] <  $value['to_pay']){

                      $tpStudentGr  = ($value['to_pay'] - $value['paid']   $value['to_pay']);                  

                }
            if ($value['paid'] ==  $value['to_pay']){
                          $tpStudentGr  = $value['to_pay'];
                }    
            }    
          }
          if ($value['days_left'] > 0) {

          }        
      }     
           $tpStudentGr = $unpayment - $totalPayment;
           return $tpStudentGr;    
}
  

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

1. В чем именно проблема, с которой вы столкнулись в написанном вами коде.

2. Вы спрашиваете: «как я могу это сделать?» SO — это не место, где можно просить людей написать код для вас, это место, где можно получить помощь с проблемами, возникающими при написании кода. Для этого предоставьте нам ошибки, которые встречаются в вашем текущем коде, и мы объясним вам, почему вы получаете эти ошибки.

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