Exemple #1
0
 function saveWorkerPeekAction()
 {
     $translate = DevblocksPlatform::getTranslationService();
     $active_worker = CerberusApplication::getActiveWorker();
     if (!$active_worker || !$active_worker->is_superuser || DEMO_MODE) {
         return;
     }
     @($id = DevblocksPlatform::importGPC($_POST['id'], 'integer'));
     @($view_id = DevblocksPlatform::importGPC($_POST['view_id'], 'string'));
     @($first_name = DevblocksPlatform::importGPC($_POST['first_name'], 'string'));
     @($last_name = DevblocksPlatform::importGPC($_POST['last_name'], 'string'));
     @($title = DevblocksPlatform::importGPC($_POST['title'], 'string'));
     @($email = DevblocksPlatform::importGPC($_POST['email'], 'string'));
     @($password = DevblocksPlatform::importGPC($_POST['password'], 'string'));
     @($is_superuser = DevblocksPlatform::importGPC($_POST['is_superuser'], 'integer', 0));
     @($disabled = DevblocksPlatform::importGPC($_POST['is_disabled'], 'integer', 0));
     @($group_ids = DevblocksPlatform::importGPC($_POST['group_ids'], 'array'));
     @($group_roles = DevblocksPlatform::importGPC($_POST['group_roles'], 'array'));
     @($delete = DevblocksPlatform::importGPC($_POST['do_delete'], 'integer', 0));
     // [TODO] The superuser set bit here needs to be protected by ACL
     if (empty($first_name)) {
         $first_name = "Anonymous";
     }
     if (!empty($id) && !empty($delete)) {
         // Can't delete or disable self
         if ($active_worker->id != $id) {
             DAO_Worker::deleteAgent($id);
         }
     } else {
         if (empty($id) && null == DAO_Worker::lookupAgentEmail($email)) {
             $workers = DAO_Worker::getAll();
             $license = CerberusLicense::getInstance();
             if (!empty($license) && !empty($license['serial']) || count($workers) < 3) {
                 // Creating new worker.  If password is empty, email it to them
                 if (empty($password)) {
                     $settings = DevblocksPlatform::getPluginSettingsService();
                     $replyFrom = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_FROM);
                     $replyPersonal = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_PERSONAL, '');
                     $url = DevblocksPlatform::getUrlService();
                     $password = CerberusApplication::generatePassword(8);
                     try {
                         $mail_service = DevblocksPlatform::getMailService();
                         $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults());
                         $mail = $mail_service->createMessage();
                         $mail->setTo(array($email => $first_name . ' ' . $last_name));
                         $mail->setFrom(array($replyFrom => $replyPersonal));
                         $mail->setSubject('Your new helpdesk login information!');
                         $mail->generateId();
                         $headers = $mail->getHeaders();
                         $headers->addTextHeader('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')');
                         $body = sprintf("Your new helpdesk login information is below:\r\n" . "\r\n" . "URL: %s\r\n" . "Login: %s\r\n" . "Password: %s\r\n" . "\r\n" . "You should change your password from Preferences after logging in for the first time.\r\n" . "\r\n", $url->write('', true), $email, $password);
                         $mail->setBody($body);
                         if (!$mailer->send($mail)) {
                             throw new Exception('Password notification email failed to send.');
                         }
                     } catch (Exception $e) {
                         // [TODO] need to report to the admin when the password email doesn't send.  The try->catch
                         // will keep it from killing php, but the password will be empty and the user will never get an email.
                     }
                 }
                 $id = DAO_Worker::create($email, $password, '', '', '');
             }
         }
         // end create worker
         // Update
         $fields = array(DAO_Worker::FIRST_NAME => $first_name, DAO_Worker::LAST_NAME => $last_name, DAO_Worker::TITLE => $title, DAO_Worker::EMAIL => $email, DAO_Worker::IS_SUPERUSER => $is_superuser, DAO_Worker::IS_DISABLED => $disabled);
         // if we're resetting the password
         if (!empty($password)) {
             $fields[DAO_Worker::PASSWORD] = md5($password);
         }
         // Update worker
         DAO_Worker::updateAgent($id, $fields);
         // Update group memberships
         if (is_array($group_ids) && is_array($group_roles)) {
             foreach ($group_ids as $idx => $group_id) {
                 if (empty($group_roles[$idx])) {
                     DAO_Group::unsetTeamMember($group_id, $id);
                 } else {
                     DAO_Group::setTeamMember($group_id, $id, 2 == $group_roles[$idx]);
                 }
             }
         }
         // Add the worker e-mail to the addresses table
         if (!empty($email)) {
             DAO_Address::lookupAddress($email, true);
         }
         // Addresses
         if (null == DAO_AddressToWorker::getByAddress($email)) {
             DAO_AddressToWorker::assign($email, $id);
             DAO_AddressToWorker::update($email, array(DAO_AddressToWorker::IS_CONFIRMED => 1));
         }
         // Custom field saves
         @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
         DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_Worker::ID, $id, $field_ids);
     }
     if (!empty($view_id)) {
         $view = C4_AbstractViewLoader::getView($view_id);
         $view->render();
     }
     //DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config','workers')));
 }
Exemple #2
0
 /**
  * pull auth info out of $_POST, check it, return user_id or false
  * 
  * @return boolean whether login succeeded
  */
 function authenticate()
 {
     $umsession = UmPortalHelper::getSession();
     @($email = DevblocksPlatform::importGPC($_REQUEST['email']));
     @($pass = DevblocksPlatform::importGPC($_REQUEST['pass']));
     $valid = false;
     if (null != ($addy = DAO_Address::lookupAddress($email, false))) {
         if ($addy->is_registered && !empty($addy->pass) && 0 == strcmp(md5($pass), $addy->pass)) {
             $valid = true;
             $umsession->setProperty('sc_login', $addy);
         }
     }
     if ($valid) {
         return true;
     }
     $umsession->setProperty('sc_login', null);
     return false;
 }
