public function removeByAdmin($id)
 {
     $user = \User::getUser();
     if (!$user->hasAccess('admin')) {
         throw new \Exception("Not admin.", 1);
         return;
     }
     if (!($job = $this->findById($id))) {
         throw new \Exception("Job not found", 1);
         return;
     }
     $company = $job->company;
     if (!is_null($job->agency_id)) {
         $agency = $job->agency;
     }
     $tmpJob = $job;
     if ($job->delete()) {
         $notificationData = ['company_id' => $company->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Your job "' . $tmpJob->title . '" has been removed by admin', 'url' => null];
         $notification = \Company::addNotification($company, $notificationData);
         if (isset($agency)) {
             $notificationData = ['agency_id' => $agency->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Your job "' . $tmpJob->title . '" has been removed by admin', 'url' => null];
             $notification = \Agency::addNotification($agency, $notificationData);
         }
         return true;
     }
     return false;
 }
 public function applyForJob($contractor, $job)
 {
     if (!($company = $job->company)) {
         throw new \Exception("Company for this job not found.", 1);
         return;
     }
     // not efficient, need to change
     if (!($contractor = $this->findById($contractor->id))) {
         throw new \Exception("Contractor not found.", 1);
         return;
     }
     if ($contractor->jobs->contains($job->id)) {
         throw new \Exception("You have already applied for this job.", 1);
         return;
     }
     $contractor->jobs()->sync([$job->id => ['status' => 'request', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]], false);
     // TODO: Move to background worker
     $cUser = $contractor->user;
     $_hash = new Hash();
     $_hash = $_hash->getHasher();
     $notificationData = ['company_id' => $company->id, 'title' => 'New Job Application', 'alert_from' => $cUser->first_name . ' ' . $cUser->last_name, 'has_read' => false, 'url' => route('company.job.application') . '?i=' . $_hash->encode($job->id)];
     $notification = \Company::addNotification($company, $notificationData);
     if (!is_null($job->agency_id)) {
         if ($agency = $job->agency) {
             $notificationData = ['agency_id' => $job->agency_id, 'title' => 'New Job Application', 'alert_from' => $cUser->first_name . ' ' . $cUser->last_name, 'has_read' => false, 'url' => route('agency.job.application') . '?i=' . $_hash->encode($job->id)];
             $notification = \Agency::addNotification($agency, $notificationData);
         }
     }
     // END TODO
     return $contractor;
 }
 public function updateExpense($id, $company, $status)
 {
     if (!($expense = \Contractor::findExpenseById($id))) {
         throw new \Exception("Expense not found.", 1);
         return;
     }
     $job = $expense->job;
     if ($company->id !== $job->company_id) {
         throw new \Exception("Expense does not belong to the company.", 1);
         return;
     }
     if ($status) {
         $expense->auth_company = true;
         $expense->save();
         if (!is_null($job->agency_id) && !$expense->auth_agency) {
             $_hash = new Hash();
             $_hash = $_hash->getHasher();
             if ($agency = \Agency::findAgencyById($job->agency_id)) {
                 $notificationData = ['agency_id' => $agency->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Expense "' . $expense->title . '" for "' . $job->title . '" has been accepted by "' . $company->name . '". Please authorize it.', 'description' => 'Accepted by ' . $company->name, 'url' => route('agency.job.detail') . '?i=' . $_hash->encode($job->id)];
                 \Agency::addNotification($agency, $notificationData);
             }
         } else {
             if ($contractor = $expense->contractor) {
                 $notificationData = ['contractor_id' => $contractor->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Your expense "' . $expense->title . '" for "' . $job->title . '" has been accepted.', 'description' => 'Accepted by ' . $company->name, 'url' => '#'];
                 \Contractor::addNotification($contractor, $notificationData);
             }
         }
     } else {
         $expense->auth_company = false;
         $expense->save();
         if ($contractor = $expense->contractor) {
             $notificationData = ['contractor_id' => $contractor->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Your expense "' . $expense->title . '" for "' . $job->title . '" has been de-authorized.', 'description' => 'De-authorize by ' . $company->name, 'url' => '#'];
             \Contractor::addNotification($contractor, $notificationData);
         }
         if (!is_null($job->agency_id)) {
             if ($agency = \Agency::findAgencyById($job->agency_id)) {
                 $notificationData = ['agency_id' => $agency->id, 'alert_from' => 'System: Programme Chameleon', 'has_read' => false, 'title' => 'Expense "' . $expense->title . '" for "' . $job->title . '" has been de-authorized.', 'description' => 'De-authorize by ' . $company->name, 'url' => '#'];
                 \Agency::addNotification($agency, $notificationData);
             }
         }
     }
     return $expense;
 }