/**
  * Show the form for creating a new resource.
  *
  * @return \Illuminate\Http\Response
  */
 public function create()
 {
     $data['title'] = 'Fee Schedule';
     $data['fee_schedules_menu'] = 1;
     //create array to hole school session starting 10 yrs from current date
     $sessions = ['Select Session'];
     for ($i = intval(date('Y')) - 10; $i < intval(date('Y')) + 15; $i++) {
         $session = $i . '-' . ($i + 1);
         $sessions[$session] = $session;
     }
     $data['sessions'] = $sessions;
     $data['terms'] = ['Select Term', 1, 2, 3];
     $data['classes'] = studentClass::lists('name', 'id')->prepend('Select Class');
     $data['fee_elements'] = FeeElement::where('status_id', 1)->get();
     return view('billing.fee_schedules.create', $data);
 }
 /**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
     // DB::table('classes')->truncate();
     $faker = Faker\Factory::create();
     studentClass::create(['name' => 'SSS 3A', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 3B', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 3C', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 2A', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 2B', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 2C', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 1A', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 1B', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'SSS 1C', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'JSS 3A', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'JSS 3B', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
     studentClass::create(['name' => 'JSS 3C', 'staff_id' => $faker->numberBetween($min = 2, $max = 10), 'max_students' => 30]);
 }
 public function promote($class_id)
 {
     $table = 'class_positions_' . \Session::get('current_session') . '_' . \Session::get('current_term');
     $promotion_class_id = studentClass::where('id', $class_id)->first()->promotion_class_id;
     $pass_avg = 50.0;
     $students = Student::where('class_id', $class_id)->get();
     foreach ($students as $student) {
         $student_avg = \DB::table($table)->where(['student_id' => $student->id, 'class_id' => $class_id])->first()->average;
         if ($student_avg >= $pass_avg) {
             $std = new Student();
             $std->class_id = $promotion_class_id;
             $std->save();
         }
     }
 }
 public function pay_invoice(Request $request)
 {
     // dd($request->all());
     $data['title'] = 'Pay School Fees';
     $data['fees'] = 1;
     $class_id = $request->class_id;
     $student_id = $request->student_id;
     $fee_schedule_code = strval($class_id) . session()->get('current_session') . strval(session()->get('current_term'));
     $session = session()->get('current_session');
     $term = session()->get('current_term');
     $data['transaction_modes'] = TransactionMode::lists('transaction_mode', 'id')->prepend('Please Select');
     //current session invoice table
     $table = 'invoices_' . $session . '_' . $term;
     $data['student_fee_elements'] = [];
     //==============get previous sessions fees not yet paid+++++++++++++
     $sessions = CurrentTerm::orderBy('created_at', 'desc')->where('session', '!=', session()->get('current_session'))->orWhere('term', '!=', session()->get('current_term'))->take(9)->groupby('session')->get();
     // dd($sessions);
     $outstandings = [];
     $invoices_amt = 0;
     $payment_amt = 0;
     // foreach ($sessions as $session) {
     $invoices = Invoice::where('session', '!=', session()->get('current_session'))->orWhere('term', '!=', session()->get('current_term'))->get();
     // dd($invoices);
     //get all payments associated with an invoice
     foreach ($invoices as $invoice) {
         $payment_amt = 0;
         $student_invoice = DB::table($invoice->table_name)->where(['student_id' => $student_id])->first();
         //for every invoice, get payment associated with that invoice
         if ($student_invoice !== null) {
             $sch_fee_payment = SchoolFeesPayment::where(['session' => $invoice->session, 'term' => $invoice->term])->first();
             $paid_amt = DB::table($sch_fee_payment->table_name)->where(['student_id' => $student_id])->sum('amount');
             //get class id from fee schedule code
             $outstanding_class_id = substr($student_invoice->fee_schedule_code, 0, 1);
             //get oustanding amount
             $outstanding_balance = $student_invoice->total - $paid_amt;
             //if outstanding amt is not greater than zero then student has paid fully for that invoice therefore dont show on page
             if ($outstanding_balance > 0) {
                 $session_fees = ['session' => $invoice->session, 'term' => $invoice->term, 'outstanding_balance' => $outstanding_balance, 'sch_fee_payment_table_name' => $sch_fee_payment->table_name, 'outstanding_fee_schedule_code' => $student_invoice->fee_schedule_code, 'outstanding_class_id' => $outstanding_class_id];
                 array_push($outstandings, $session_fees);
             }
         }
     }
     // }
     if ($outstandings == []) {
         $outstandings = null;
     }
     $data['outstandings'] = $outstandings;
     //===========GET THIS SESSIONS FEES++++++++++++++++++
     //get fee schedule elements for current session
     $fee_sch_table = 'fee_sch_' . session()->get('current_session') . '_' . session()->get('current_term');
     //get student invoice including exmepted fee elements
     $data['student_invoice'] = \DB::table($table)->where(['student_id' => $student_id, 'fee_schedule_code' => $fee_schedule_code])->first();
     // dd($data['student_invoice'] );
     //
     //check if invoice has been generated for this student
     if ($data['student_invoice'] !== null) {
         $already_paid = [];
         $paid_amount = 0;
         $data['exempted_elements'] = json_decode($data['student_invoice']->exempted_fee_elements);
         if ($data['exempted_elements'] == null) {
             $data['exempted_elements'] = [];
         }
         $sch_fee_payment = SchoolFeesPayment::where(['session' => session()->get('current_session'), 'term' => session()->get('current_term')])->first();
         $payment_histories = DB::table($sch_fee_payment->table_name)->where(['student_id' => $student_id])->get();
         // dd($payment_histories);
         foreach ($payment_histories as $payment_history) {
             $already_paid[] = json_decode($payment_history->elements_paid_for);
             $paid_amount += $payment_history->amount;
         }
         $already_paid = array_flatten($already_paid);
         // dd($already_paid);
         if ($already_paid !== null) {
             $data['already_paid'] = $already_paid;
         } else {
             $data['already_paid'] = [];
         }
         //get oustanding amount
         $outstanding_balance = $data['student_invoice']->total - $paid_amount;
         if ($outstanding_balance > 0) {
             $data['student_fee_elements'] = DB::table($fee_sch_table)->where(['fee_schedule_code' => $fee_schedule_code])->join('fee_elements', 'fee_elements.id', '=', $fee_sch_table . '.fee_element_id')->get();
         }
     } else {
         session()->flash('flash_message', 'An invoice has not been generated for this term for this student.');
     }
     if ($data['outstandings'] !== null || $data['student_invoice'] !== null) {
         $sch_fee_payments = SchoolFeesPayment::all();
         foreach ($sch_fee_payments as $sch_fee_payment) {
             $term_payments = DB::table($sch_fee_payment->table_name)->where('student_id', $student_id)->orderBy('created_at', 'desc')->get();
             $payments[] = $term_payments;
         }
         // dd(array_flatten($payments));
         $data['payments'] = array_flatten($payments);
         $data['student_info'] = Student::find($student_id);
         $data['classes'] = studentClass::lists('name', 'id')->prepend('Please Select');
         $data['students'] = Student::all();
         return view('payments.payments', $data);
     } else {
         session()->flash('flash_message', 'An invoice has not been generated for this student.');
         return redirect()->route('accounts.payments.index');
     }
 }