Exemple #3
0
 private function _handleImportContact($xml)
 {
     $settings = CerberusSettings::getInstance();
     $logger = DevblocksPlatform::getConsoleLog();
     $sFirstName = (string) $xml->first_name;
     $sLastName = (string) $xml->last_name;
     $sEmail = (string) $xml->email;
     $sPassword = (string) $xml->password;
     $sOrganization = (string) $xml->organization;
     // Dupe check org
     if (null != ($address = DAO_Address::lookupAddress($sEmail))) {
         $logger->info('[Importer] Avoiding creating duplicate contact #' . $address->id . ' (' . $sEmail . ')');
         // [TODO] Still associate with org if local blank?
         // [TODO] Still associate password if local blank?
         return true;
     }
     $fields = array(DAO_Address::FIRST_NAME => $sFirstName, DAO_Address::LAST_NAME => $sLastName, DAO_Address::EMAIL => $sEmail);
     // Associate SC password
     if (!empty($sPassword) && $sPassword != md5('')) {
         $fields[DAO_Address::IS_REGISTERED] = 1;
         $fields[DAO_Address::PASS] = $sPassword;
     }
     $address_id = DAO_Address::create($fields);
     // Associate with organization
     if (!empty($sOrganization)) {
         if (null != ($org_id = DAO_ContactOrg::lookup($sOrganization, true))) {
             DAO_Address::update($address_id, array(DAO_Address::CONTACT_ORG_ID => $org_id));
         }
     }
     $logger->info('[Importer] Imported contact #' . $address_id . ' (' . $sEmail . ')');
     return true;
 }
Exemple #4
0
 function doRegisterConfirmAction()
 {
     @($email = DevblocksPlatform::importGPC($_REQUEST['email'], 'string', ''));
     @($code = trim(DevblocksPlatform::importGPC($_REQUEST['code'], 'string', '')));
     @($pass = DevblocksPlatform::importGPC($_REQUEST['pass'], 'string', ''));
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->assign('register_email', $email);
     $tpl->assign('register_code', $code);
     if (!empty($email) && !empty($pass) && !empty($code)) {
         if (null != ($addy = DAO_Address::lookupAddress($email, false)) && !$addy->is_registered && !empty($addy->pass) && 0 == strcasecmp($code, $addy->pass)) {
             $fields = array(DAO_Address::IS_REGISTERED => 1, DAO_Address::PASS => md5($pass));
             DAO_Address::update($addy->id, $fields);
         } else {
             $tpl->assign('register_error', sprintf("The confirmation code you entered does not match our records.  Try again."));
             DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('portal', UmPortalHelper::getCode(), 'register', 'confirm')));
             return;
         }
     } else {
         $tpl->assign('register_error', sprintf("You must enter a valid e-mail address, confirmation code and desired password to continue."));
         DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('portal', UmPortalHelper::getCode(), 'register', 'confirm')));
         return;
     }
 }
