public function createChanges(Goat $goat, $department_id, $description, $success_measure, $leads, $userCollabs, $deptCollabs, $due_date, $priority)
 {
     if ($department_id != $goat->department_id) {
         $change = new \App\Change();
         $change->change_type = 'L';
         $change->description = 'Assigned to ' . Department::find($department_id)->name;
         $change->goat_id = $goat->id;
         $change->user_id = Auth::user()->id;
         $change->save();
     }
     if ($description != $goat->description) {
         $change = new \App\Change();
         $change->change_type = 'D';
         $change->description = $description;
         $change->goat_id = $goat->id;
         $change->user_id = Auth::user()->id;
         $change->save();
     }
     if ($success_measure != $goat->success_measure) {
         $change = new \App\Change();
         $change->change_type = 'M';
         $change->description = "Success Measure: " . $success_measure;
         $change->goat_id = $goat->id;
         $change->user_id = Auth::user()->id;
         $change->save();
     }
     $newLeads = $leads ? $leads : array();
     $curLeads = $goat->userLeads()->get()->map(function ($user) {
         return $user->id;
     })->toArray();
     sort($newLeads);
     sort($curLeads);
     if ($newLeads != $curLeads) {
         if ($diff = array_diff($newLeads, $curLeads)) {
             $users = array_map(function ($id) {
                 return User::findOrFail($id)->name();
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'L';
             $change->description = "Added " . join(', ', $users);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
         if ($diff = array_diff($curLeads, $newLeads)) {
             $users = array_map(function ($id) {
                 return User::findOrFail($id)->name();
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'L';
             $change->description = "Removed " . join(', ', $users);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
     }
     $newCollaborators = $userCollabs ? $userCollabs : array();
     $curCollaborators = $goat->userCollaborators()->get()->map(function ($user) {
         return $user->id;
     })->toArray();
     sort($newCollaborators);
     sort($curCollaborators);
     if ($newCollaborators != $curCollaborators) {
         if ($diff = array_diff($newCollaborators, $curCollaborators)) {
             $users = array_map(function ($id) {
                 return User::findOrFail($id)->name();
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'C';
             $change->description = "Added " . join(', ', $users);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
         if ($diff = array_diff($curCollaborators, $newCollaborators)) {
             $users = array_map(function ($id) {
                 return User::findOrFail($id)->name();
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'C';
             $change->description = "Removed " . join(', ', $users);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
     }
     $newCollaborators = $deptCollabs ? $deptCollabs : array();
     $curCollaborators = $goat->departmentCollaborators()->get()->map(function ($dept) {
         return $dept->id;
     })->toArray();
     sort($newCollaborators);
     sort($curCollaborators);
     if ($newCollaborators != $curCollaborators) {
         if ($diff = array_diff($newCollaborators, $curCollaborators)) {
             $depts = array_map(function ($id) {
                 return Department::findOrFail($id)->name;
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'C';
             $change->description = "Added " . join(', ', $depts);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
         if ($diff = array_diff($curCollaborators, $newCollaborators)) {
             $depts = array_map(function ($id) {
                 return Department::findOrFail($id)->name;
             }, $diff);
             $change = new \App\Change();
             $change->change_type = 'C';
             $change->description = "Removed " . join(', ', $depts);
             $change->goat_id = $goat->id;
             $change->user_id = Auth::user()->id;
             $change->save();
         }
     }
     if ($goat->due_date != $due_date) {
         $change = new \App\Change();
         $change->change_type = 'T';
         $change->description = "Changed from " . \Carbon\Carbon::parse($goat->due_date)->toDateString() . " to " . \Carbon\Carbon::parse($due_date)->toDateString();
         $change->goat_id = $goat->id;
         $change->user_id = Auth::user()->id;
         $change->save();
     }
     if ($goat->priority != $priority) {
         $change = new \App\Change();
         $change->change_type = 'P';
         $change->description = "Changed from " . $this->priority_string($goat->priority) . " to " . $this->priority_string($priority);
         $change->goat_id = $goat->id;
         $change->user_id = Auth::user()->id;
         $change->save();
     }
 }
 public function storeGoat(Request $request, $parent_id)
 {
     $goat = new Goat();
     $goat->parent_id = $parent_id;
     $goat->type = $goat->parent->type == 'G' ? 'O' : ($goat->parent->type == 'O' ? 'A' : 'T');
     $goat->goal_type = $goat->parent->goal_type;
     $goat->bid = $goat->parent->bid;
     $goat->department_id = Auth::user()->leadOf()->first()->id;
     $goat->budget = null;
     $goat->description = $request->description;
     $goat->due_date = $request->due_date;
     $goat->priority = $request->priority;
     $goat->save();
     $userCollabs = array();
     $deptCollabs = array();
     if ($request->collabs) {
         foreach ($request->collabs as $col) {
             if (strpos($col, 'user') !== false) {
                 array_push($userCollabs, substr($col, 5));
             } else {
                 array_push($deptCollabs, substr($col, 5));
             }
         }
     }
     $leads = array_fill_keys($request->leads ? $request->leads : array(), ['user_role' => 'L']);
     $collabs = array_fill_keys($userCollabs, ['user_role' => 'C']);
     $goat->userLeads()->sync($leads + $collabs);
     $goat->departmentCollaborators()->sync($deptCollabs);
     $this->createNewGoatChange($goat);
     return redirect('/view');
 }
 public function store(Request $request)
 {
     $elem = new Goat();
     $type = $request->type;
     $elem->bid = $request->businessId;
     if ($type == 'G') {
         $this->validate($request, ['businessId' => 'required', 'goalDescription' => 'required|min:10|max:300']);
         $elem->goal_type = 'B';
         $elem->type = $type;
         $elem->description = $request->goalDescription;
         $elem->priority = null;
         $elem->due_date = null;
         $elem->budget = null;
         $elem->parent_id = null;
         $elem->complete = null;
         $elem->department_id = null;
         $elem->save();
     } elseif ($type == 'O') {
         $this->validate($request, ['businessId' => 'required', 'goalId' => 'required', 'objectiveDescription' => 'required|min:10|max:300']);
         $elem->type = $type;
         $elem->goal_type = 'B';
         $elem->description = $request->objectiveDescription;
         $elem->priority = null;
         $elem->due_date = null;
         $elem->budget = null;
         $elem->parent_id = $request->goalId;
         $elem->complete = null;
         $elem->department_id = null;
         $elem->save();
     } elseif ($type == 'A') {
         $this->validate($request, ['businessId' => 'required', 'goalId' => 'required', 'objId' => 'required', 'actionDescription' => 'required|min:10|max:300', 'endDate' => 'required|date', 'leadName' => 'required']);
         $elem->type = $type;
         $elem->goal_type = 'B';
         $elem->description = $request->actionDescription;
         $elem->priority = $request->priority;
         $elem->due_date = $request->endDate;
         $elem->budget = null;
         $elem->parent_id = $request->objId;
         $elem->complete = null;
         $elem->department_id = Auth::user()->leadOf()->first()->id;
         $elem->save();
         if ($request->leadName === null && $request->collaboratorName === null) {
         } elseif ($request->leadName === null) {
             $collabs = array_fill_keys($request->collaboratorName, ['user_role' => 'C']);
             $elem->userLeads()->sync($collabs);
         } elseif ($request->collaboratorName === null) {
             $leads = array_fill_keys($request->leadName, ['user_role' => 'L']);
             $elem->userLeads()->sync($leads);
         } else {
             $leads = array_fill_keys($request->leadName, ['user_role' => 'L']);
             $collabs = array_fill_keys($request->collaboratorName, ['user_role' => 'C']);
             $elem->userLeads()->sync($leads + $collabs);
         }
     } else {
         $this->validate($request, ['businessId' => 'required', 'goalId' => 'required', 'objId' => 'required', 'actionId' => 'required', 'taskDescription' => 'required|min:10|max:300', 'endDate' => 'required|date', 'leadName' => 'required']);
         $elem->type = $type;
         $elem->goal_type = 'B';
         $elem->description = $request->taskDescription;
         $elem->priority = $request->priority;
         $elem->due_date = $request->endDate;
         $elem->budget = null;
         $elem->parent_id = $request->actionId;
         $elem->complete = null;
         $elem->department_id = Auth::user()->leadOf()->first()->id;
         $elem->save();
         if ($request->leadName === null && $request->collaboratorName === null) {
             return back();
         } elseif ($request->leadName === null) {
             $collabs = array_fill_keys($request->collaboratorName, ['user_role' => 'C']);
             $elem->userLeads()->sync($collabs);
         } elseif ($request->collaboratorName === null) {
             $leads = array_fill_keys($request->leadName, ['user_role' => 'L']);
             $elem->userLeads()->sync($leads);
         } else {
             $leads = array_fill_keys($request->leadName, ['user_role' => 'L']);
             $collabs = array_fill_keys($request->collaboratorName, ['user_role' => 'C']);
             $elem->userLeads()->sync($leads + $collabs);
         }
     }
     return back();
 }