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 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();
     }
 }