Exemple #5
0
 function saveOppPanelAction()
 {
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', ''));
     @($opp_id = DevblocksPlatform::importGPC($_REQUEST['opp_id'], 'integer', 0));
     @($name = DevblocksPlatform::importGPC($_REQUEST['name'], 'string', ''));
     @($status = DevblocksPlatform::importGPC($_REQUEST['status'], 'integer', 0));
     @($amount_dollars = DevblocksPlatform::importGPC($_REQUEST['amount'], 'string', '0'));
     @($amount_cents = DevblocksPlatform::importGPC($_REQUEST['amount_cents'], 'integer', 0));
     @($email_str = DevblocksPlatform::importGPC($_REQUEST['emails'], 'string', ''));
     @($worker_id = DevblocksPlatform::importGPC($_REQUEST['worker_id'], 'integer', 0));
     @($comment = DevblocksPlatform::importGPC($_REQUEST['comment'], 'string', ''));
     @($created_date_str = DevblocksPlatform::importGPC($_REQUEST['created_date'], 'string', ''));
     @($closed_date_str = DevblocksPlatform::importGPC($_REQUEST['closed_date'], 'string', ''));
     @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     // State
     $is_closed = 0 == $status ? 0 : 1;
     $is_won = 1 == $status ? 1 : 0;
     // Strip commas and decimals and put together the "dollars+cents"
     $amount = intval(str_replace(array(',', '.'), '', $amount_dollars)) . '.' . number_format($amount_cents, 0, '', '');
     // Dates
     if (false === ($created_date = strtotime($created_date_str))) {
         $created_date = time();
     }
     if (false === ($closed_date = strtotime($closed_date_str))) {
         $closed_date = $is_closed ? time() : 0;
     }
     if (!$is_closed) {
         $closed_date = 0;
     }
     // Worker
     $active_worker = CerberusApplication::getActiveWorker();
     // Save
     if ($do_delete) {
         if (null != ($opp = DAO_CrmOpportunity::get($opp_id))) {
             // Check privs
             if ($active_worker->hasPriv('crm.opp.actions.create') && $active_worker->id == $opp->worker_id || $active_worker->hasPriv('crm.opp.actions.update_nobody') && empty($opp->worker_id) || $active_worker->hasPriv('crm.opp.actions.update_all')) {
                 DAO_CrmOpportunity::delete($opp_id);
             }
         }
     } elseif (empty($opp_id)) {
         $emails = DevblocksPlatform::parseCsvString($email_str);
         // Check privs
         if (!$active_worker->hasPriv('crm.opp.actions.create')) {
             return;
         }
         // One opportunity per provided e-mail address
         if (is_array($emails)) {
             foreach ($emails as $email) {
                 if (null == ($address = DAO_Address::lookupAddress($email, true))) {
                     continue;
                 }
                 $fields = array(DAO_CrmOpportunity::NAME => $name, DAO_CrmOpportunity::AMOUNT => $amount, DAO_CrmOpportunity::PRIMARY_EMAIL_ID => $address->id, DAO_CrmOpportunity::CREATED_DATE => intval($created_date), DAO_CrmOpportunity::UPDATED_DATE => time(), DAO_CrmOpportunity::CLOSED_DATE => intval($closed_date), DAO_CrmOpportunity::IS_CLOSED => $is_closed, DAO_CrmOpportunity::IS_WON => $is_won, DAO_CrmOpportunity::WORKER_ID => $worker_id);
                 $opp_id = DAO_CrmOpportunity::create($fields);
                 // Custom fields
                 @($field_ids = DevblocksPlatform::importGPC($_REQUEST['field_ids'], 'array', array()));
                 DAO_CustomFieldValue::handleFormPost(CrmCustomFieldSource_Opportunity::ID, $opp_id, $field_ids);
                 // If we're adding a first comment
                 if (!empty($comment)) {
                     $fields = array(DAO_Note::CREATED => time(), DAO_Note::SOURCE_EXTENSION_ID => CrmNotesSource_Opportunity::ID, DAO_Note::SOURCE_ID => $opp_id, DAO_Note::CONTENT => $comment, DAO_Note::WORKER_ID => $active_worker->id);
                     $comment_id = DAO_Note::create($fields);
                 }
             }
         }
     } else {
         if (empty($opp_id)) {
             return;
         }
         $fields = array(DAO_CrmOpportunity::NAME => $name, DAO_CrmOpportunity::AMOUNT => $amount, DAO_CrmOpportunity::CREATED_DATE => intval($created_date), DAO_CrmOpportunity::UPDATED_DATE => time(), DAO_CrmOpportunity::CLOSED_DATE => intval($closed_date), DAO_CrmOpportunity::IS_CLOSED => $is_closed, DAO_CrmOpportunity::IS_WON => $is_won, DAO_CrmOpportunity::WORKER_ID => $worker_id);
         // Check privs
         if (null != ($opp = DAO_CrmOpportunity::get($opp_id)) && ($active_worker->hasPriv('crm.opp.actions.create') && $active_worker->id == $opp->worker_id || $active_worker->hasPriv('crm.opp.actions.update_nobody') && empty($opp->worker_id) || $active_worker->hasPriv('crm.opp.actions.update_all'))) {
             DAO_CrmOpportunity::update($opp_id, $fields);
             // Custom fields
             @($field_ids = DevblocksPlatform::importGPC($_REQUEST['field_ids'], 'array', array()));
             DAO_CustomFieldValue::handleFormPost(CrmCustomFieldSource_Opportunity::ID, $opp_id, $field_ids);
         }
     }
     // Reload view (if linked)
     if (!empty($view_id) && null != ($view = C4_AbstractViewLoader::getView('', $view_id))) {
         $view->render();
     }
     exit;
 }
Exemple #6
0
 /**
  * Looks up an e-mail address using a revolving cache.  This is helpful 
  * in situations where you may look up the same e-mail address multiple 
  * times (reports, audit log, views) and you don't want to waste code 
  * filtering out dupes.
  * 
  * @param string $address The e-mail address to look up
  * @param bool $create Should the address be created if not found?
  * @return Model_Address The address object or NULL 
  * 
  * @todo [JAS]: Move this to a global cache/hash registry
  */
 public static function hashLookupAddress($email, $create = false)
 {
     static $hash_address_to_id = array();
     static $hash_hits = array();
     static $hash_size = 0;
     if (isset($hash_address_to_id[$email])) {
         $return = $hash_address_to_id[$email];
         @($hash_hits[$email] = intval($hash_hits[$email]) + 1);
         $hash_size++;
         // [JAS]: if our hash grows past our limit, crop hits array + intersect keys
         if ($hash_size > 250) {
             arsort($hash_hits);
             $hash_hits = array_slice($hash_hits, 0, 100, true);
             $hash_address_to_id = array_intersect_key($hash_address_to_id, $hash_hits);
             $hash_size = count($hash_address_to_id);
         }
         return $return;
     }
     $address = DAO_Address::lookupAddress($email, $create);
     if (!empty($address)) {
         $hash_address_to_id[$email] = $address;
     }
     return $address;
 }
