public function generateProgress($progress = 0)
 {
     $user = new User();
     $user->username = "******";
     $user->email = "*****@*****.**";
     $user->password = "******";
     $user->save();
     $plan = new Plan();
     $plan->user_id = $user->id;
     $plan->name = 'UnitTestProject';
     $plan->description = 'UnitTestProject';
     $plan->budget = '0';
     $plan->target = '10000';
     $plan->expected = '1000';
     $plan->period = '10';
     $plan->created_at = date('Y-m-d H:i:s', strtotime('-1 month', strtotime(date('Y-m-d'))));
     $plan->updated_at = date('Y-m-d H:i:s', strtotime('-1 month', strtotime(date('Y-m-d'))));
     $plan->save();
     $month = new Monthly();
     $month->plan_id = $plan->id;
     $month->status = 0;
     $month->month = 1;
     $month->limit = 1000;
     $month->progress = $progress;
     $month->save();
     return ['plan' => $plan, 'month' => $month, 'user' => $user];
 }
 public function postFinance(Request $request)
 {
     $successes = array();
     $messages = ["plan_id.required" => "Plan is not selected.", "fcategory.required" => "Please select category.", "fname.required" => "Please specify the name of this transaction.", "famount.required" => "Please insert the amount.", "ftype.required" => "Is it expense or income?", "plan_id.numeric" => "Plan is select illegally.", "fcategory.numeric" => "Category is select illegally.", "famount.numeric" => "Amount can be only numeric.", "ftype.boolean" => "Type is illegally injected.", "plan_id.exists" => "Plan is not exist within system.", "fcategory.exists" => "Category is not exist within system."];
     $validator = Validator::make($request->all(), ['plan_id' => 'required|numeric|exists:plan,id', 'fcategory' => 'required|numeric|exists:category,id', 'fname' => 'required', 'famount' => 'required|numeric', 'ftype' => 'required|boolean'], $messages);
     if ($validator->fails()) {
         return redirect()->back()->withErrors($validator)->withInput();
     }
     if (!Session::has('Plan')) {
         $validator->errors()->add('User', 'Please select plan!');
         return redirect()->back()->withInput()->withErrors($validator);
     }
     if ($this->user == null) {
         $validator->errors()->add('User', 'You are not login!');
         return redirect('login')->withErrors($validator);
     } else {
         $plan = Plan::find(Session::get('Plan'));
         $now = new DateTime(date('Y-m-d'));
         $create = new DateTime($plan->created_at);
         // $create   = new DateTime('2016-11-14');
         $interval = $now->diff($create);
         $diff = $interval->format('%m');
         if (sizeof($plan->months()->get()) <= $diff && $diff <= $plan->period || $diff == 0 && sizeof($plan->months()) <= $diff) {
             $month = new Monthly();
             $month->plan_id = Session::get('Plan');
             $month->status = 0;
             $month->month = sizeof($plan->months) + 1;
             $month->limit = $plan->expected;
             $month->progress = 0;
             $newExpected = ceil(($plan->target - $plan->budget) / ($plan->period - $diff));
             $lastMonth = $plan->months()->orderBy('id', 'desc')->first();
             if ($lastMonth) {
                 if ($lastMonth->progress != $lastMonth->limit) {
                     $month->limit = $newExpected;
                     if ($lastMonth->progress > $lastMonth->limit) {
                         $successes[] = "Very good! you have succeed " . ($lastMonth->progress - $lastMonth->limit) . " more than limit!";
                     } else {
                         if ($lastMonth->progress < $lastMonth->limit && $lastMonth->progress >= 0) {
                             $validator->errors()->add('User', 'Too bad cannot reach you goal last month! anyway, keep doing!');
                         } else {
                             if ($lastMonth->progress < $lastMonth->limit && $lastMonth->progress < 0) {
                                 $validator->errors()->add('User', 'Too bad you use ' . $lastMonth->progress . ' more than limit last month!!');
                             }
                         }
                     }
                 }
             }
             $month->save();
         } else {
             $month = $plan->months()->orderBy('id', 'desc')->first();
         }
         $date = str_replace('/', '-', $request->fdate);
         $daily = $month->days()->where('date', '>=', date('Y-m-d', strtotime($date)))->where('date', '<=', date('Y-m-d', strtotime('+1 day', strtotime($date))))->first();
         if ($daily == null) {
             $daily = new Daily();
             $daily->monthly_id = $month->id;
             $daily->date = date('Y-m-d', strtotime($date));
             $daily->expense = 0;
             $daily->income = 0;
         }
         $sumExpenseDaily = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $request->fcategory)->where('type', '=', 0)->where('daily.id', '=', $daily->id)->sum('amount');
         $sumExpenseMonthly = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $request->fcategory)->where('type', '=', 0)->sum('amount');
         $restrictDaily = Restrict::where('plan_id', '=', $plan->id)->where('category_id', '=', $request->fcategory)->where('for', '=', 0)->first();
         $restrictMonthly = Restrict::where('plan_id', '=', $plan->id)->where('category_id', '=', $request->fcategory)->where('for', '=', 1)->first();
         if ($restrictDaily) {
             $sumExpenseDaily += $request->famount;
             if ($restrictDaily->exceed < $sumExpenseDaily) {
                 $validator->errors()->add('User', 'Exceed per day!');
                 //return redirect()->back()->withInput()->withErrors($validator);
             }
         }
         if ($restrictMonthly) {
             $sumExpenseMonthly += $request->famount;
             if ($restrictMonthly->exceed < $sumExpenseMonthly) {
                 $validator->errors()->add('User', 'Exceed per month!');
                 //return redirect()->back()->withInput()->withErrors($validator);
             }
         }
         if ($request->ftype == 0) {
             $daily->expense += $request->famount;
             $month->progress = $month->progress - $request->famount;
             $plan->budget -= $request->famount;
         } else {
             $daily->income += $request->famount;
             $month->progress = $month->progress + $request->famount;
             $plan->budget += $request->famount;
         }
         $daily->save();
         $finance = new Finance();
         $finance->daily_id = $daily->id;
         $finance->category_id = $request->fcategory;
         $finance->description = $request->fdescription;
         $finance->name = $request->fname;
         $finance->amount = $request->famount;
         $finance->type = $request->ftype;
         $plan->save();
         if ($plan->budget >= $plan->target) {
             $successes[] = "Congratuation! You have reach your goal!!!";
         } else {
             if ($diff >= $plan->period && $plan->budget < $plan->target) {
                 $validator->errors()->add('User', 'This plan has been fail!! Please try again with more discipline!');
             }
         }
         Session::forget('successes');
         Session::put('successes', $successes);
         $finance->save();
         $month->save();
     }
     return redirect()->back()->withInput()->withErrors($validator);
 }
 public function getIndex(Request $request)
 {
     $successes = array();
     $validator = Validator::make($request->all(), []);
     if (isset($request->id)) {
         $plan = $this->user->plans()->where('id', '=', $request->id)->first();
     } else {
         if (Session::has('Plan')) {
             $plan = $this->user->plans()->where('id', '=', Session::get('Plan'))->first();
         }
     }
     if (isset($plan)) {
         $now = new DateTime(date('m/d/Y'));
         $create = new DateTime($plan->created_at);
         // $create   = new DateTime('2016-11-14');
         $interval = $now->diff($create);
         $diff = $interval->format('%m');
         if (sizeof($plan->months()->get()) <= $diff && $diff <= $plan->period || $diff == 0 && sizeof($plan->months()) <= $diff) {
             $month = new Monthly();
             $month->plan_id = $plan->id;
             $month->status = 0;
             $month->month = sizeof($plan->months) + 1;
             $month->limit = $plan->expected;
             $month->progress = 0;
             $monthLeft = $plan->period - $diff;
             if ($monthLeft > 0) {
                 $newExpected = ceil(($plan->target - $plan->budget) / $monthLeft);
             } else {
                 $newExpected = 1;
             }
             $lastMonth = $plan->months()->orderBy('id', 'desc')->first();
             if ($lastMonth) {
                 if ($lastMonth->progress != $lastMonth->limit) {
                     $month->limit = $newExpected;
                     if ($lastMonth->progress > $lastMonth->limit) {
                         $successes[] = "Very good! you have succeed " . ($lastMonth->progress - $lastMonth->limit) . " more than limit!";
                     } else {
                         if ($lastMonth->progress < $lastMonth->limit && $lastMonth->progress >= 0) {
                             $validator->errors()->add('User', 'Too bad cannot reach you goal last month! anyway, keep doing!');
                         } else {
                             if ($lastMonth->progress < $lastMonth->limit && $lastMonth->progress < 0) {
                                 $validator->errors()->add('User', 'Too bad you use ' . $lastMonth->progress . ' more than limit last month!!');
                             }
                         }
                     }
                 }
             }
             $month->save();
             $attach['progress'] = $month->progress / $month->limit * 100;
         } else {
             $month = $plan->months()->orderBy('id', 'desc')->first();
             if ($month) {
                 if ($month->limit == 0) {
                     $month->limit = 1;
                 }
                 $attach['progress'] = $month->progress / $month->limit * 100;
             }
         }
         $attach['plan'] = $plan;
         $attach['month'] = $month;
         $attach['category'] = [];
         $categories = Category::where('user_id', '=', $this->user->id)->orWhere('user_id', '=', 0)->get();
         $start = date('Y-m-d', strtotime('+' . $month->month - 1 . ' month', strtotime($plan->created_at)));
         $end = date('Y-m-d', strtotime('+' . $month->month . ' month', strtotime($plan->created_at)));
         foreach ($categories as $category) {
             $sumIncome = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $category->id)->where('type', '=', 1)->where('daily.date', '>=', $start)->where('daily.date', '<=', $end)->sum('amount');
             $sumExpense = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $category->id)->where('type', '=', 0)->where('daily.date', '>=', $start)->where('daily.date', '<=', $end)->sum('amount');
             if ($sumIncome > 0 || $sumExpense > 0) {
                 $attach['category'][] = ["name" => $category->name, "income" => $sumIncome, "expense" => $sumExpense];
             }
         }
         if ($plan->budget >= $plan->target) {
             $successes[] = "Congratuation! You have reach your goal!!!";
         } else {
             if ($diff >= $plan->period && $plan->budget < $plan->target) {
                 $validator->errors()->add('User', 'This plan has been fail!! Please try again with more discipline!');
             }
         }
         Session::forget('successes');
         Session::put('successes', $successes);
         return view('progress.index')->with($attach)->withErrors($validator);
     } else {
         return view('progress.index');
     }
 }
 public function getIndex(Request $request)
 {
     $successes = array();
     $validator = Validator::make($request->all(), []);
     if (isset($request->id)) {
         $plan = $this->user->plans()->where('id', '=', $request->id)->first();
     } else {
         if (Session::has('Plan')) {
             $plan = $this->user->plans()->where('id', '=', Session::get('Plan'))->first();
         }
     }
     if (isset($plan)) {
         $now = new DateTime(date('m/d/Y'));
         $create = new DateTime($plan->created_at);
         // $create   = new DateTime('2016-11-14');
         $interval = $now->diff($create);
         $diff = $interval->format('%m');
         if (sizeof($plan->months()->get()) <= $diff && $diff <= $plan->period || $diff == 0 && sizeof($plan->months()) <= $diff) {
             $month = new Monthly();
             $month->plan_id = $plan->id;
             $month->status = 0;
             $month->month = sizeof($plan->months());
             $month->limit = $plan->expected;
             $month->progress = 0;
             $lastMonth = $plan->months()->orderBy('id', 'desc')->first();
             if ($lastMonth) {
                 if ($lastMonth->progress != $lastMonth->limit) {
                     if ($lastMonth->progress > $lastMonth->limit) {
                         $month->progress = $month->progress + ($lastMonth->progress - $lastMonth->limit);
                         $successes[] = '<img src="https://pbs.twimg.com/media/CcBq-RpUkAEdOPm.jpg:large" height="50px" width="50px"/>' . "Very good! you have succeed " . ($lastMonth->progress - $lastMonth->limit) . " more than limit!";
                         //$successes[] = ;
                     } else {
                         if ($lastMonth->progress < $lastMonth->limit) {
                             $month->limit += $lastMonth->progress;
                             $validator->errors()->add('User', '<img src="https://pbs.twimg.com/media/CcBq-RpUkAEdOPm.jpg:large" height="50px" width="50px"/>' . 'Too bad you use ' . $lastMonth->progress . ' more than limit last month!!');
                         }
                     }
                 }
             }
             $month->save();
             $attach['progress'] = $month->progress / $month->limit * 100;
         } else {
             $month = $plan->months()->orderBy('id', 'desc')->first();
             if ($month) {
                 if ($month->limit == 0) {
                     $month->limit = 1;
                 }
                 $attach['progress'] = $month->progress / $month->limit * 100;
             }
         }
         $attach['plan'] = $plan;
         $attach['month'] = $month;
         $attach['category'] = [];
         $categories = Category::where('user_id', '=', $this->user->id)->orWhere('user_id', '=', 0)->get();
         $start = date('Y-m-d', strtotime('+' . $month->month - 1 . ' month', strtotime($plan->created_at)));
         $end = date('Y-m-d', strtotime('+' . $month->month . ' month', strtotime($plan->created_at)));
         foreach ($categories as $category) {
             $sumIncome = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $category->id)->where('type', '=', 1)->where('daily.date', '>=', $start)->where('daily.date', '<=', $end)->sum('amount');
             $sumExpense = Finance::join('category', 'category.id', '=', 'finance.category_id')->join('daily', 'daily.id', '=', 'finance.daily_id')->join('monthly', 'monthly.id', '=', 'daily.monthly_id')->where('monthly.id', '=', $month->id)->where('finance.category_id', '=', $category->id)->where('type', '=', 0)->where('daily.date', '>=', $start)->where('daily.date', '<=', $end)->sum('amount');
             if ($sumIncome > 0 || $sumExpense > 0) {
                 $attach['category'][] = ["name" => $category->name, "income" => $sumIncome, "expense" => $sumExpense];
             }
         }
         Session::forget('successes');
         Session::put('successes', $successes);
         return view('report.index')->with($attach)->withErrors($validator);
     } else {
         return view('report.index');
     }
 }