function applyJob($options) { $query = "Insert into candidate (candidate_id,site_id,last_name,first_name,phone_home,phone_cell,phone_work,address,city,state,zip,key_skills,entered_by,owner,date_created,email1,best_time_to_call) values (NULL,'1','" . $options['lastname'] . "','" . $options['firstname'] . "','" . $options['homephone'] . "','" . $options['mobilephone'] . "','" . $options['workphone'] . "','" . $options['mailingaddress'] . "','" . $options['city'] . "','" . $options['state'] . "','" . $options['zip'] . "','" . $options['skill'] . "','" . $user->id . "','" . $user->id . "','" . date('Y-m-d H:i:s') . "','" . $options['email_address'] . "','" . $options['besttimetocall'] . "')"; $this->CatsDb->setQuery($query); $this->CatsDb->query(); $id = $this->CatsDb->insertID(); $query1 = "Insert into candidate_joborder (candidate_joborder_id,candidate_id,joborder_id,site_id,status,date_submitted,date_created,rating_value) values (NULL,'" . $id . "','" . $options['joborder_id'] . "','1','100','" . date('Y-m-d H:i:s') . "','" . date('Y-m-d H:i:s') . "','-1')"; $this->CatsDb->setQuery($query1); $this->CatsDb->query(); include_once JPATH_COMPONENT . DS . 'lib' . DS . 'Attachments.php'; $attachmentCreator = new AttachmentCreator(1, $this->CatsDb); if (!$attachmentCreator->createFromUpload('100', $id, 'cv', false, 1)) { jimport('joomla.error.error'); JError::raise(E_WARNING, 500, 'Problem uploading attachment<br>' . $attachmentCreator->getError(), $attachmentCreator->getError()); } //Inset vao bang activity $this->CatsDb->setQuery("Insert into activity (activity_id,data_item_id,data_item_type,joborder_id,site_id,entered_by,date_created,type,notes,date_modified) values (NULL,'" . $id . "','100','" . $options['joborder_id'] . "','1','1250','" . date('Y-m-d H:i:s') . "','400','User applied through candidate portal','" . date('Y-m-d H:i:s') . "')"); $this->CatsDb->query(); //Send mail to the manager job is to inform new people apply //fetch recruiter $this->CatsDb->setQuery("Select recruiter,title from joborder where joborder_id = '" . $options['joborder_id'] . "'"); $r = $this->CatsDb->loadObjectList(); $r = $r[0]; $this->CatsDb->setQuery("Select * from user where user_id = '" . $r->recruiter . "'"); $userRow = $this->CatsDb->loadObjectList(); $userRow = $userRow[0]; $htmlMessage = "<html><head><title>Recruiter Notification</title></head><body>"; $htmlMessage .= "<table cellpadding=0 cellspacing=0 width=100% style='border:1px solid #cccccc;padding:20px;'>"; $htmlMessage .= "<tr><td width=100%>"; $htmlMessage .= "<b>Dear " . $userRow->last_name . "</b>"; $htmlMessage .= "<br>This e-mail is a confirmation that new candidates have applied to your vacancy through our online recruitment system .."; $htmlMessage .= "<br><Br><b>Vacancy name:</b> " . $r->title; $htmlMessage .= "<br><b>Applicant Name : </b>" . $options['firstname'] . " " . $options['lastname'] . "."; $htmlMessage .= "<br><b>Candidate URL : </b> <a href='" . $this->Cats_install . "index.php?m=candidates&a=show&candidateID=" . $id . "'>" . $this->Cats_install . "index.php?m=candidates&a=show&candidateID=" . $id . "</a>."; $htmlMessage .= "<br><b>Job Order URL : </b> <a href='" . $this->Cats_install . "index.php?m=joborders&a=show&jobOrderID=" . $options['joborder_id'] . "'>" . $this->Cats_install . "index.php?m=joborders&a=show&jobOrderID=" . $options['joborder_id'] . "</a>."; $htmlMessage .= "<br><br>Administrator<br>Recruiter notification."; $htmlMessage .= "</td></tr></table></body></html>"; //Gui mail JUtility::sendMail($this->email, 'Recruiter notification', $userRow->email, 'Administrator - Candidate applied to an OpenCATS vacancy.', $htmlMessage, 1); $this->CatsDb->setQuery("Select questionnaire_id from joborder where joborder_id = '" . $options['joborder_id'] . "'"); $question = $this->CatsDb->loadResult(); $q['question'] = $question; $q['id'] = $id; return $q; }
die('No mass import in progress.'); } if (count($_SESSION['CATS']->massImportFiles) == 0) { die('done'); } $dups = 0; $success = 0; $processed = 0; // FIXME: Count failures. for ($i = 0; $i < 50; ++$i) { if (count($_SESSION['CATS']->massImportFiles) == 0) { continue; } $fileName = array_pop($_SESSION['CATS']->massImportFiles); $fullFilename = $_SESSION['CATS']->massImportDirectory . '/' . $fileName; $attachmentCreator = new AttachmentCreator($_SESSION['CATS']->getSiteID()); $attachmentID = $attachmentCreator->createFromFile(DATA_ITEM_BULKRESUME, 0, $fullFilename, false, '', true, true); if ($attachmentCreator->isError()) { //Nothing } else { if ($attachmentCreator->isTextExtractionError()) { //Nothing } else { if ($attachmentCreator->duplicatesOccurred()) { ++$dups; } else { ++$success; } } } ++$processed;
private function onCreateAttachment() { if ($this->_accessLevel < ACCESS_LEVEL_EDIT) { $this->listByView('Invalid user level for action.'); return; } /* Bail out if we don't have a valid joborder ID. */ if (!$this->isRequiredIDValid('companyID', $_POST)) { CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid company ID.'); } $companyID = $_POST['companyID']; if (!eval(Hooks::get('CLIENTS_ON_CREATE_ATTACHMENT_PRE'))) { return; } $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromUpload(DATA_ITEM_COMPANY, $companyID, 'file', false, false); if ($attachmentCreator->isError()) { CommonErrors::fatalModal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); } if (!eval(Hooks::get('CLIENTS_ON_CREATE_ATTACHMENT_POST'))) { return; } $this->_template->assign('isFinishedMode', true); $this->_template->assign('companyID', $companyID); $this->_template->display('./modules/companies/CreateAttachmentModal.tpl'); }
private function getMassImportCandidates() { $db = DatabaseConnection::getInstance(); // Find the files the user has uploaded and put them in an array if (isset($_SESSION['CATS']) && !empty($_SESSION['CATS'])) { $siteID = $_SESSION['CATS']->getSiteID(); $userID = $_SESSION['CATS']->getUserID(); } else { CommonErrors::fatal(COMMONERROR_NOTLOGGEDIN, $this); } list($documents, $success, $failed) = $this->getMassImportDocuments(); if (!count($documents)) { return array(array(), array(), array(), array()); } $importedCandidates = array(); $importedDocuments = array(); $importedFailed = array(); $importedDuplicates = array(); for ($ind = 0; $ind < count($_SESSION['CATS_PARSE_TEMP']); $ind++) { $doc = $_SESSION['CATS_PARSE_TEMP'][$ind]; // Get parsed information instead (if available) for ($ind2 = 0; $ind2 < count($documents); $ind2++) { if ($documents[$ind2]['id'] == $ind) { $doc = $documents[$ind2]; } } if (isset($doc['success']) && $doc['success']) { $candidateAdded = false; if (isset($doc['lastName']) && $doc['lastName'] != '' && isset($doc['firstName']) && $doc['firstName'] != '') { $isCandidateUnique = true; /** * We need to check for duplicate candidate entries before adding a new * candidate into CATS. The criteria is as follows: * - if email is present, does it match an existing e-mail * - if last name and zip code or last name and phone numbers are present, do they match likewise */ if (strpos($doc['email'], '@') !== false) { $sql = sprintf('SELECT count(*) ' . 'FROM candidate ' . 'WHERE (candidate.email1 = %s OR candidate.email2 = %s) ' . 'AND candidate.site_id = %d', $db->makeQueryString($doc['email']), $db->makeQueryString($doc['email']), $this->_siteID); if ($db->getColumn($sql, 0, 0) > 0) { $isCandidateUnique = false; } } if (strlen($doc['lastName']) > 3 && isset($doc['phone']) && strlen($doc['phone']) >= 10) { $sql = sprintf('SELECT count(*) ' . 'FROM candidate ' . 'WHERE candidate.last_name = %s ' . 'AND (candidate.phone_home = %s ' . 'OR candidate.phone_work = "%s ' . 'OR candidate.phone_cell = "%s) ' . 'AND candidate.site_id = %d', $db->makeQueryString($doc['lastName']), $db->makeQueryString($doc['phone']), $db->makeQueryString($doc['phone']), $db->makeQueryString($doc['phone']), $this->_siteID); if ($db->getColumn($sql, 0, 0) > 0) { $isCandidateUnique = false; } } if (strlen($doc['lastName']) > 3 && isset($doc['zip']) && strlen($doc['zip']) >= 5) { $sql = sprintf('SELECT count(*) ' . 'FROM candidate ' . 'WHERE candidate.last_name = %s ' . 'AND candidate.zip = %s ' . 'AND candidate.site_id = %d', $db->makeQueryString($doc['lastName']), $db->makeQueryString($doc['zipCode']), $this->_siteID); if ($db->getColumn($sql, 0, 0) > 0) { $isCandidateUnique = false; } } if ($isCandidateUnique) { // This was parsed data $candidates = new Candidates($siteID); $candidateID = $candidates->add($doc['firstName'], '', $doc['lastName'], $doc['email'], '', $doc['phone'], '', '', $doc['address'], $doc['city'], $doc['state'], $doc['zipCode'], '', $doc['skills'], NULL, '', false, '', '', 'This resume was parsed automatically. You should review it for errors.', '', '', $userID, $userID, '', 0, 0, '', true); if ($candidateID > 0) { $candidateAdded = true; // set the date created to the file modification date $db->query(sprintf('UPDATE candidate SET date_created = "%s", date_modified = "%s" ' . 'WHERE candidate_id = %d AND site_id = %d', date('c', $doc['cTime']), date('c', $doc['cTime']), $candidateID, $siteID)); // Success, attach resume to candidate as attachment $ac = new AttachmentCreator($siteID); if ($ac->createFromFile(DATA_ITEM_CANDIDATE, $candidateID, $doc['name'], $doc['realName'], '', true, true)) { // FIXME: error checking on fail? } $importedCandidates[] = array('name' => trim($doc['firstName'] . ' ' . $doc['lastName']), 'resume' => $doc['realName'], 'url' => sprintf('%s?m=candidates&a=show&candidateID=%d', CATSUtility::getIndexName(), $candidateID), 'location' => trim($doc['city'] . ' ' . $doc['state'] . ' ' . $doc['zipCode'])); } } else { $importedDuplicates[] = array('name' => trim($doc['firstName'] . ' ' . $doc['lastName']), 'resume' => $doc['realName']); @unlink($doc['name']); $candidateAdded = true; } } /** * A candidate was unable to be automatically added, add them as a * bulk resume document which is still searchable and can be manually * converted into a candidate later. */ if (!$candidateAdded) { $brExists = false; $error = false; /** * Bulk resumes can be "rescanned", make sure this particular file isn't a * rescan before adding another copy. */ if (preg_match('/^_BulkResume_(.*)\\.txt$/', $doc['realName'], $matches)) { $attachments = new Attachments($this->_siteID); $bulkResumes = $attachments->getBulkAttachments(); foreach ($bulkResumes as $bulkResume) { $mp = explode('.', $bulkResume['originalFileName']); $fileName = implode('.', array_slice($mp, 0, -1)); if (!strcmp($fileName, $matches[1])) { $brExists = true; if (FileUtility::isUploadFileSafe($siteID, 'massimport', $doc['name'])) { @unlink($doc['name']); } break; } } } if (!$brExists) { $error = false; $attachmentCreator = new AttachmentCreator($siteID); $attachmentCreator->createFromFile(DATA_ITEM_BULKRESUME, 0, $doc['name'], $doc['realName'], '', true, true); if ($attachmentCreator->isError()) { $error = true; } if ($attachmentCreator->duplicatesOccurred()) { $error = true; } } // For use later on debugging //$isTextExtractionError = $attachmentCreator->isTextExtractionError(); //$textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); if (!$error || $brExists) { $importedDocuments[] = array('name' => $doc['realName']); } else { $importedFailed[] = array('name' => $doc['realName']); } } else { if (preg_match('/^_BulkResume_(.*)\\.txt$/', $doc['realName'], $matches)) { $attachments = new Attachments($this->_siteID); $bulkResumes = $attachments->getBulkAttachments(); foreach ($bulkResumes as $bulkResume) { $mp = explode('.', $bulkResume['originalFileName']); $fileName = implode('.', array_slice($mp, 0, -1)); if (!strcmp($fileName, $matches[1])) { // Delete the permanent file $attachments->delete($bulkResume['attachmentID'], true); // Delete the temporary file if (FileUtility::isUploadFileSafe($siteID, 'massimport', $doc['name'])) { @unlink($doc['name']); } break; } } } } } else { // This document failed to convert to a text-format using doc2text $importedFailed[] = array('name' => $doc['realName']); // Make sure it's a safe filename to delete and located in the site's upload directory if (FileUtility::isUploadFileSafe($siteID, 'massimport', $doc['name'])) { @unlink($doc['name']); } } } return array($importedCandidates, $importedDocuments, $importedFailed, $importedDuplicates); }
DATA_ITEM_COMPANY, $companyID, "AND content_type = 'catsbackup'" ); /* Build title string. */ if ($attachmentsOnly) { $title = 'CATS Attachments Backup'; } else { $title = 'CATS Backup'; } $attachmentCreator = new AttachmentCreator(CATS_ADMIN_SITE); $attachmentCreator->createFromFile( DATA_ITEM_COMPANY, $companyID, 'catsbackup.bak', $title, 'catsbackup', false, false ); if ($attachmentCreator->isError()) { die($attachmentCreator->getError()); } $attachmentID = $attachmentCreator->getAttachmentID(); $directory = $attachmentCreator->getContainingDirectory(); $_SESSION['CATS']->storeValueByName('backupDirectory', $directory); /* Build request parameters. */
public function onApplyToJobOrder($siteID, $candidateID = false) { $jobOrders = new JobOrders($siteID); $careerPortalSettings = new CareerPortalSettings($siteID); if (!$this->isRequiredIDValid('ID', $_POST)) { CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid job order ID.'); return; } $jobOrderID = $_POST['ID']; $jobOrderData = $jobOrders->get($jobOrderID); if (!isset($jobOrderData['public']) || $jobOrderData['public'] == 0) { CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'The specified job order could not be found.'); return; } $lastName = $this->getTrimmedInput('lastName', $_POST); $middleName = $this->getTrimmedInput('middleName', $_POST); $firstName = $this->getTrimmedInput('firstName', $_POST); $email = $this->getTrimmedInput('email', $_POST); $email2 = $this->getTrimmedInput('email2', $_POST); $address = $this->getTrimmedInput('address', $_POST); $city = $this->getTrimmedInput('city', $_POST); $state = $this->getTrimmedInput('state', $_POST); $zip = $this->getTrimmedInput('zip', $_POST); $source = $this->getTrimmedInput('source', $_POST); $phone = $this->getTrimmedInput('phone', $_POST); $phoneHome = $this->getTrimmedInput('phoneHome', $_POST); $phoneCell = $this->getTrimmedInput('phoneCell', $_POST); $bestTimeToCall = $this->getTrimmedInput('bestTimeToCall', $_POST); $keySkills = $this->getTrimmedInput('keySkills', $_POST); $extraNotes = $this->getTrimmedInput('extraNotes', $_POST); $employer = $this->getTrimmedInput('employer', $_POST); $gender = $this->getTrimmedInput('eeogender', $_POST); $race = $this->getTrimmedInput('eeorace', $_POST); $veteran = $this->getTrimmedInput('eeoveteran', $_POST); $disability = $this->getTrimmedInput('eeodisability', $_POST); if (empty($firstName)) { CommonErrors::fatal(COMMONERROR_MISSINGFIELDS, $this, 'First Name is a required field - please have your administrator edit your templates to include the first name field.'); } if (empty($lastName)) { CommonErrors::fatal(COMMONERROR_MISSINGFIELDS, $this, 'Last Name is a required field - please have your administrator edit your templates to include the last name field.'); } if (empty($email)) { CommonErrors::fatal(COMMONERROR_MISSINGFIELDS, $this, 'E-Mail address is a required field - please have your administrator edit your templates to include the email field.'); } if (empty($source)) { $source = 'Online Careers Website'; } $users = new Users(CATS_ADMIN_SITE); $automatedUser = $users->getAutomatedUser(); /* Find if another user with same e-mail exists. If so, update the user * to contain the new information. */ $candidates = new Candidates($siteID); /** * Save basic information in a cookie in case the site is using registration to * process repeated postings, etc. */ $fields = array('firstName', 'lastName', 'email', 'address', 'city', 'state', 'zip', 'phone', 'phoneHome', 'phoneCell' ); $storedVal = ''; foreach ($fields as $field) { eval('$tmp = sprintf(\'"%s"="%s"\', $field, urlencode($' . $field . '));'); $storedVal .= $tmp; } // Store their information for an hour only (about 1 session), if they return they can log in again and // specify "remember me" which stores it for 2 weeks. @setcookie($this->getCareerPortalCookieName($siteID), $storedVal, time()+60*60); if ($candidateID !== false) { $candidate = $candidates->get($candidateID); // Candidate exists and registered. Update their profile with new values (if provided) $candidates->update( $candidateID, $candidate['isActive'] ? true : false, $firstName, $middleName, $lastName, $email, $email2, $phoneHome, $phoneCell, $phone, $address, $city, $state, $zip, $source, $keySkills, '', $employer, '', '', '', $candidate['notes'], '', $bestTimeToCall, $automatedUser['userID'], $automatedUser['userID'], $gender, $race, $veteran, $disability ); /* Update extra feilds */ $candidates->extraFields->setValuesOnEdit($candidateID); } else { // Lookup the candidate by e-mail, use that candidate instead if found (but don't update profile) $candidateID = $candidates->getIDByEmail($email); } if ($candidateID === false || $candidateID < 0) { /* New candidate. */ $candidateID = $candidates->add( $firstName, $middleName, $lastName, $email, $email2, $phoneHome, $phoneCell, $phone, $address, $city, $state, $zip, $source, $keySkills, '', $employer, '', '', '', 'Candidate submitted these notes with first application: ' . "\n\n" . $extraNotes, '', $bestTimeToCall, $automatedUser['userID'], $automatedUser['userID'], $gender, $race, $veteran, $disability ); /* Update extra fields. */ $candidates->extraFields->setValuesOnEdit($candidateID); } // If the candidate was added and a questionnaire exists for the job order if ($candidateID > 0 && ($questionnaireID = $jobOrderData['questionnaireID'])) { $questionnaireLib = new Questionnaire($siteID); // Perform any actions specified by the questionnaire $questionnaireLib->doActions($questionnaireID, $candidateID, $_POST); } $fileUploaded = false; /* Upload resume (no questionnaire) */ if (isset($_FILES['file']) && !empty($_FILES['file']['name'])) { $attachmentCreator = new AttachmentCreator($siteID); $attachmentCreator->createFromUpload( DATA_ITEM_CANDIDATE, $candidateID, 'file', false, true ); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); return; } $duplicatesOccurred = $attachmentCreator->duplicatesOccurred(); $isTextExtractionError = $attachmentCreator->isTextExtractionError(); $textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); // FIXME: Show parse errors! $fileUploaded = true; $resumePath = $attachmentCreator->getNewFilePath(); } /* Upload resume (with questionnaire) */ else if (isset($_POST['file']) && !empty($_POST['file'])) { $resumePath = ''; $newFilePath = FileUtility::getUploadFilePath($siteID, 'careerportaladd', $_POST['file']); if ($newFilePath !== false) { $attachmentCreator = new AttachmentCreator($siteID); $attachmentCreator->createFromFile( DATA_ITEM_CANDIDATE, $candidateID, $newFilePath, false, '', true, true ); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); return; } $duplicatesOccurred = $attachmentCreator->duplicatesOccurred(); $isTextExtractionError = $attachmentCreator->isTextExtractionError(); $textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); // FIXME: Show parse errors! $fileUploaded = true; $resumePath = $attachmentCreator->getNewFilePath(); } } $pipelines = new Pipelines($siteID); $activityEntries = new ActivityEntries($siteID); /* Is the candidate already in the pipeline for this job order? */ $rs = $pipelines->get($candidateID, $jobOrderID); if (count($rs) == 0) { /* Attempt to add the candidate to the pipeline. */ if (!$pipelines->add($candidateID, $jobOrderID)) { CommonErrors::fatal(COMMONERROR_RECORDERROR, $this, 'Failed to add candidate to pipeline.'); } // FIXME: For some reason, pipeline entries like to disappear between // the above add() and this get(). WTF? $rs = $pipelines->get($candidateID, $jobOrderID); if (isset($rs['candidateJobOrderID'])) $pipelines->updateRatingValue($rs['candidateJobOrderID'], -1); $newApplication = true; } else { $newApplication = false; } /* Build activity note. */ if (!$newApplication) { $activityNote = 'User re-applied through candidate portal'; } else { $activityNote = 'User applied through candidate portal'; } if ($fileUploaded) { if (!$duplicatesOccurred) { $activityNote .= ' <span style="font-weight: bold;">and' . ' attached a new resume (<a href="' . $resumePath . '">Download</a>)</span>'; } else { $activityNote .= ' and attached an existing resume (<a href="' . $resumePath . '">Download</a>)'; } } if (!empty($extraNotes)) { $activityNote .= '; added these notes: ' . $extraNotes; } /* Add the activity note. */ $activityID = $activityEntries->add( $candidateID, DATA_ITEM_CANDIDATE, ACTIVITY_OTHER, $activityNote, $automatedUser['userID'], $jobOrderID ); /* Send an E-Mail describing what happened. */ $emailTemplates = new EmailTemplates($siteID); $candidatesEmailTemplateRS = $emailTemplates->getByTag( 'EMAIL_TEMPLATE_CANDIDATEAPPLY' ); if (!isset($candidatesEmailTemplateRS['textReplaced']) || empty($candidatesEmailTemplateRS['textReplaced']) || $candidatesEmailTemplateRS['disabled'] == 1) { $candidatesEmailTemplate = ''; } else { $candidatesEmailTemplate = $candidatesEmailTemplateRS['textReplaced']; } /* Replace e-mail template variables. */ /* E-Mail #1 - to candidate */ $stringsToFind = array( '%CANDFIRSTNAME%', '%CANDFULLNAME%', '%JBODOWNER%', '%JBODTITLE%', '%JBODCLIENT%' ); $replacementStrings = array( $firstName, $firstName . ' ' . $lastName, $jobOrderData['ownerFullName'], $jobOrderData['title'], $jobOrderData['companyName'] //'<a href="http://' . $_SERVER['HTTP_HOST'] . substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], '?')) . '?m=candidates&a=show&candidateID=' . $candidateID . '">'. // 'http://' . $_SERVER['HTTP_HOST'] . substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], '?')) . '?m=candidates&a=show&candidateID=' . $candidateID . '</a>' ); $candidatesEmailTemplate = str_replace( $stringsToFind, $replacementStrings, $candidatesEmailTemplate ); $emailContents = $candidatesEmailTemplate; if (!empty($emailContents)) { if(!$candidates->isLoaded()) { $candidates->load($candidateID); } $candidates->sendEMail( $automatedUser['userID'], $email, CAREERS_CANDIDATEAPPLY_SUBJECT, $emailContents ); } /* E-Mail #2 - to owner */ $candidatesEmailTemplateRS = $emailTemplates->getByTag( 'EMAIL_TEMPLATE_CANDIDATEPORTALNEW' ); if (!isset($candidatesEmailTemplateRS['textReplaced']) || empty($candidatesEmailTemplateRS['textReplaced']) || $candidatesEmailTemplateRS['disabled'] == 1) { $candidatesEmailTemplate = ''; } else { $candidatesEmailTemplate = $candidatesEmailTemplateRS['textReplaced']; } // FIXME: This will break if 'http' is elsewhere in the URL. $uri = str_replace('employment', '', $_SERVER['REQUEST_URI']); $uri = str_replace('http://', 'http', $uri); $uri = str_replace('//', '/', $uri); $uri = str_replace('http', 'http://', $uri); $uri = str_replace('/careers', '', $uri); /* Replace e-mail template variables. */ $stringsToFind = array( '%CANDFIRSTNAME%', '%CANDFULLNAME%', '%JBODOWNER%', '%CANDOWNER%', // Because the candidate was just added, we assume '%JBODTITLE%', // the candidate owner = job order owner. '%JBODCLIENT%', '%CANDCATSURL%', '%JBODID%', '%JBODCATSURL%' ); $replacementStrings = array( $firstName, $firstName . ' ' . $lastName, $jobOrderData['ownerFullName'], $jobOrderData['ownerFullName'], $jobOrderData['title'], $jobOrderData['companyName'], '<a href="http://' . $_SERVER['HTTP_HOST'] . substr($uri, 0, strpos($uri, '?')) . '?m=candidates&a=show&candidateID=' . $candidateID . '">'. 'http://' . $_SERVER['HTTP_HOST'] . substr($uri, 0, strpos($uri, '?')) . '?m=candidates&a=show&candidateID=' . $candidateID . '</a>', $jobOrderData['jobOrderID'], '<a href="http://' . $_SERVER['HTTP_HOST'] . substr($uri, 0, strpos($uri, '?')) . '?m=joborders&a=show&jobOrderID=' . $jobOrderData['jobOrderID'] . '">'. 'http://' . $_SERVER['HTTP_HOST'] . substr($uri, 0, strpos($uri, '?')) . '?m=joborders&a=show&jobOrderID=' . $jobOrderData['jobOrderID'] . '</a>', ); $candidatesEmailTemplate = str_replace( $stringsToFind, $replacementStrings, $candidatesEmailTemplate ); $emailContents = $candidatesEmailTemplate; if (!empty($emailContents)) { if(!$jobOrders->isLoaded()) { $jobOrders->load($jobOrderID); } $jobOrders->sendEmail( $automatedUser['userID'], $jobOrderData['owner_email'], CAREERS_OWNERAPPLY_SUBJECT, $emailContents ); if ($jobOrderData['owner_email'] != $jobOrderData['recruiter_email']) { $jobOrders->sendEmail( $automatedUser['userID'], $jobOrderData['recruiter_email'], CAREERS_OWNERAPPLY_SUBJECT, $emailContents ); } } }
public function copyAttachment($dataItemType, $dataItemID, $attachmentID) { $sql = "select * from attachment where attachment_id ={$attachmentID}"; $row = $this->_db->getAssoc($sql); $filePath = "attachments/" . $row["directory_name"] . $row["stored_filename"]; $destination = "attachments/" . $row["directory_name"] . $row["stored_filename"] . "_copy"; if (!file_exists($destination)) { return $this->add($dataItemType, $dataItemID, $row["title"], $row["original_filename"], $row["stored_filename"], $row["content_type"], $row["resume"], $row["text"], $row["profile_image"], $row["directory_name"]); } else { copy($filePath, $destination); } $filePath = $destination; $title = $row["title"]; $contentType = $row["content_type"]; $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromFile($dataItemType, $dataItemID, $filePath, $title, $contentType, $extractText, $fileExists); if ($attachmentCreator->isError()) { CommonErrors::fatalModal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); return; //$this->fatalModal($attachmentCreator->getError()); } }
public function onCreateAttachment() { if ($this->_accessLevel < ACCESS_LEVEL_EDIT) { CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.'); } /* Bail out if we don't have a valid joborder ID. */ if (!$this->isRequiredIDValid('jobOrderID', $_POST)) { CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid joborder ID.'); } $jobOrderID = $_POST['jobOrderID']; if (!eval(Hooks::get('JO_ON_CREATE_ATTACHMENT_PRE'))) return; $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromUpload( DATA_ITEM_JOBORDER, $jobOrderID, 'file', false, false ); if ($attachmentCreator->isError()) { CommonErrors::fatalModal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); } if (!eval(Hooks::get('JO_ON_CREATE_ATTACHMENT_POST'))) return; $this->_template->assign('isFinishedMode', true); $this->_template->assign('jobOrderID', $jobOrderID); $this->_template->display( './modules/joborders/CreateAttachmentModal.php' ); }
/** * Adds a candidate. This is factored out for code clarity. * * @param boolean is modal window * @param string module directory * @return integer candidate ID */ private function _addCandidate($isModal, $directoryOverride = '') { /* Module directory override for fatal() calls. */ if ($directoryOverride != '') { $moduleDirectory = $directoryOverride; } else { $moduleDirectory = $this->_moduleDirectory; } /* Modal override for fatal() calls. */ if ($isModal) { $fatal = 'fatalModal'; } else { $fatal = 'fatal'; } /* Bail out if we received an invalid availability date; if not, go * ahead and convert the date to MySQL format. */ $dateAvailable = $this->getTrimmedInput('dateAvailable', $_POST); if (!empty($dateAvailable)) { if (!DateUtility::validate('-', $dateAvailable, DATE_FORMAT_MMDDYY)) { $this->{$fatal}('Invalid availability date.', $moduleDirectory); } /* Convert start_date to something MySQL can understand. */ $dateAvailable = DateUtility::convert('-', $dateAvailable, DATE_FORMAT_MMDDYY, DATE_FORMAT_YYYYMMDD); } $formattedPhoneHome = StringUtility::extractPhoneNumber($this->getTrimmedInput('phoneHome', $_POST)); if (!empty($formattedPhoneHome)) { $phoneHome = $formattedPhoneHome; } else { $phoneHome = $this->getTrimmedInput('phoneHome', $_POST); } $formattedPhoneCell = StringUtility::extractPhoneNumber($this->getTrimmedInput('phoneCell', $_POST)); if (!empty($formattedPhoneCell)) { $phoneCell = $formattedPhoneCell; } else { $phoneCell = $this->getTrimmedInput('phoneCell', $_POST); } $formattedPhoneWork = StringUtility::extractPhoneNumber($this->getTrimmedInput('phoneWork', $_POST)); if (!empty($formattedPhoneWork)) { $phoneWork = $formattedPhoneWork; } else { $phoneWork = $this->getTrimmedInput('phoneWork', $_POST); } /* Can Relocate */ $canRelocate = $this->isChecked('canRelocate', $_POST); $lastName = $this->getTrimmedInput('lastName', $_POST); $middleName = $this->getTrimmedInput('middleName', $_POST); $firstName = $this->getTrimmedInput('firstName', $_POST); $email1 = $this->getTrimmedInput('email1', $_POST); $email2 = $this->getTrimmedInput('email2', $_POST); $address = $this->getTrimmedInput('address', $_POST); $city = $this->getTrimmedInput('city', $_POST); $state = $this->getTrimmedInput('state', $_POST); $zip = $this->getTrimmedInput('zip', $_POST); $source = $this->getTrimmedInput('source', $_POST); $keySkills = $this->getTrimmedInput('keySkills', $_POST); $currentEmployer = $this->getTrimmedInput('currentEmployer', $_POST); $currentPay = $this->getTrimmedInput('currentPay', $_POST); $desiredPay = $this->getTrimmedInput('desiredPay', $_POST); $notes = $this->getTrimmedInput('notes', $_POST); $webSite = $this->getTrimmedInput('webSite', $_POST); $bestTimeToCall = $this->getTrimmedInput('bestTimeToCall', $_POST); $gender = $this->getTrimmedInput('gender', $_POST); $race = $this->getTrimmedInput('race', $_POST); $veteran = $this->getTrimmedInput('veteran', $_POST); $disability = $this->getTrimmedInput('disability', $_POST); /* Candidate source list editor. */ $sourceCSV = $this->getTrimmedInput('sourceCSV', $_POST); /* Text resume. */ $textResumeBlock = $this->getTrimmedInput('textResumeBlock', $_POST); $textResumeFilename = $this->getTrimmedInput('textResumeFilename', $_POST); /* File resume. */ $associatedFileResumeID = $this->getTrimmedInput('associatedbFileResumeID', $_POST); /* Bail out if any of the required fields are empty. */ if (empty($firstName) || empty($lastName)) { CommonErrors::fatal(COMMONERROR_MISSINGFIELDS, $this); } if (!eval(Hooks::get('CANDIDATE_ON_ADD_PRE'))) { return; } $candidates = new Candidates($this->_siteID); $candidateID = $candidates->add($firstName, $middleName, $lastName, $email1, $email2, $phoneHome, $phoneCell, $phoneWork, $address, $city, $state, $zip, $source, $keySkills, $dateAvailable, $currentEmployer, $canRelocate, $currentPay, $desiredPay, $notes, $webSite, $bestTimeToCall, $this->_userID, $this->_userID, $gender, $race, $veteran, $disability); if ($candidateID <= 0) { return $candidateID; } /* Update extra fields. */ $candidates->extraFields->setValuesOnEdit($candidateID); /* Update possible source list. */ $sources = $candidates->getPossibleSources(); $sourcesDifferences = ListEditor::getDifferencesFromList($sources, 'name', 'sourceID', $sourceCSV); $candidates->updatePossibleSources($sourcesDifferences); /* Associate an exsisting resume if the user created a candidate with one. (Bulk) */ if (isset($_POST['associatedAttachment'])) { $attachmentID = $_POST['associatedAttachment']; $attachments = new Attachments($this->_siteID); $attachments->setDataItemID($attachmentID, $candidateID, DATA_ITEM_CANDIDATE); } else { if (isset($_FILES['file']) && !empty($_FILES['file']['name'])) { if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_PRE'))) { return; } $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromUpload(DATA_ITEM_CANDIDATE, $candidateID, 'file', false, true); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); } if ($attachmentCreator->duplicatesOccurred()) { $this->listByView('This attachment has already been added to this candidate.'); return; } $isTextExtractionError = $attachmentCreator->isTextExtractionError(); $textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); // FIXME: Show parse errors! if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_POST'))) { return; } } else { if (LicenseUtility::isParsingEnabled()) { /** * Description: User clicks "browse" and selects a resume file. User doesn't click * upload. The resume file is STILL uploaded. * Controversial: User uploads a resume, parses, etc. User selects a new file with * "Browse" but doesn't click "Upload". New file is accepted. * It's technically correct either way, I'm opting for the "use whats in "file" * box over what's already uploaded method to avoid losing resumes on candidate * additions. */ $newFile = FileUtility::getUploadFileFromPost($this->_siteID, 'addcandidate', 'documentFile'); if ($newFile !== false) { $newFilePath = FileUtility::getUploadFilePath($this->_siteID, 'addcandidate', $newFile); $tempFile = $newFile; $tempFullPath = $newFilePath; } else { $attachmentCreated = false; $tempFile = false; $tempFullPath = false; if (isset($_POST['documentTempFile']) && !empty($_POST['documentTempFile'])) { $tempFile = $_POST['documentTempFile']; // Get the path of the file they uploaded already to attach $tempFullPath = FileUtility::getUploadFilePath($this->_siteID, 'addcandidate', $tempFile); } } if ($tempFile !== false && $tempFullPath !== false) { if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_PRE'))) { return; } $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromFile(DATA_ITEM_CANDIDATE, $candidateID, $tempFullPath, $tempFile, '', true, true); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); } if ($attachmentCreator->duplicatesOccurred()) { $this->listByView('This attachment has already been added to this candidate.'); return; } $isTextExtractionError = $attachmentCreator->isTextExtractionError(); $textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_POST'))) { return; } // Remove the cleanup cookie since the file no longer exists setcookie('CATS_SP_TEMP_FILE', ''); $attachmentCreated = true; } if (!$attachmentCreated && isset($_POST['documentText']) && !empty($_POST['documentText'])) { // Resume was pasted into the form and not uploaded from a file if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_PRE'))) { return; } $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromText(DATA_ITEM_CANDIDATE, $candidateID, $_POST['documentText'], 'MyResume.txt', true); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); } if ($attachmentCreator->duplicatesOccurred()) { $this->listByView('This attachment has already been added to this candidate.'); return; } if (!eval(Hooks::get('CANDIDATE_ON_CREATE_ATTACHMENT_POST'))) { return; } } } else { if (!empty($textResumeBlock)) { $attachmentCreator = new AttachmentCreator($this->_siteID); $attachmentCreator->createFromText(DATA_ITEM_CANDIDATE, $candidateID, $textResumeBlock, $textResumeFilename, true); if ($attachmentCreator->isError()) { CommonErrors::fatal(COMMONERROR_FILEERROR, $this, $attachmentCreator->getError()); return; //$this->fatal($attachmentCreator->getError()); } $isTextExtractionError = $attachmentCreator->isTextExtractionError(); $textExtractionErrorMessage = $attachmentCreator->getTextExtractionError(); // FIXME: Show parse errors! } } } } if (!eval(Hooks::get('CANDIDATE_ON_ADD_POST'))) { return; } return $candidateID; }