Exemple #7
0
 function saveEntryAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     // Make sure we're an active worker
     if (empty($active_worker) || empty($active_worker->id)) {
         return;
     }
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     @($email = DevblocksPlatform::importGPC($_POST['email'], 'string', ''));
     @($mood = DevblocksPlatform::importGPC($_POST['mood'], 'integer', 0));
     @($quote = DevblocksPlatform::importGPC($_POST['quote'], 'string', ''));
     @($url = DevblocksPlatform::importGPC($_POST['url'], 'string', ''));
     @($source_extension_id = DevblocksPlatform::importGPC($_POST['source_extension_id'], 'string', ''));
     @($source_id = DevblocksPlatform::importGPC($_POST['source_id'], 'integer', 0));
     // Translate email string into addy id, if exists
     $address_id = 0;
     if (!empty($email)) {
         if (null != ($author_address = DAO_Address::lookupAddress($email, true))) {
             $address_id = $author_address->id;
         }
     }
     // Delete entries
     if (!empty($id) && !empty($do_delete)) {
         if (null != ($entry = DAO_FeedbackEntry::get($id))) {
             // Only superusers and owners can delete entries
             if ($active_worker->is_superuser || $active_worker->id == $entry->worker_id) {
                 DAO_FeedbackEntry::delete($id);
             }
         }
         return;
     }
     // New or modify
     $fields = array(DAO_FeedbackEntry::QUOTE_MOOD => intval($mood), DAO_FeedbackEntry::QUOTE_TEXT => $quote, DAO_FeedbackEntry::QUOTE_ADDRESS_ID => intval($address_id), DAO_FeedbackEntry::SOURCE_URL => $url);
     // Only on new
     if (empty($id)) {
         $fields[DAO_FeedbackEntry::LOG_DATE] = time();
         $fields[DAO_FeedbackEntry::WORKER_ID] = $active_worker->id;
     }
     if (empty($id)) {
         // create
         $id = DAO_FeedbackEntry::create($fields);
         // Post-create actions
         if (!empty($source_extension_id) && !empty($source_id)) {
             switch ($source_extension_id) {
                 case 'feedback.source.ticket':
                     // Create a ticket comment about the feedback (to prevent dupes)
                     if (null == ($worker_address = DAO_Address::lookupAddress($active_worker->email))) {
                         break;
                     }
                     $comment_text = sprintf("== Capture Feedback ==\n" . "Author: %s\n" . "Mood: %s\n" . "\n" . "%s\n", !empty($author_address) ? $author_address->email : 'Anonymous', empty($mood) ? 'Neutral' : (1 == $mood ? 'Praise' : 'Criticism'), $quote);
                     $fields = array(DAO_TicketComment::ADDRESS_ID => $worker_address->id, DAO_TicketComment::COMMENT => $comment_text, DAO_TicketComment::CREATED => time(), DAO_TicketComment::TICKET_ID => intval($source_id));
                     DAO_TicketComment::create($fields);
                     break;
             }
         }
     } else {
         // modify
         DAO_FeedbackEntry::update($id, $fields);
     }
     // Custom field saves
     @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
     DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_FeedbackEntry::ID, $id, $field_ids);
 }
Exemple #8
0
 function saveOppPropertiesAction()
 {
     @($opp_id = DevblocksPlatform::importGPC($_REQUEST['opp_id'], 'integer', 0));
     @($email = DevblocksPlatform::importGPC($_REQUEST['email'], 'string', ''));
     @($name = DevblocksPlatform::importGPC($_REQUEST['name'], 'string', ''));
     @($status = DevblocksPlatform::importGPC($_REQUEST['status'], 'integer', 0));
     @($amount_dollars = DevblocksPlatform::importGPC($_REQUEST['amount'], 'string', '0'));
     @($amount_cents = DevblocksPlatform::importGPC($_REQUEST['amount_cents'], 'integer', 0));
     @($worker_id = DevblocksPlatform::importGPC($_REQUEST['worker_id'], 'integer', 0));
     @($created_date_str = DevblocksPlatform::importGPC($_REQUEST['created_date'], 'string', ''));
     @($closed_date_str = DevblocksPlatform::importGPC($_REQUEST['closed_date'], 'string', ''));
     // State
     $is_closed = 0 == $status ? 0 : 1;
     $is_won = 1 == $status ? 1 : 0;
     // Strip commas and decimals and put together the "dollars+cents"
     $amount = intval(str_replace(array(',', '.'), '', $amount_dollars)) . '.' . number_format($amount_cents, 0, '', '');
     // Dates
     if (false === ($created_date = strtotime($created_date_str))) {
         $created_date = time();
     }
     if (false === ($closed_date = strtotime($closed_date_str))) {
         $closed_date = $is_closed ? time() : 0;
     }
     if (!$is_closed) {
         $closed_date = 0;
     }
     if (!empty($opp_id)) {
         $fields = array(DAO_CrmOpportunity::NAME => $name, DAO_CrmOpportunity::AMOUNT => $amount, DAO_CrmOpportunity::CREATED_DATE => $created_date, DAO_CrmOpportunity::UPDATED_DATE => time(), DAO_CrmOpportunity::CLOSED_DATE => $closed_date, DAO_CrmOpportunity::IS_CLOSED => $is_closed, DAO_CrmOpportunity::IS_WON => $is_won, DAO_CrmOpportunity::WORKER_ID => $worker_id);
         // Email
         if (null != ($address = DAO_Address::lookupAddress($email, true))) {
             $fields[DAO_CrmOpportunity::PRIMARY_EMAIL_ID] = $address->id;
         }
         DAO_CrmOpportunity::update($opp_id, $fields);
         @($field_ids = DevblocksPlatform::importGPC($_REQUEST['field_ids'], 'array', array()));
         DAO_CustomFieldValue::handleFormPost(CrmCustomFieldSource_Opportunity::ID, $opp_id, $field_ids);
     }
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('crm', 'opp', $opp_id)));
 }
Exemple #9
0
 private function _sendConfirmation($email, $link)
 {
     $settings = CerberusSettings::getInstance();
     $from = $settings->get(CerberusSettings::DEFAULT_REPLY_FROM);
     $from_personal = $settings->get(CerberusSettings::DEFAULT_REPLY_PERSONAL);
     $url = DevblocksPlatform::getUrlService();
     try {
         $mail_service = DevblocksPlatform::getMailService();
         $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults());
         $code = CerberusApplication::generatePassword(8);
         if (!empty($email) && null != ($addy = DAO_Address::lookupAddress($email, false))) {
             $fields = array(DAO_AddressAuth::CONFIRM => $code);
             DAO_AddressAuth::update($addy->id, $fields);
         } else {
             return;
         }
         $message = $mail_service->createMessage();
         $message->setTo($email);
         $send_from = new Swift_Address($from, $from_personal);
         $message->setFrom($send_from);
         $message->setSubject("Account Confirmation Code");
         $message->setBody(sprintf("Below is your confirmation code.  Please copy and paste it into the confirmation form at:\r\n" . "%s\r\n" . "\r\n" . "Your confirmation code is: %s\r\n" . "\r\n" . "Thanks!\r\n", $link, $code));
         $message->headers->set('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')');
         $mailer->send($message, $email, $send_from);
     } catch (Exception $e) {
         return;
     }
 }
