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'))); }
/** * 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; }
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; }
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; } }
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; }
/** * 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; }
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); }
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))); }
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; } }
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'))); }
$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); } }
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'))); }
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'))); }
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); }
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()))); }