Exemple #10
0
 function doImportAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     if (!$active_worker->hasPriv('core.addybook.import')) {
         return;
     }
     @($pos = DevblocksPlatform::importGPC($_REQUEST['pos'], 'array', array()));
     @($field = DevblocksPlatform::importGPC($_REQUEST['field'], 'array', array()));
     @($sync_column = DevblocksPlatform::importGPC($_REQUEST['sync_column'], 'string', ''));
     @($include_first = DevblocksPlatform::importGPC($_REQUEST['include_first'], 'integer', 0));
     @($is_blank_unset = DevblocksPlatform::importGPC($_REQUEST['is_blank_unset'], 'integer', 0));
     @($replace_passwords = DevblocksPlatform::importGPC($_REQUEST['replace_passwords'], 'integer', 0));
     $visit = CerberusApplication::getVisit();
     $db = DevblocksPlatform::getDatabaseService();
     $csv_file = $visit->get('import.last.csv', '');
     $type = $visit->get('import.last.type', '');
     $fp = fopen($csv_file, "rt");
     if (!$fp) {
         return;
     }
     // [JAS]: Do we need to consume a first row of headings?
     if (!$include_first) {
         @fgetcsv($fp, 8192, ',', '"');
     }
     while (!feof($fp)) {
         $parts = fgetcsv($fp, 8192, ',', '"');
         if (empty($parts) || 1 == count($parts) && is_null($parts[0])) {
             continue;
         }
         $fields = array();
         $custom_fields = array();
         $sync_field = '';
         $sync_val = '';
         // Overrides
         $contact_password = '';
         if (is_array($pos)) {
             foreach ($pos as $idx => $p) {
                 $key = $field[$idx];
                 $val = $parts[$idx];
                 if (!empty($key)) {
                     // Organizations
                     if ($type == "orgs") {
                         switch ($key) {
                             // Multi-Line
                             case 'street':
                                 @($val = isset($fields[$key]) ? $fields[$key] . ', ' . $val : $val);
                                 break;
                                 // Dates
                             // Dates
                             case 'created':
                                 @($val = !is_numeric($val) ? strtotime($val) : $val);
                                 break;
                         }
                         // Custom fields
                         if ('cf_' == substr($key, 0, 3)) {
                             $custom_fields[substr($key, 3)] = $val;
                         } else {
                             $fields[$key] = $val;
                         }
                         // Addresses
                     } elseif ($type == "addys") {
                         switch ($key) {
                             // Org (from string into id)
                             case 'contact_org_id':
                                 if (null != ($org_id = DAO_ContactOrg::lookup($val, true))) {
                                     $val = $org_id;
                                 } else {
                                     $val = 0;
                                 }
                                 break;
                             case 'pass':
                                 $key = null;
                                 // Detect if we need to MD5 a plaintext password.
                                 if (preg_match("/[a-z0-9]{32}/", $val)) {
                                     $contact_password = $val;
                                 } else {
                                     $contact_password = md5($val);
                                 }
                                 break;
                         }
                         // Custom fields
                         if ('cf_' == substr($key, 0, 3)) {
                             $custom_fields[substr($key, 3)] = $val;
                         } elseif (!empty($key)) {
                             $fields[$key] = $val;
                         }
                     }
                     if (!empty($key)) {
                         // [JAS]: Are we looking for matches in a certain field?
                         if ($sync_column == $key && !empty($val)) {
                             $sync_field = $key;
                             $sync_val = $val;
                         }
                     }
                 }
             }
         }
         if (!empty($fields)) {
             if ($type == "orgs") {
                 @($orgs = DAO_ContactOrg::getWhere(!empty($sync_field) && !empty($sync_val) ? sprintf('%s = %s', $sync_field, $db->qstr($sync_val)) : sprintf('name = %s', $db->qstr($fields['name']))));
                 if (isset($fields['name'])) {
                     if (empty($orgs)) {
                         $id = DAO_ContactOrg::create($fields);
                     } else {
                         $id = key($orgs);
                         DAO_ContactOrg::update($id, $fields);
                     }
                 }
             } elseif ($type == "addys") {
                 if (!empty($sync_field) && !empty($sync_val)) {
                     @($addys = DAO_Address::getWhere(sprintf('%s = %s', $sync_field, $db->qstr($sync_val))));
                 }
                 if (isset($fields['email'])) {
                     // Overrides
                     if (!empty($contact_password)) {
                         if ($replace_passwords) {
                             // always replace
                             $fields[DAO_Address::IS_REGISTERED] = 1;
                             $fields[DAO_Address::PASS] = $contact_password;
                         } else {
                             // only replace if null
                             if (null == ($addy = DAO_Address::lookupAddress($fields['email'], false)) || !$addy->is_registered) {
                                 $fields[DAO_Address::IS_REGISTERED] = 1;
                                 $fields[DAO_Address::PASS] = $contact_password;
                             }
                         }
                     }
                     if (empty($addys)) {
                         $id = DAO_Address::create($fields);
                     } else {
                         $id = key($addys);
                         DAO_Address::update($id, $fields);
                     }
                 }
             }
         }
         if (!empty($custom_fields) && !empty($id)) {
             // Format (typecast) and set the custom field types
             $source_ext_id = $type == "orgs" ? ChCustomFieldSource_Org::ID : ChCustomFieldSource_Address::ID;
             DAO_CustomFieldValue::formatAndSetFieldValues($source_ext_id, $id, $custom_fields, $is_blank_unset);
         }
     }
     @unlink($csv_file);
     // nuke the imported file
     $visit->set('import.last.csv', null);
     $visit->set('import.last.type', null);
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('contacts', 'import')));
 }
Exemple #11
0
     $sales_spam_bid = DAO_Bucket::create('Spam', $sales_gid);
     DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_ACTION, '2');
     DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_ACTION_PARAM, $sales_spam_bid);
     DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_THRESHOLD, '85');
     // Default catchall
     DAO_Group::updateTeam($dispatch_gid, array(DAO_Group::IS_DEFAULT => 1));
 }
 // If this worker doesn't exist, create them
 if (null === ($lookup = DAO_Worker::lookupAgentEmail($worker_email))) {
     $worker_id = DAO_Worker::create($worker_email, $worker_pass, 'Super', 'User', 'Administrator');
     // Superuser bit
     $fields = array(DAO_Worker::IS_SUPERUSER => 1);
     DAO_Worker::updateAgent($worker_id, $fields);
     // Add the worker e-mail to the addresses table
     if (!empty($worker_email)) {
         DAO_Address::lookupAddress($worker_email, true);
     }
     // Authorize this e-mail address (watchers, etc.)
     DAO_AddressToWorker::assign($worker_email, $worker_id);
     DAO_AddressToWorker::update($worker_email, array(DAO_AddressToWorker::IS_CONFIRMED => 1));
     // Default group memberships
     if (!empty($dispatch_gid)) {
         DAO_Group::setTeamMember($dispatch_gid, $worker_id, true);
     }
     if (!empty($support_gid)) {
         DAO_Group::setTeamMember($support_gid, $worker_id, true);
     }
     if (!empty($sales_gid)) {
         DAO_Group::setTeamMember($sales_gid, $worker_id, true);
     }
 }
Exemple #12
0
 function saveDefaultsAction()
 {
     @($timezone = DevblocksPlatform::importGPC($_REQUEST['timezone'], 'string'));
     @($lang_code = DevblocksPlatform::importGPC($_REQUEST['lang_code'], 'string', 'en_US'));
     @($default_signature = DevblocksPlatform::importGPC($_REQUEST['default_signature'], 'string'));
     @($default_signature_pos = DevblocksPlatform::importGPC($_REQUEST['default_signature_pos'], 'integer', 0));
     @($reply_box_height = DevblocksPlatform::importGPC($_REQUEST['reply_box_height'], 'integer'));
     $worker = CerberusApplication::getActiveWorker();
     $translate = DevblocksPlatform::getTranslationService();
     $tpl = DevblocksPlatform::getTemplateService();
     $pref_errors = array();
     // Time
     $_SESSION['timezone'] = $timezone;
     @date_default_timezone_set($timezone);
     DAO_WorkerPref::set($worker->id, 'timezone', $timezone);
     // Language
     $_SESSION['locale'] = $lang_code;
     DevblocksPlatform::setLocale($lang_code);
     DAO_WorkerPref::set($worker->id, 'locale', $lang_code);
     @($new_password = DevblocksPlatform::importGPC($_REQUEST['change_pass'], 'string'));
     @($verify_password = DevblocksPlatform::importGPC($_REQUEST['change_pass_verify'], 'string'));
     //[mdf] if nonempty passwords match, update worker's password
     if ($new_password != "" && $new_password === $verify_password) {
         $session = DevblocksPlatform::getSessionService();
         $fields = array(DAO_Worker::PASSWORD => md5($new_password));
         DAO_Worker::updateAgent($worker->id, $fields);
     }
     @($assist_mode = DevblocksPlatform::importGPC($_REQUEST['assist_mode'], 'integer', 0));
     DAO_WorkerPref::set($worker->id, 'assist_mode', $assist_mode);
     @($keyboard_shortcuts = DevblocksPlatform::importGPC($_REQUEST['keyboard_shortcuts'], 'integer', 0));
     DAO_WorkerPref::set($worker->id, 'keyboard_shortcuts', $keyboard_shortcuts);
     @($mail_inline_comments = DevblocksPlatform::importGPC($_REQUEST['mail_inline_comments'], 'integer', 0));
     DAO_WorkerPref::set($worker->id, 'mail_inline_comments', $mail_inline_comments);
     @($mail_always_show_all = DevblocksPlatform::importGPC($_REQUEST['mail_always_show_all'], 'integer', 0));
     DAO_WorkerPref::set($worker->id, 'mail_always_show_all', $mail_always_show_all);
     // Alternate Email Addresses
     @($new_email = DevblocksPlatform::importGPC($_REQUEST['new_email'], 'string', ''));
     @($email_delete = DevblocksPlatform::importGPC($_REQUEST['email_delete'], 'array', array()));
     // Confirm deletions are assigned to the current worker
     if (!empty($email_delete)) {
         foreach ($email_delete as $e) {
             if (null != ($worker_address = DAO_AddressToWorker::getByAddress($e)) && $worker_address->worker_id == $worker->id) {
                 DAO_AddressToWorker::unassign($e);
             }
         }
     }
     // Assign a new e-mail address if it's legitimate
     if (!empty($new_email)) {
         if (null != ($addy = DAO_Address::lookupAddress($new_email, true))) {
             if (null == ($assigned = DAO_AddressToWorker::getByAddress($new_email))) {
                 $this->_sendConfirmationEmail($new_email, $worker);
             } else {
                 $pref_errors[] = vsprintf($translate->_('prefs.address.exists'), $new_email);
             }
         } else {
             $pref_errors[] = vsprintf($translate->_('prefs.address.invalid'), $new_email);
         }
     }
     $tpl->assign('pref_errors', $pref_errors);
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('preferences')));
 }
Exemple #13
0
 function logTicketAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     if (!$active_worker->hasPriv('core.mail.log_ticket')) {
         return;
     }
     @($to = DevblocksPlatform::importGPC($_POST['to'], 'string'));
     @($reqs = DevblocksPlatform::importGPC($_POST['reqs'], 'string'));
     @($subject = DevblocksPlatform::importGPC($_POST['subject'], 'string'));
     @($content = DevblocksPlatform::importGPC($_POST['content'], 'string'));
     @($send_to_requesters = DevblocksPlatform::importGPC($_POST['send_to_requesters'], 'integer', 0));
     @($closed = DevblocksPlatform::importGPC($_POST['closed'], 'integer', 0));
     @($move_bucket = DevblocksPlatform::importGPC($_POST['bucket_id'], 'string', ''));
     @($next_worker_id = DevblocksPlatform::importGPC($_POST['next_worker_id'], 'integer', 0));
     @($ticket_reopen = DevblocksPlatform::importGPC($_POST['ticket_reopen'], 'string', ''));
     @($unlock_date = DevblocksPlatform::importGPC($_POST['unlock_date'], 'string', ''));
     if (DEMO_MODE) {
         DevblocksPlatform::redirect(new DevblocksHttpResponse(array('tickets', 'create')));
         return;
     }
     // ********
     $message = new CerberusParserMessage();
     $message->headers['date'] = date('r');
     $message->headers['to'] = $to;
     $message->headers['subject'] = $subject;
     $message->headers['message-id'] = CerberusApplication::generateMessageId();
     //$message->headers['x-cerberus-portal'] = 1;
     // Sender
     $fromList = imap_rfc822_parse_adrlist(rtrim($reqs, ', '), '');
     if (empty($fromList) || !is_array($fromList)) {
         return;
         // abort with message
     }
     $from = array_shift($fromList);
     $from_address = $from->mailbox . '@' . $from->host;
     $message->headers['from'] = $from_address;
     $message->body = sprintf("(... This message was manually created by %s on behalf of the requesters ...)\r\n", $active_worker->getName());
     //		// Custom Fields
     //
     //		if(!empty($aFieldIds))
     //		foreach($aFieldIds as $iIdx => $iFieldId) {
     //			if(!empty($iFieldId)) {
     //				$field =& $fields[$iFieldId]; /* @var $field Model_CustomField */
     //				$value = "";
     //
     //				switch($field->type) {
     //					case Model_CustomField::TYPE_SINGLE_LINE:
     //					case Model_CustomField::TYPE_MULTI_LINE:
     //					case Model_CustomField::TYPE_URL:
     //						@$value = trim($aFollowUpA[$iIdx]);
     //						break;
     //
     //					case Model_CustomField::TYPE_NUMBER:
     //						@$value = $aFollowUpA[$iIdx];
     //						if(!is_numeric($value) || 0 == strlen($value))
     //							$value = null;
     //						break;
     //
     //					case Model_CustomField::TYPE_DATE:
     //						if(false !== ($time = strtotime($aFollowUpA[$iIdx])))
     //							@$value = intval($time);
     //						break;
     //
     //					case Model_CustomField::TYPE_DROPDOWN:
     //						@$value = $aFollowUpA[$iIdx];
     //						break;
     //
     //					case Model_CustomField::TYPE_MULTI_PICKLIST:
     //						@$value = DevblocksPlatform::importGPC($_POST['followup_a_'.$iIdx],'array',array());
     //						break;
     //
     //					case Model_CustomField::TYPE_CHECKBOX:
     //						@$value = (isset($aFollowUpA[$iIdx]) && !empty($aFollowUpA[$iIdx])) ? 1 : 0;
     //						break;
     //
     //					case Model_CustomField::TYPE_MULTI_CHECKBOX:
     //						@$value = DevblocksPlatform::importGPC($_POST['followup_a_'.$iIdx],'array',array());
     //						break;
     //
     //					case Model_CustomField::TYPE_WORKER:
     //						@$value = DevblocksPlatform::importGPC($_POST['followup_a_'.$iIdx],'integer',0);
     //						break;
     //				}
     //
     //				if((is_array($value) && !empty($value))
     //					|| (!is_array($value) && 0 != strlen($value)))
     //						$message->custom_fields[$iFieldId] = $value;
     //			}
     //		}
     // Parse
     $ticket_id = CerberusParser::parseMessage($message);
     $ticket = DAO_Ticket::getTicket($ticket_id);
     // Add additional requesters to ticket
     if (is_array($fromList) && !empty($fromList)) {
         foreach ($fromList as $requester) {
             if (empty($requester)) {
                 continue;
             }
             $host = empty($requester->host) ? 'localhost' : $requester->host;
             $requester_addy = DAO_Address::lookupAddress($requester->mailbox . '@' . $host, true);
             DAO_Ticket::createRequester($requester_addy->id, $ticket_id);
         }
     }
     // Worker reply
     $properties = array('message_id' => $ticket->first_message_id, 'ticket_id' => $ticket_id, 'subject' => $subject, 'content' => $content, 'files' => @$_FILES['attachment'], 'next_worker_id' => $next_worker_id, 'closed' => $closed, 'bucket_id' => $move_bucket, 'ticket_reopen' => $ticket_reopen, 'unlock_date' => $unlock_date, 'agent_id' => $active_worker->id, 'dont_send' => false == $send_to_requesters);
     CerberusMail::sendTicketMessage($properties);
     // ********
     //		if(empty($to) || empty($team_id)) {
     //			DevblocksPlatform::redirect(new DevblocksHttpResponse(array('tickets','create')));
     //			return;
     //		}
     $visit = CerberusApplication::getVisit();
     /* @var CerberusVisit $visit */
     $visit->set('compose.last_ticket', $ticket->mask);
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('tickets', 'create')));
 }
Exemple #14
0
 function saveEntryAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     // Make sure we're an active worker
     if (empty($active_worker) || empty($active_worker->id)) {
         return;
     }
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     @($activity_id = DevblocksPlatform::importGPC($_POST['activity_id'], 'integer', 0));
     @($time_actual_mins = DevblocksPlatform::importGPC($_POST['time_actual_mins'], 'integer', 0));
     @($notes = DevblocksPlatform::importGPC($_POST['notes'], 'string', ''));
     @($org_str = DevblocksPlatform::importGPC($_POST['org'], 'string', ''));
     @($source_extension_id = DevblocksPlatform::importGPC($_POST['source_extension_id'], 'string', ''));
     @($source_id = DevblocksPlatform::importGPC($_POST['source_id'], 'integer', 0));
     // Translate org string into org id, if exists
     $org_id = 0;
     if (!empty($org_str)) {
         $org_id = DAO_ContactOrg::lookup($org_str, true);
     }
     // Delete entries
     if (!empty($id) && !empty($do_delete)) {
         if (null != ($entry = DAO_TimeTrackingEntry::get($id))) {
             // Check privs
             if ($active_worker->hasPriv('timetracking.actions.create') && $active_worker->id == $entry->worker_id || $active_worker->hasPriv('timetracking.actions.update_all')) {
                 DAO_TimeTrackingEntry::delete($id);
             }
         }
         return;
     }
     // New or modify
     $fields = array(DAO_TimeTrackingEntry::ACTIVITY_ID => intval($activity_id), DAO_TimeTrackingEntry::TIME_ACTUAL_MINS => intval($time_actual_mins), DAO_TimeTrackingEntry::NOTES => $notes, DAO_TimeTrackingEntry::DEBIT_ORG_ID => intval($org_id));
     // Only on new
     if (empty($id)) {
         $fields[DAO_TimeTrackingEntry::LOG_DATE] = time();
         $fields[DAO_TimeTrackingEntry::SOURCE_EXTENSION_ID] = $source_extension_id;
         $fields[DAO_TimeTrackingEntry::SOURCE_ID] = intval($source_id);
         $fields[DAO_TimeTrackingEntry::WORKER_ID] = intval($active_worker->id);
     }
     if (empty($id)) {
         // create
         $id = DAO_TimeTrackingEntry::create($fields);
         // Procedurally create a comment
         $translate = DevblocksPlatform::getTranslationService();
         switch ($source_extension_id) {
             // If ticket, add a comment about the timeslip to the ticket
             case 'timetracking.source.ticket':
                 $ticket_id = intval($source_id);
                 if (null != ($worker_address = DAO_Address::lookupAddress($active_worker->email, false))) {
                     if (!empty($activity_id)) {
                         $activity = DAO_TimeTrackingActivity::get($activity_id);
                     }
                     if (!empty($org_id)) {
                         $org = DAO_ContactOrg::get($org_id);
                     }
                     $comment = sprintf("== %s ==\n" . "%s %s\n" . "%s %d\n" . "%s %s (%s)\n" . "%s %s\n" . "%s %s\n", $translate->_('timetracking.ui.timetracking'), $translate->_('timetracking.ui.worker'), $active_worker->getName(), $translate->_('timetracking.ui.comment.time_spent'), $time_actual_mins, $translate->_('timetracking.ui.comment.activity'), !empty($activity) ? $activity->name : '', !empty($activity) && $activity->rate > 0.0 ? $translate->_('timetracking.ui.billable') : $translate->_('timetracking.ui.non_billable'), $translate->_('timetracking.ui.comment.organization'), !empty($org) ? $org->name : $translate->_('timetracking.ui.comment.not_set'), $translate->_('timetracking.ui.comment.notes'), $notes);
                     //timetracking.ui.billable timetracking.ui.non_billable
                     $fields = array(DAO_TicketComment::ADDRESS_ID => intval($worker_address->id), DAO_TicketComment::COMMENT => $comment, DAO_TicketComment::CREATED => time(), DAO_TicketComment::TICKET_ID => intval($ticket_id));
                     DAO_TicketComment::create($fields);
                 }
                 break;
         }
     } else {
         // modify
         DAO_TimeTrackingEntry::update($id, $fields);
     }
     // Custom field saves
     @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
     DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_TimeEntry::ID, $id, $field_ids);
 }
Exemple #15
0
 function doLogin()
 {
     $umsession = UmPortalHelper::getSession();
     //		if(!$this->allow_logins)
     //			die();
     @($email = DevblocksPlatform::importGPC($_REQUEST['email']));
     @($pass = DevblocksPlatform::importGPC($_REQUEST['pass']));
     $valid = false;
     // [TODO] Test login combination using the appropriate adapter
     if (null != ($addy = DAO_Address::lookupAddress($email, false))) {
         $auth = DAO_AddressAuth::get($addy->id);
         if (!empty($auth->pass) && md5($pass) == $auth->pass) {
             $valid = true;
             $umsession->setProperty('sc_login', $addy);
         }
     }
     if (!$valid) {
         $umsession->setProperty('sc_login', null);
     }
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('portal', UmPortalHelper::getCode())));
 }