<?xml version="1.0"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
		<channel><title>[Cerberus Helpdesk - Support Center] Recently Added Articles</title><link>http://www.cerberusweb.com/support/rss/kb/new_articles</link><description></description><item><title>How do I pay my invoice for our On Demand service?</title><description>&lt;h1&gt;Payment information for On Demand invoices&lt;/h1&gt;

&lt;p&gt;Currently we are using &lt;a href="https://webgroupmedia.freshbooks.com/refer/www" title="Freshbooks URL"&gt;&lt;strong&gt;Freshbooks&lt;/strong&gt;&lt;/a&gt; for our billing purposes.  You may log in to the billing site using the following URL:   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://webgroupmedia.freshbooks.com" title="Cerb5 Freshbooks URL"&gt;https://webgroupmedia.freshbooks.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While logged into the billing site, you can select to pay the invoice online by using either Paypal or a credit card.  If you choose to pay with a credit card, you can also select that same card to be used to pay your invoice every month as well.&lt;/p&gt;

&lt;h2&gt;I used to have recurring billing already set with you guys, what happened?&lt;/h2&gt;

&lt;p&gt;Over the past year, we transitioned from using &lt;a href="http://ubersmith.com" title="Ubersmith URL"&gt;Ubersmith&lt;/a&gt; to Freshbooks.  That meant we couldn't transfer any existing recurring payments over because we do not host the billing sites ourselves, nor would you probably want your credit card information being transferred via a database dump either.  We apologize for any inconvenience this has caused. &lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/97</link><pubDate>Fri, 30 Mar 2012 22:52:43 GMT</pubDate><guid isPermaLink="false">770418e4d4a80cc5426309bdb78500be</guid></item><item><title>Switching to the new Subversion repository hosted by GitHub</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;For many years, we used &lt;a href="http://en.wikipedia.org/wiki/Apache_Subversion"&gt;Subversion&lt;/a&gt; for distributing project updates.  If you installed Cerb5 from the ZIP download on our website at any point between 4.0 and 5.6 then your installation is probably pointing at our Subversion repository.&lt;/p&gt;

&lt;p&gt;In March 2009, we switched the official project to &lt;a href="http://en.wikipedia.org/wiki/Git_(software)"&gt;Git&lt;/a&gt; and migrated to &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt; to make it even easier to share our source code and collaborate with other developers in the community.  GitHub provides services like source code browsing, history, reporting, code reviews, issue tracking, wikis, and more.  Despite the benefits of Git and GitHub, this decision also required us to go through several extra steps to keep our Subversion files synchronized with the main project.  Not only was that merging process a hassle, but it also created a new place where bugs and other problems could be introduced.&lt;/p&gt;

&lt;p&gt;In January 2012 we finally felt confident that the time had come to discontinue our Subversion repository.  The major supporting factor in this decision is that GitHub also still provides access to our files through existing Subversion tools.&lt;/p&gt;

&lt;p&gt;To continue upgrading your Cerb5 installation using version control, you will need to make a decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We highly recommend that you switch to Git.  If you're willing to do this, &lt;a href="http://cerberusweb.com/support/kb/article/71-Switching_a_Cerb5_installation_from_Subversion_to_Git"&gt;follow these instructions instead&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternatively, you can continue to use Subversion but you will need to switch your installation from pointing to our old Subversion repository to the new one on GitHub.  The rest of this article will explain how to do this.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Switching to the new Subversion repository&lt;/h1&gt;

&lt;p&gt;Normally when a Subversion repository changes hosts you can simply use the &lt;code&gt;svn switch --relocate&lt;/code&gt; command and then proceed as usual.  However, this requires that the repository history is exactly the same on both hosts up to the point when it moved.  GitHub provides access to our files through Subversion, even when we're using Git ourselves, but it does this in a way that is incompatible with our original repository.  For this reason, there isn't a simple command you can issue to update your existing Subversion meta information.&lt;/p&gt;

&lt;p&gt;Here's what you should do instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make a &lt;a href="http://cerberusweb.com/book/#backups"&gt;current backup&lt;/a&gt; of your database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move your existing &lt;code&gt;cerb5/&lt;/code&gt; directory to somewhere else (for example, &lt;code&gt;cerb5_old/&lt;/code&gt;).  This directory might be named something else, like &lt;em&gt;support/&lt;/em&gt; or &lt;em&gt;helpdesk/&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Checkout the latest stable project files from GitHub using Subversion:&lt;br&gt;
&lt;code&gt;svn checkout https://github.com/wgm/cerb5/branches/stable cerb5&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy or move the contents of your existing &lt;code&gt;cerb5_old/storage/*&lt;/code&gt; directory to &lt;code&gt;cerb5/storage/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manually copy the settings from your existing &lt;code&gt;framework.config.php&lt;/code&gt; file to the new one.   The most important settings are the ones at the top that start with &lt;code&gt;APP_DB_*&lt;/code&gt;.  You'll also want to make sure you copy &lt;code&gt;LANG_CHARSET_CODE&lt;/code&gt; and &lt;code&gt;DB_CHARSET_CODE&lt;/code&gt; so your encoding is set properly.  You &lt;strong&gt;should not&lt;/strong&gt; just overwrite the new &lt;code&gt;framework.config.php&lt;/code&gt; file with the old one because the format of this file can change between releases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete the &lt;code&gt;cerb5/install/&lt;/code&gt; directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure your webserver has recursive write access to the new &lt;code&gt;cerb5/storage/&lt;/code&gt; directory and read access to everything else.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you had originally installed Cerb5 in a directory other than &lt;code&gt;cerb5/&lt;/code&gt; (like &lt;em&gt;helpdesk/&lt;/em&gt;) then you can move it back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visit your helpdesk in a web browser.  This should redirect you to the &lt;code&gt;/update&lt;/code&gt; page to migrate your database to the new version (if it doesn't you can type in this URL manually).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should be all set.  In the future you only need to run the command &lt;code&gt;svn update&lt;/code&gt; in your &lt;code&gt;cerb5&lt;/code&gt; directory to upgrade to the latest stable version.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/90</link><pubDate>Thu, 19 Jan 2012 10:38:52 GMT</pubDate><guid isPermaLink="false">129deda3d653255dae427d5ceabd6f5d</guid></item><item><title>Installing and configuring the Twilio plugin</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Twilio is a cloud-based service that provides applications with the ability to send and receive SMS messages and voice calls.  Twilio has two major strengths compared to other SMS gateways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TwiML API:&lt;/strong&gt; The Twilio Markup Language (TwiML) provides a simple yet powerful way to automate the behavior of receiving an SMS message or a scripted phone call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price:&lt;/strong&gt; You can send and receive SMS messages for 1&#xA2; each.  A dedicated phone number is $1/month.  With costs this low you can dedicate a phone number to each application.  The pricing is pay-as-you-go.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We've created a plugin that acts as a "bridge" for Twilio.com services; meaning, you can set your account information in one place and other plugins can take advantage of it.  The plugin will automatically add a 'Send SMS via Twilio' action to Virtual Attendants.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Installing the Twilio plugin&lt;/h2&gt;

&lt;p&gt;If you've already enabled an SMS plugin you can skip ahead to the &lt;em&gt;Configuring a Virtual Attendant reminder macro&lt;/em&gt; section.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Setup&lt;/strong&gt; to the right of the top navigation menu.&lt;/li&gt;
&lt;li&gt;Hover over the &lt;strong&gt;Plugins&lt;/strong&gt; menu and select &lt;strong&gt;Manage Plugins&lt;/strong&gt;.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/common/setup_plugins_manage.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Plugin Library&lt;/strong&gt; tab and click on the &lt;strong&gt;Check for updates&lt;/strong&gt; button to make sure you have the latest plugin information.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/common/setup_plugins_tab.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;em&gt;"sms"&lt;/em&gt; into the &lt;strong&gt;Quick Search&lt;/strong&gt; text box and press &lt;code&gt;ENTER&lt;/code&gt;.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/setup_plugins_search.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Download and install&lt;/strong&gt; button on the &lt;strong&gt;[WGM] Twilio.com Integration&lt;/strong&gt; plugin.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/setup_plugins_worklist.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Once again, click the &lt;strong&gt;Download and install&lt;/strong&gt; button on the popup to confirm.&lt;/li&gt;
&lt;li&gt;A configuration popup will be displayed when the plugin has been installed.  Make sure that &lt;em&gt;Status&lt;/em&gt; is set to &lt;strong&gt;Enabled&lt;/strong&gt; and then click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/setup_plugins_worklist_install.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Signing up for Twilio&lt;/h2&gt;

&lt;p&gt;In order to use one of the SMS plugins you will need to have an account with a mobile messaging provider.  We like Twilio because their costs are very reasonable (as of January 15th 2012 in USD: 1&#xA2; per text message and $1/month per phone number), and there is no minimum commitment or contract.  They also currently provide $30 in free credit to new accounts.&lt;/p&gt;

&lt;p&gt;To sign up for Twilio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit &lt;a href="http://www.twilio.com/"&gt;http://www.twilio.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;Try Twilio Free&lt;/strong&gt; button on the middle of the home page.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/twilio_signup.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;After you finish signing up and log in for the first time, you should see your new API credentials at the top of the Dashboard page.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/twilio_api_auth.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Configuring the Twilio plugin&lt;/h2&gt;

&lt;p&gt;You need to configure the Twilio plugin with your API credentials in order to send text messages to mobile phones from Cerb5.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the &lt;strong&gt;Setup&lt;/strong&gt; link on the right of the top navigation menu.&lt;/li&gt;
&lt;li&gt;Hover over the &lt;strong&gt;Plugins&lt;/strong&gt; menu and select &lt;strong&gt;Twilio&lt;/strong&gt;.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/setup_plugins_menu_twilio.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Enter your Twilio API credentials from their dashboard.  You can also select a &lt;em&gt;Default Caller ID&lt;/em&gt; number to use if you've configured any phone numbers.  You can verify an existing phone number to use for Caller ID (without porting it) from the &lt;em&gt;Numbers&lt;/em&gt; page at Twilio.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/89/setup_plugins_menu_twilio_config.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Related Resources&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cerberusweb.com/support/kb/article/88-Sending_scheduled_reminders_to_your_mobile_phone_using_Virtual_Attendants_and_Twilio"&gt;Sending scheduled reminders to your mobile phone using Virtual Attendants and Twilio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cerberusweb.com/support/kb/article/58-Relaying_notifications_to_your_mobile_phone_with_Twilio"&gt;Relaying notifications to your mobile phone with Twilio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/89</link><pubDate>Wed, 25 Jan 2012 07:41:41 GMT</pubDate><guid isPermaLink="false">33780eaf3f9e387131cea72430aaac22</guid></item><item><title>Sending scheduled reminders to your mobile phone using Virtual Attendants and Twilio</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;There are countless ways to remind yourself to do something: you can leave Post-It notes somewhere you'll see them (e.g. the mirror, front door, steering wheel, computer monitor), schedule a reminder on your mobile phone, etc.  One of the main advantages of using Virtual Attendants for reminders is that they can adapt to any kind of situation.&lt;/p&gt;

&lt;p&gt;Cerb5's notification system keeps you informed about the various conversations and tasks that you're involved with, but there are times when you need a more interruptive reminder when you're away from the desk or office.  Since your mobile phone is usually with you, you can instruct your Virtual Attendant to send you a friendly reminder by text message.&lt;/p&gt;

&lt;p&gt;If you set a reminder on your mobile phone from the built-in functionality, it will interrupt whatever you're doing whether or not you've managed to finish your task before the deadline.  Your Virtual Attendant can be aware of the status of a conversation or task, and you can instruct it to not remind you when the deadline arrives and you've already acted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The technique described in this article requires version 5.7 or later.&lt;/p&gt;

&lt;h1&gt;Implementation&lt;/h1&gt;

&lt;p&gt;First, in order to send text messages to mobile phones we will need to enable one of Cerb5's SMS gateway plugins.  Plugins currently exist for &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt; and &lt;a href="http://www.clickatell.com/"&gt;Clickatell&lt;/a&gt;.  We make a lot of use of Twilio at WebGroup Media, although their coverage is primarily limited to the United States and Canada right now.  Clickatell can reach an international audience for a slightly higher per-message cost.&lt;/p&gt;

&lt;h2&gt;Installing the Twilio plugin&lt;/h2&gt;

&lt;p&gt;Throughout this article we will assume the use of Twilio, but the process will be the same when using any provider.  The &lt;a href="https://github.com/cerb5-plugins/wgm.twilio"&gt;source code&lt;/a&gt; for these plugins can be used as a reference when adding support for a different mobile messaging provider.&lt;/p&gt;

&lt;p&gt;To install the Twilio plugin, follow &lt;a href="http://www.cerberusweb.com/support/kb/article/89-Using_the_Twilio_plugin"&gt;these instructions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Configuring a Virtual Attendant reminder macro&lt;/h2&gt;

&lt;p&gt;Now that the Twilio plugin is installed and configured, you can send text messages from inside Cerb5.  This functionality is especially useful when combined with Virtual Attendants because you have full control over the content that is sent to your mobile phone, as well as under what conditions.&lt;/p&gt;

&lt;p&gt;To complete this example, we want to create a macro that sends us a reminder message at a specific time.  We will be creating a ticket macro, but the process is identical for any kind of macro.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on your name in the top right and select &lt;strong&gt;Virtual Attendant&lt;/strong&gt; from the menu.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/worker_menu_va.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;Create Behavior&lt;/strong&gt; button.  Create the new behavior with the following information:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Title:&lt;/strong&gt; Remind me via SMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event:&lt;/strong&gt; Custom ticket behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Enabled&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;public&lt;/strong&gt; variable named &lt;strong&gt;Message&lt;/strong&gt; of type &lt;strong&gt;Text&lt;/strong&gt;.  This will be used to specify the custom message you want sent to your mobile phone at a specific time.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/new_behavior.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that we've created the new macro, the last step is to add an action that sends an SMS to our mobile phone.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the &lt;strong&gt;Custom ticket behavior&lt;/strong&gt; bubble in the &lt;strong&gt;Remind me via SMS&lt;/strong&gt; behavior and select &lt;strong&gt;Add Actions&lt;/strong&gt; from the menu.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/new_behavior_add_actions.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Set the &lt;em&gt;Title&lt;/em&gt; to &lt;strong&gt;Send SMS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Add Action&lt;/em&gt; section, select &lt;strong&gt;Send SMS via Twilio&lt;/strong&gt; from the dropmenu list.&lt;/li&gt;
&lt;li&gt;Add your mobile phone number to the &lt;em&gt;Phone:&lt;/em&gt; field.  Twilio is pretty flexible with how you specify your number, but you should format it with a plus, the country code, area code, prefix, and line number.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;Content&lt;/em&gt; field contains the message that you want to send.  Since we want to include a custom reminder each time we use this macro we're going to specify the &lt;em&gt;Message&lt;/em&gt; behavior variable we created earlier.  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add the following snippet template to the &lt;em&gt;Content&lt;/em&gt; field:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{% set msg = "#" ~ ticket_mask ~ ": " ~ var_message %}
{{msg|truncate(155)}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The snippet template uses some advanced features, so let's explore what it's doing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When we use &lt;code&gt;{% ... %}&lt;/code&gt; rather than &lt;code&gt;{{ ... }}&lt;/code&gt; in a snippet, we're using a command instead of displaying a placeholder.  In this case we're using &lt;code&gt;set&lt;/code&gt; to create a dynamic variable called &lt;code&gt;msg&lt;/code&gt;.  This will hold our final message text.&lt;/li&gt;
&lt;li&gt;Text can be concatenated (appended to each other) in a snippet by using the &lt;code&gt;~&lt;/code&gt; (tilde) operator.  We're using this to automatically prefix a ticket mask to our reminder.  We then append the value of &lt;code&gt;var_message&lt;/code&gt; which is our reminder message.&lt;/li&gt;
&lt;li&gt;On the second line, we're outputting the text from the &lt;code&gt;msg&lt;/code&gt; variable (a ticket mask and reminder message).  We're also including a &lt;code&gt;|truncate(155)&lt;/code&gt; modifier to ensure that the message we're sending our mobile phone won't be longer than 155 characters.   This is an optional step, as many mobile phones and mobile service providers are now capable of delivering messages longer than the original limit of 140-160 characters.  We're including this step for completeness, but you can change the second line to &lt;code&gt;{{msg}}&lt;/code&gt; and test with a longer message to see if this step is necessary in your environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/new_actions.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;Once you're satisfied with the snippet template, click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Our macro is now complete!&lt;/p&gt;

&lt;h2&gt;Using the macro to schedule reminders by SMS&lt;/h2&gt;

&lt;p&gt;You now have the incredibly useful ability to instruct your Virtual Attendant to send SMS reminders to your mobile phone.&lt;/p&gt;

&lt;p&gt;Here's how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click into any ticket.&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;Virtual Attendant&lt;/strong&gt; button and select &lt;strong&gt;Remind me via SMS&lt;/strong&gt; from the menu.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/macro_use_button.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;In the schedule behavior popup, enter the time that you want to be reminded, and the reminder message.&lt;br&gt;
&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/88/macro_use_popup.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;OK&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!  At the scheduled time your mobile phone will receive a text message with the ticket mask and your reminder.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/88</link><pubDate>Sun, 15 Jan 2012 23:06:21 GMT</pubDate><guid isPermaLink="false">a28c5fbb231189668c828154e38fb5d2</guid></item><item><title>Creating an automated dispatcher using Virtual Attendants</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;This article assumes that you have read &lt;em&gt;&lt;a href="http://cerberusweb.com/support/kb/article/85-The_benefits_and_drawbacks_of_self-assignment_vs._dispatching"&gt;The Benefits and Drawbacks of Self-Assignment vs. Dispatching&lt;/a&gt;&lt;/em&gt;, and you've decided that the dispatcher methodology is the best fit for your group.&lt;/p&gt;

&lt;p&gt;In this article we will build an automated dispatcher using Virtual Attendants functionality.  &lt;strong&gt;For this to work you need to be using version 5.7 or later.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Implementation&lt;/h1&gt;

&lt;p&gt;First, navigate to the appropriate group configuration page.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;Groups&lt;/strong&gt; in the top right.&lt;/li&gt;
&lt;li&gt;Click on the name of the group where you want to set up an automated dispatcher.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Virtual Attendant&lt;/strong&gt; tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We want to create a new behavior that will pick an assignee for new conversations in this group.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Create Behavior&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/create_behavior_button.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;New Behavior&lt;/strong&gt; popup, set the following:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Title:&lt;/strong&gt; Automated Dispatcher&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event:&lt;/strong&gt; New message on a group conversation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Enabled &lt;/li&gt;
&lt;li&gt;Click the green plus (+) button to add a new behavior variable.  It should be &lt;strong&gt;private&lt;/strong&gt;.  Call it &lt;strong&gt;Assignee&lt;/strong&gt; and select the type &lt;strong&gt;Worker&lt;/strong&gt; from the dropdown.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_behavior.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that we have a new behavior, we want to extend it to only be concerned with &lt;em&gt;assignable&lt;/em&gt; conversations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the &lt;strong&gt;New message on a group conversation&lt;/strong&gt; bubble under the new &lt;strong&gt;Automated Dispatcher&lt;/strong&gt; behavior and   select &lt;strong&gt;Add Decision&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Is this conversation assignable?&lt;/strong&gt;&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_decision_assignable.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the purposes of this example we'll consider a conversation to be assignable if it's new and not from a worker.  You could also assign conversations that have new replies -- in such a case you would likely consider a conversation to be assignable if it was currently unassigned.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;Is this a new conversation&lt;/strong&gt; decision bubble and select &lt;strong&gt;Add Outcome&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Yes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you want the dispatcher to only assign new conversations, and not replies, then click on the &lt;strong&gt;Add Condition&lt;/strong&gt; button and select the &lt;strong&gt;Message is first in conversation&lt;/strong&gt; condition from the list.  Make sure it is set to &lt;strong&gt;true&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;If you want the dispatcher to only assign conversations that come from customers instead of workers, click on the &lt;strong&gt;Add Condition&lt;/strong&gt; button again and select the &lt;strong&gt;Message sender is a worker&lt;/strong&gt; condition from the list.  Make sure it is set to &lt;strong&gt;false&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_outcome_assignable_yes.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we want to decide which shift should be responsible for replying to this conversation based on the day of the week and time of day.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;Yes&lt;/strong&gt; outcome bubble and select &lt;strong&gt;Add Decision&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;What shift is it?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How shifts are defined will depend on your particular environment.  For this example we'll be creating three shifts: Day, Night, and Weekend.  If you're not concerned about shifts then you can simply create a single catch-all outcome here with no conditions (like the &lt;em&gt;Day&lt;/em&gt; shift in the following example).  You can have more or fewer shifts by emulating the following steps as needed.  In practice, your worker schedules may be a lot more complicated than the shifts used in this example.  You can modify this Virtual Attendant behavior to model your exact needs.&lt;/p&gt;

&lt;p&gt;In the near future we plan to integrate more comprehensive scheduling functionality into Virtual Attendants behavior.  This will allow you to react more appropriately to sick days, vacations, holidays, part-time workers, etc.&lt;/p&gt;

&lt;p&gt;First, let's add a new outcome for the Weekend shift:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;What shift is it?&lt;/strong&gt; decision bubble and select &lt;strong&gt;Add Outcome&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Weekend&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Add Condition&lt;/strong&gt; button and select the &lt;strong&gt;Day of week&lt;/strong&gt; condition from the list.  Make sure the selection dropdown is set to &lt;strong&gt;is&lt;/strong&gt; and then check the boxes for the Saturday and Sunday.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_outcome_weekend_shift.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Similarly, we want to create the Night shift outcome:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;What shift is it?&lt;/strong&gt; decision bubble and select &lt;strong&gt;Add Outcome&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Night&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Add Condition&lt;/strong&gt; button and select the &lt;strong&gt;Day of week&lt;/strong&gt; condition from the list.  Make sure the selection dropdown is set to &lt;strong&gt;is&lt;/strong&gt; and then check the five boxes for the weekdays Monday through Friday.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Add Condition&lt;/strong&gt; button and select the &lt;strong&gt;Time of day&lt;/strong&gt; condition from the list.  Make sure the selection dropdown is set to &lt;strong&gt;is not between&lt;/strong&gt; and enter the times &lt;strong&gt;8am&lt;/strong&gt; and &lt;strong&gt;6pm&lt;/strong&gt;.  You can modify these times to match your own daytime shift.  Everything outside of this range will be considered part of the night shift.  We're using &lt;em&gt;is not between&lt;/em&gt; so we can define a single range instead of having to define two ranges for "before daytime" and "after daytime".&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_outcome_night_shift.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally, we'll create the Day shift outcome as the catchall.  In other words, if it's not the Night or Weekend shift then we'll default to the Day shift as the outcome.  Using a catchall is a useful pattern in Virtual Attendants because you can guarantee that there will always be an outcome for every decision.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;What shift is it?&lt;/strong&gt; decision bubble and select &lt;strong&gt;Add Outcome&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Day&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Because this is our default outcome we don't need to specify any conditions.  If none of the previous outcomes are selected then we'll always default to this one.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_outcome_day_shift.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that our shifts are defined as outcomes, we want to instruct the automated dispatcher about the available workers for each shift.  In each outcome we'll be setting the value of the &lt;strong&gt;Assignee&lt;/strong&gt; behavior variable that we defined earlier.  Each shift will have a pre-defined list of available workers.&lt;/p&gt;

&lt;p&gt;There are several strategies available for selecting one of your available workers to be the assignee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Random distribution&lt;/strong&gt;: A worker is selected at random.  Over a long period of time, random distributions should be roughly uniform and each worker will have been selected approximately the same number of times.  This is a good choice when you want to simulate "casting lots" or "drawing straws" -- for example, if you have to nominate one unlucky worker from the group to work on a critical issue at 4am.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round robin sequence&lt;/strong&gt;: Each worker will be selected in order and the sequence will repeat itself infinitely.  This simulates "taking turns".  This will guarantee that each worker receives the same number of assignments, but it will not automatically take into account the fact that some assignments take longer to complete than others.  If the effort required for most of your tasks is equivalent then this is often a good choice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load balancing&lt;/strong&gt;:  The worker with the fewest open assignments will be selected every time.  This strategy attempts to compensate for the fact that the issues being assigned may require widely varied amounts of time to complete them, and its goal is to ensure that all the available workers have the same number of open assignments.  If one worker receives a simple issue that they can finish in 5 minutes, then they are more likely to receive their next assignment right away, especially if the other workers are working on issues that will take them 15-20 minutes.  One caveat is if you add a new worker to a load balanced dispatcher then they will receive several assignments in a row until they've caught up to the group's average.  A major benefit of load balancing is that it will automatically compensate for a worker who has assignments from their other groups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These strategies can be further filtered with the option to only select available workers who are also currently logged in.  This is useful if you have many workers who have inconsistent schedules.  When you use this option, the workers who are logged in will be considered as candidates for assignments.  It is important to keep in mind that if you have a small number of workers logged in at any given time then you will likely be better off by not using this option; it has the potential to make too many assignments in a row to a single worker.&lt;/p&gt;

&lt;p&gt;With those choices in mind, let's set up the roster for the Weekend shift:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new &lt;strong&gt;Weekend_ outcome bubble and select __Add Actions&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Set Weekend Assignee&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Add Action&lt;/strong&gt; section, select &lt;strong&gt;Set (variable) Assignee&lt;/strong&gt; from the list.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;From these workers:&lt;/strong&gt; field you should select all the workers who can be assigned work during the Weekend shift.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Pick:&lt;/strong&gt; field, specify a dispatching strategy (as explained above).  For the purposes of this example we'll be using load balanced dispatching because we want idle workers to quickly receive more work.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/new_action_set_assignee.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat the previous steps so each shift has an appropriate assignee.&lt;/p&gt;

&lt;p&gt;Now that our &lt;strong&gt;Assignee&lt;/strong&gt; variable has a shift-dependent worker, we can use it to the set the owner of the new conversation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the &lt;strong&gt;Yes&lt;/strong&gt; outcome bubble near the top of the behavior and select &lt;strong&gt;Add Actions&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;strong&gt;Set Owner&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Add Action&lt;/strong&gt; list, select &lt;strong&gt;Set Owner&lt;/strong&gt;.  Set the value from the dropdown list to &lt;strong&gt;(variable) Assignee&lt;/strong&gt;.  This will set the owner to the worker we selected earlier according to the &lt;strong&gt;What shift is it?&lt;/strong&gt; outcome.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your automated dispatcher should now be complete.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/86/decision_tree.png" alt="" title=""&gt;&lt;/p&gt;

&lt;h1&gt;Next Steps&lt;/h1&gt;

&lt;p&gt;Once you have a basic automated dispatcher in place then you can start making improvements to make it even more useful.&lt;/p&gt;

&lt;h2&gt;Skills&lt;/h2&gt;

&lt;p&gt;Prior to choosing an assignee you could scan the content of a message for particular keywords in order to classify it.  With this classification you could then choose from a list of workers who have the necessary skills required to resolve it.&lt;/p&gt;

&lt;h2&gt;Schedules&lt;/h2&gt;

&lt;p&gt;Rather than assuming workers are always available in particular shifts, you could implement a custom plugin that would set the assignee variable based on an external calendar or schedule that's already maintained by your company.  In the future we'll provide advanced worker scheduling functionality in Cerb5, but plugins give you the ability to do this right now.&lt;/p&gt;

&lt;h2&gt;Content-specific Exclusions&lt;/h2&gt;

&lt;p&gt;There may be certain kinds of messages that you want to exclude from dispatching.  You can do this through buckets, or any other classification.  In the example above you could prepend additional &lt;em&gt;No&lt;/em&gt; outcomes to the &lt;em&gt;Is this conversation assignable?&lt;/em&gt; decision.  These would instruct the dispatcher to abort and do nothing.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/86</link><pubDate>Fri, 13 Jan 2012 17:06:17 GMT</pubDate><guid isPermaLink="false">18689272e3c898dc3d0d2c8d7a55d53d</guid></item><item><title>The benefits and drawbacks of self-assignment vs. dispatching</title><description>&lt;h1&gt;Choosing between self-assignment and dispatching&lt;/h1&gt;

&lt;p&gt;There are two primary ways that your workers are assigned work in Cerb5:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-assignment:&lt;/strong&gt; Workers look through the unassigned tickets in their groups and proactively take ownership of issues that they know how to resolve.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pros: 

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suitability:&lt;/strong&gt; Workers know their own strengths and limitations.  They're unlikely to assign work to themselves that they are not capable of completing.  The estimates you get here will probably be the most accurate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; In teams with many responsibilities, self-assignment permits workers to take work according to their availability at any given moment.  Otherwise, if work is assigned to someone who is busy doing something else then customers end up waiting for a response until their issue is reassigned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autonomy:&lt;/strong&gt; With self-assignment you know that workers have volunteered for all of their assignments.  This should result in a higher degree of confidence that assigned work has been acknowledged and will be completed.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Cons:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redundancy:&lt;/strong&gt; Several workers are likely looking at the same lists of unassigned tickets in order to find the next thing to work on.  They each have to read the same issues and make a decision about suitability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frustration:&lt;/strong&gt; Without a dispatcher, more than one worker may decide to work on the same issue, only to realize that someone else is already in the middle of writing a reply on it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parkinson's Law&lt;/strong&gt;: This adage states that &lt;em&gt;"Work expands to fill the time available for its completion."&lt;/em&gt; Cynically, with self-assignment it is possible for someone to monopolize all the simplest issues and then slowly work on them throughout the day.  In a dispatching environment there is more incentive for a worker to quickly resolve issues because assignments will pile up otherwise.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dispatching:&lt;/strong&gt; One or more workers are designated as dispatchers, and their job is to read incoming issues and route them to workers who are capable of completing them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pros:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Efficiency:&lt;/strong&gt; Each new issue only needs to be reviewed once by a single dispatcher.  There is a higher degree of &lt;em&gt;motion economy&lt;/em&gt; because workers don't need to spend a large part of their time searching for things to work on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oversight:&lt;/strong&gt; Good dispatchers stay informed about the progress on the assignments they have made instead of &lt;em&gt;"firing and forgetting"&lt;/em&gt;.  This accountability has the potential to produce improved worker productivity compared to self-assignment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Procedure:&lt;/strong&gt; A single dispatcher can act as a gatekeeper to verify that clients are entitled to support, and to negotiate with clients about billing arrangements and rates when applicable.  In this scenario, a dispatcher approves everything before workers spend any time working on issues.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Cons:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intermediaries:&lt;/strong&gt; A dispatcher needs to be keenly aware of the skills and schedules of the workers they are routing work to, or they risk creating a situation that is more convoluted than if the responsibility for assignment was left to the workers themselves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency:&lt;/strong&gt; When workers rely on assignments from a dispatcher, work isn't getting done unless a dispatcher is available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time vs. Value:&lt;/strong&gt; Dedicating a worker to acting as a dispatcher takes them away from more productive work.  You can automate tasks like checking support eligibility and routing issues to the appropriate workers.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Resources:

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cerberusweb.com/support/kb/article/86-Creating_an_automated_dispatcher_using_Virtual_Attendants"&gt;Creating an automated dispatcher using Virtual Attendants&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/85</link><pubDate>Fri, 13 Jan 2012 01:44:51 GMT</pubDate><guid isPermaLink="false">8474e8649c7c39f3755b61a5e64725be</guid></item><item><title>Deploying Cerb5 on a Linode virtual server in about 5 minutes</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;If you're having trouble meeting the server requirements for installing Cerb5 on your own hardware, consider a virtual server as a convenient alternative.  Virtual servers are generally part of a much larger infrastructure (e.g. cloud computing), and each instance has a dedicated amount of storage, memory, and computing power.&lt;/p&gt;

&lt;p&gt;Virtualization has many advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can isolate each best-of-breed application in a virtual server that provides its ideal environment (e.g. OS, programming language, server applications), even if that differs from your standard corporate tools.  For example, Cerb5 requires PHP/MySQL.  Other applications may require Ruby/Nginx/PostgreSQL, or Python/CouchDB, or Windows/IIS/C#/SQL-Server.  You're able to utilize the best applications for a particular job rather than being limited to the tools of a specific platform.  &lt;em&gt;(This is even more of a benefit in web-based software that you subscribe to rather than install.)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A virtual server can be isolated from the failure of specific hardware.  Virtualization combines the resources of many computers and they are capable of automatically routing virtual machines to new hardware in the event of failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can scale up the resources of a virtual machine.  With a physical server, you generally have to purchase new equipment (e.g. memory, hard drives) and install them, along with migrating your data.  You often have to pay for all your capacity (memory, storage, processing) in advance.  With a virtual server you can upgrade the memory, storage, and computing power with a couple of mouse clicks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can scale down the resources of a virtual machine.  When you're decommissioning a rented server (e.g. migrating customers to different hardware), you can end up in a situation where you're paying full price for despite utilizing only 10% of the server's resources.  A virtual machine can downsized so you're only paying for what you're using.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can have root (full) access on a virtual server.  Compared to a shared hosting account, this is one of the main advantages of upgrading to a virtual server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our preferred vendor for Linux-based virtual servers is &lt;a href="http://www.linode.com/" title=""&gt;Linode&lt;/a&gt;.  Here are our favorite things about them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Their virtual server plans are fair and inexpensive.  The cost for increments of memory and storage scales linearly.  Their smallest virtual server provides 512MB RAM / 20GB storage for $19.95/month.  On the higher end, a 4GB RAM / 160GB storage server is $159.95/month.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They cater to a technical audience.  They provide a load balancer service, private IP networks w/ failover, DNS hosting, automation through "StackScripts", and a web-based API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They provide geographically diverse facilities in the United States (California, Texas, Georgia, New Jersey), as well as London and Tokyo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They provide an automated backups service.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In particular, the StackScripts feature of Linode has allowed us to create a fully automated Cerb5 installation.  This script can be used to deploy a new Linode virtual server, and it will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Debian or Ubuntu as the operating system&lt;/li&gt;
&lt;li&gt;Install Apache2, PHP5, MySQL5, Postfix, and Git as infrastructure&lt;/li&gt;
&lt;li&gt;Install Cerb5 and all of its system requirements (including the tricky 'mailparse' extension)&lt;/li&gt;
&lt;li&gt;Create a new virtual host in Apache for Cerb5&lt;/li&gt;
&lt;li&gt;Configure a cronjob for Cerb5's scheduler (to check for mail and perform nightly maintenance)&lt;/li&gt;
&lt;li&gt;Install and configure both Memcached and XCache for fast performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Sign up at Linode&lt;/h2&gt;

&lt;p&gt;First, you will need a Linode account to create a new virtual server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.linode.com/?r=a544762ccb5d1fd59422c04e1ebb5076aa3070f2" title=""&gt;Sign up&lt;/a&gt; for a Linode account if you don't have one already.  The creation of a new account requires a valid credit card.  The cost for a new virtual server is prorated to the next 1st of the month.  The least expensive server (Linode 512) is $19.95 per month with a 10% discount for annual prepayment.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Full disclosure: The signup link above includes our referral number which will credit our own Linode account with $20 if you stay signed up for more than 90 days.  We recommend Linode based on its product offering and not the referral rewards.  If you object to the commission policy you can delete our referral number during the signup form).&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During the signup process you'll be given the option to select the plan for your first Linode.  You can upgrade your plan at any time, so we recommend starting with the first Linode 512 plan, which provides a virtual server with 512MB RAM and 20GB storage for $19.95/month (as of November 15th 2011).  There's nothing wrong with choosing a larger plan if you anticipate needing more storage or computing resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you first log in to the Linode Manager you should see your virtual server in the &lt;strong&gt;Linodes&lt;/strong&gt; tab along with its dedicated public IP.  We recommend setting up a DNS "A" record for this IP on the new hostname where you plan to access Cerb5; e.g. &lt;code&gt;helpdesk.example.com&lt;/code&gt;, &lt;code&gt;groupware.example.com&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_manage.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Dashboard&lt;/strong&gt; next to the virtual machine name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you plan to send mail from the virtual machine instead of using an existing SMTP server (like Exchange or Google Apps) then you should set up the Reverse DNS record to reduce the likelihood that your mail is marked as spam.  Click the &lt;strong&gt;Remote Access&lt;/strong&gt; tab near the top of the page.  Click the &lt;strong&gt;Reverse DNS&lt;/strong&gt; link under &lt;strong&gt;Public Network&lt;/strong&gt; and enter the hostname you selected above.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_rdns.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Deploy a Cerb5 automated installation&lt;/h2&gt;

&lt;p&gt;Now that you have a virtual server we can deploy a fully automated installation of Cerb5 and all of its requirements.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Rebuild&lt;/strong&gt; tab and select the &lt;strong&gt;Deploying using StackScripts&lt;/strong&gt; option.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_deploy.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for "cerb5" and select the &lt;strong&gt;jstanden / Cerb5&lt;/strong&gt; result.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_script_cerb5_sel.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your desired settings to automatically configure the server and Cerb5.  When selecting a &lt;em&gt;Distribution&lt;/em&gt;, a 32-bit OS like &lt;em&gt;Ubuntu 11.10&lt;/em&gt; is preferred because it will use less RAM on smaller virtual machines.  Click the &lt;strong&gt;Rebuild&lt;/strong&gt; button at the bottom of the page when finished.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_script_cerb5_setup.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the &lt;strong&gt;Host Job Queue&lt;/strong&gt; finishes and every job says "Success" to the left, it's time to start up the virtual server.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_deploy_jobs.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Boot&lt;/strong&gt; button near the top of the page.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/linode_deploy_boot.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Connecting to your virtual server&lt;/h2&gt;

&lt;p&gt;You can now connect to your new virtual server by IP or hostname using SSH.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On a Unix-based OS like Linux or Mac OS X, type:  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh root@helpdesk.example.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you're a Windows user, download &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" title=""&gt;PuTTY&lt;/a&gt; or run your favorite SSH client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the server command line, type: &lt;code&gt;tail -f stackscript.log&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now see a scrolling list of text as the server is automatically configured for you.  Wait for a few minutes until you see the text &lt;em&gt;"All set!"&lt;/em&gt;.  Type &lt;strong&gt;CTRL+C&lt;/strong&gt; to return to the command line.&lt;/p&gt;

&lt;h2&gt;Logging in to Cerb5&lt;/h2&gt;

&lt;p&gt;If you configured your DNS properly above, you should be able to access Cerb5 from your web browser.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your web browser to &lt;strong&gt;http://helpdesk.example.com/cerb5/&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Be sure to replace &lt;code&gt;helpdesk.example.com&lt;/code&gt; with your own hostname)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the Cerb5 login details you created when deploying the server.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerb5-public.s3.amazonaws.com/support/kb/84/cerb5_login.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Welcome to your fully configured virtual server fine-tuned for Cerb5!&lt;/p&gt;

&lt;h2&gt;Next steps&lt;/h2&gt;

&lt;h3&gt;Automated backups&lt;/h3&gt;

&lt;p&gt;Linode offers an inexpensive, automated backup service.  You can enable it from the &lt;strong&gt;Backups&lt;/strong&gt; tab in the Linode Manager.  Although this service makes consistent snapshots of your virtual server, you should still create a database backup using &lt;code&gt;mysqldump&lt;/code&gt; for reliability.  See: &lt;a href="http://www.cerberusweb.com/book/#backups"&gt;http://www.cerberusweb.com/book/#backups&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Customize the deployment script&lt;/h3&gt;

&lt;p&gt;If you have specific deployment needs you can create your own version of the Cerb5 StackScript.  You can also port it to different cloud services that have a similar feature.  See: &lt;a href="http://www.linode.com/stackscripts/view/?StackScriptID=3591"&gt;http://www.linode.com/stackscripts/view/?StackScriptID=3591&lt;/a&gt;&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/84</link><pubDate>Wed, 16 Nov 2011 02:30:54 GMT</pubDate><guid isPermaLink="false">dae7492d7c286808ea29e7499124649f</guid></item><item><title>Automatically discovering and merging duplicate organizations in the address book</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;One of the major strengths of Cerb5 is that it provides you with a consolidated record of your contacts and customers.  Your collected data can be enhanced with features like Broadcast and Virtual Attendants to supplement processes like Customer Relationship Management (CRM).  This information comes from a variety of sources (e.g. customer data entry in contact forms, worker data entry, imports, integration) and is prone to duplication.  When your address book suffers from a high degree of redundancy then the information you base important decisions on may be fragmented and have degraded reliability.&lt;/p&gt;

&lt;p&gt;For example, if you make the distinction between paid customers and trial users (e.g. "freemium", evaluators) with a custom field on organization records, the main record for a company will likely be categorized properly.  However, if duplicates exist for some of those organizations then you're faced with two major problems regardless of the outcome: (1) if the duplicates are categorized properly then your customer segment numbers are inflated, and the members of such organizations are fragmented; (2) if the duplicates are improperly categorized then you're likely to approach paying customers as if they were trial users, which doesn't show the proper appreciation that you likely desire to convey.  It can be insulting for a customer to spend months of evaluation time, and potentially a large portion of their budget, over several conversations only to be treated as a stranger a few weeks later. &lt;/p&gt;

&lt;p&gt;Here's what a duplicated organization might look like in your address book:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGroup Media, LLC.&lt;/li&gt;
&lt;li&gt;Webgroup Media&lt;/li&gt;
&lt;li&gt;WebGroupMedia&lt;/li&gt;
&lt;li&gt;WebGroup Media LLC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Duplicates like this are especially frustrating when the interface "autocompletes" a list of suggested organizations based on what you start typing.  Which of these organizations is the right one?&lt;/p&gt;

&lt;p&gt;While it is possible to merge these duplicates every time you encounter them, that process requires you to stop what you're doing and switch tasks; and the cost of such multitasking can be significant if you have to perform it several dozen times per day.&lt;/p&gt;

&lt;p&gt;We've created an optional plugin to help automatically discover duplication in your address book.  Using these tools you can quickly examine duplicate records to verify they belong to the same company before merging them.&lt;/p&gt;

&lt;p&gt;If your data is more reliable then your productivity and efficiency are also likely to improve.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;To use the Organization Dupe Finder plugin you must be using Cerb5 version 5.6.1 or later.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cerb5-plugins/wgm.org_dupe_finder" title=""&gt;Download the Organization Dupe Finder plugin&lt;/a&gt; from GitHub. &lt;em&gt;(These instructions will assume you have console access, but you can also download a ZIP file from GitHub and extract it to the same directory.)&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd /path/to/cerb5/storage/plugins/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git clone git://github.com/cerb5-plugins/wgm.org_dupe_finder.git&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Activate the plugin in the web interface from &lt;strong&gt;Setup-&gt;Plugins&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/83/dupes_plugin.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;address book&lt;/strong&gt; link in the top navigation menu.  Select the new &lt;strong&gt;Find Dupes&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/83/dupes_wgm.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;For smaller address books (e.g. a few thousand contacts), you can click on the &lt;strong&gt;Find Similar Orgs&lt;/strong&gt; button to discover potential duplicates using all organizations.  With a very large address book it's often more efficient and less tedious to distribute the work among several people.  Using the "Starts with:" option you can divide alphabetic ranges between several people -- e.g. &lt;em&gt;"You take A-E, I'll handle F-J, ..."&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The world is a big place.  It is possible that two or more organizations in your address book will have the exact same name and still be separate companies.  For this reason, it is a good practice to click the &lt;em&gt;peek&lt;/em&gt; icon to the right of an organization.  You can compare known contact information, as well as the email addresses of existing members in the &lt;em&gt;People&lt;/em&gt; tab.&lt;/p&gt;

&lt;h1&gt;Technical notes&lt;/h1&gt;

&lt;p&gt;The discovery of duplicate organizations is accomplished through the following process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Punctuation and spaces are removed.&lt;/li&gt;
&lt;li&gt;Common corporate suffixes (e.g. Inc, Pty, LLC, Oy, BV) are removed.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://en.wikipedia.org/wiki/Soundex" title=""&gt;Soundex&lt;/a&gt; algorithm converts the remaining text into phonetic notation. &lt;/li&gt;
&lt;li&gt;The phonetic results are filtered to a minimum length and then grouped by similarity up to a maximum length.&lt;/li&gt;
&lt;li&gt;Organization names that are entirely contained within the names of other organizations are grouped with them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This process is capable of finding many representations for the same company that are separated by subtle spelling, spacing, or formal suffixes.  These are the most likely differences in your address book entries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The execution of the process is fast; tens of thousands of organizations can be compared within seconds.  Execution speed is favored over accuracy in edge cases in accordance with the Pareto Principle (i.e. 80% of the dupes can be discovered with 20% of the effort, and the remaining 20% would likely take 5X more execution time).  Outliers can still be merged manually.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The notation of the Soundex algorithm uses the literal first letter of each phrase (in its PHP/MySQL implementation).  For example, Soundex("Craft")=C613 and Soundex("Kraft")=K613.  This means that, by default, the algorithm is not suitable for finding duplicates where the first letters are replaced with different letters that have a similar phonetic sound.  This can be offset by adding the same prefix to every line of text being compared, although this also has the potential to introduce more false positives.  We believe that misspellings at the beginning of an organization are likely to be rare compared to the hassle of false positives, so we have elected to leave this limitation in place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Soundex algorithm may provide many false positive groupings for companies that are similar but distinct.  For this reason we do not automatically merge duplicates, and instead tools are provided so that workers can perform a quick inspection of the records when in doubt. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This Soundex algorithm may not produce optimal results for all languages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This process won't find every duplicate entry in your address book, although it has demonstrated great success in finding the majority of them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/83</link><pubDate>Tue, 15 Nov 2011 23:25:51 GMT</pubDate><guid isPermaLink="false">83d8c98cab2eb46d0ba8b77e4431304f</guid></item><item><title>Checking the integrity of attachments between the database and file system</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Cerb5 is a complex project with a 10 year history and more than 300,000 lines of source code.  During this time there has been at least one known issue where file attachments on deleted records were not properly cleaned up on the disk.&lt;/p&gt;

&lt;p&gt;This article provides instructions on how to compare the contents of the database and the filesystem, as well as instructions on how to clean up any inconsistencies that are found.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Make a backup!&lt;/h2&gt;

&lt;p&gt;The instructions in this article require the use of several console commands on your server.  If these commands are entered improperly by accident then you may experience unintended data loss.  Please make a current backup of your database and filesystem before proceeding.&lt;/p&gt;

&lt;h2&gt;Creating a list of files on the disk&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Change directory to the attachments directory of the storage filesystem:&lt;br&gt;
&lt;code&gt;cd /path/to/cerb5/storage/attachments&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a list of all the files on the disk:&lt;br&gt;
&lt;code&gt;find * -type f &amp;gt; tmp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sort the list:&lt;br&gt;
&lt;code&gt;sort tmp &amp;gt; files.disk&lt;/code&gt;&lt;br&gt;
&lt;code&gt;rm tmp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Creating a list of files in the database&lt;/h2&gt;

&lt;p&gt;From the &lt;code&gt;./storage/attachments&lt;/code&gt; directory, run the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mysql -u &amp;lt;user&amp;gt; -p&amp;lt;pass&amp;gt; -BN -e \
"SELECT storage_key FROM attachment \
WHERE storage_extension = 'devblocks.storage.engine.disk' \
ORDER BY storage_key" &amp;lt;database&amp;gt; \
&amp;gt; files.db
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You will need to replace &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;pass&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;database&amp;gt;&lt;/code&gt; with the proper values for your environment.  If you are unsure of these values, consult your &lt;code&gt;framework.config.php&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;Checking file storage integrity&lt;/h2&gt;

&lt;h3&gt;Count files only on disk and not in the database&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;comm -23 files.disk files.db | wc -l
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Count files only in the database and not on disk&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;comm -13 files.disk files.db | wc -l
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Count where a file is both on disk and in the database&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;comm -12 files.disk files.db | wc -l
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Cleaning orphaned files&lt;/h2&gt;

&lt;h3&gt;Cleaning up orphaned files on disk&lt;/h3&gt;

&lt;p&gt;If you have files that only appear on the disk and are no longer in the database, you can transform the comparison list into a sequence of commands in order to remove or relocate the files. &lt;/p&gt;

&lt;p&gt;Make sure you are still in the &lt;code&gt;./storage/attachments&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;To remove these files, iterate over the list and delete each one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for f in `comm -23 files.disk files.db`; do rm -v $f; done;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Cleaning up orphaned files in the database&lt;/h3&gt;

&lt;p&gt;If you have files that only appear in the database and are no longer on the disk, you can transform the comparison list into a series of SQL statements to delete the records.&lt;/p&gt;

&lt;p&gt;Make sure you are still in the &lt;code&gt;./storage/attachments&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;Iterate over the list of orphaned files to generate a list of SQL statements in order to delete the affected rows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for key in `comm -13 files.disk files.db`;  
do echo "DELETE FROM attachment WHERE id = `basename ${key}`;" &amp;gt;&amp;gt; deletes.sql;  
done;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You now have a file named &lt;code&gt;deletes.sql&lt;/code&gt; with the statements required to clean up the database.  The recommended way to execute these statements is to pipe them through the &lt;code&gt;mysql&lt;/code&gt; command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mysql --verbose -u &amp;lt;user&amp;gt; -p&amp;lt;pass&amp;gt; &amp;lt;database&amp;gt; &amp;lt; deletes.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again, you will need to replace &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;pass&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;database&amp;gt;&lt;/code&gt; with the proper values for your environment.&lt;/p&gt;

&lt;p&gt;When finished, delete the SQL statements file:&lt;br&gt;
&lt;code&gt;rm deletes.sql&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;Finishing up&lt;/h2&gt;

&lt;p&gt;Remove the temporary files you created during this process:&lt;br&gt;
&lt;code&gt;rm files.disk files.db&lt;/code&gt;&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/82</link><pubDate>Wed, 19 Oct 2011 16:14:11 GMT</pubDate><guid isPermaLink="false">80d81f0543df2461cec044dc4e8a7c1f</guid></item><item><title>What are the major differences and improvements between Cerb4 and Cerb5?</title><description>&lt;p&gt;At this point there are more than 1,237 improvements in Cerb5 (as of 5.6) since the final version of Cerb4.  The &lt;a href="http://wiki.cerb5.com/wiki/Category:Changelog"&gt;wiki&lt;/a&gt; is a great resource for browsing through our release notes, but the list has become big enough that people frequently write in to ask us if we can summarize what we feel are the biggest improvements.&lt;/p&gt;

&lt;p&gt;Here's a comparison of the changes between Cerb4 and Cerb5 provided by &lt;a href="http://www.linkedin.com/in/jeffstanden"&gt;Jeff Standen&lt;/a&gt;, &lt;em&gt;Founder and Chief of R&amp;amp;D&lt;/em&gt; at WebGroup Media, and lead product developer for Cerb5 over all 10 years of its history.&lt;/p&gt;

&lt;h1&gt;Virtual Attendants / Scheduled Behavior / Macros&lt;/h1&gt;

&lt;p&gt;My pick for #1 innovation in Cerb5 is Virtual Attendants (VAs).  They're a very flexible way to bring workflow automation into your environment.&lt;/p&gt;

&lt;p&gt;If we offered options for every feature variation that people ask for then the app would end up cluttered and confusing.  VAs offer emergent behavior -- that is, users can use their creativity to mix and match the tools we provide to do interesting things that we had never considered; and then they can share those tips with the community like a recipe.&lt;/p&gt;

&lt;p&gt;For example, now you can use VAs to configure different auto-replies based on the current date/time, the sender's language, an SLA attached to the sender's organization, or anything else based on the information captured by the system.  In the past, auto-replies were configured with a text box that offered no flexibility.&lt;/p&gt;

&lt;p&gt;Auto-replies are just an example -- you can add Virtual Attendant behavior to all kinds of events in Cerb5: new messages to a group, closed tickets, assigned tickets, before a worker reply (to modify the contents prior to sending), after a worker reply, when a notification is received, when new mail enters the helpdesk, etc.&lt;/p&gt;

&lt;p&gt;Virtual Attendant behavior can also be created on special events that function like macros, so you can pre-define the actions you do most often (e.g. send a reply, add a comment, set custom fields, link to other records, send a notification, add a task, post to Twitter/Facebook/Campfire, send SMS through Twilio) and then apply them in a single click from ticket lists or pages.&lt;/p&gt;

&lt;p&gt;VAs can also create "scheduled behavior": custom behavior that runs at a future date, allowing functionality like SLA escalation, a scheduled pipeline of sales messages for new leads (welcome, 2-day, 15-day), or anything else you can dream up.&lt;/p&gt;

&lt;p&gt;For more examples, see: &lt;a href="http://cerberusweb.com/support/kb/browse/493/Cookbook"&gt;http://cerberusweb.com/support/kb/browse/493/Cookbook&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Watchers/Activity Log&lt;/h1&gt;

&lt;p&gt;Tickets had a single owner in Cerb4, and they mainly had to keep up to date about changes proactively from something like a 'My Work' list in the web interface.  In Cerb5 you can 'watch' any record (tickets, tasks, opportunities, addresses, etc) in the same way you follow people on Twitter, friend them on Facebook, or connect to them on LinkedIn.  There can be multiple watchers on a record and they receive automatic Notifications when something changes on it.&lt;/p&gt;

&lt;p&gt;These changes are also recorded in the Activity Log for every record type, and you can also view the activity log entries from the perspective of any worker to see what they've been up to in the entire system (beyond just replying to mail).&lt;/p&gt;

&lt;h1&gt;Notifications&lt;/h1&gt;

&lt;p&gt;Cerb5 generates notifications to keep workers in the loop about the things they're working on or interested in.  The only analogous thing in Cerb4 had to do with sending copies of messages to workers' external email accounts, but that only worked for tickets and it didn't cover any other activities.&lt;/p&gt;

&lt;p&gt;Notifications in Cerb5 are implemented for every kind of record (tasks, tickets, opps, orgs, addys, calls, etc).  They've been refined quite a bit by 5.6 -- by viewing any record that you've been watching (from a notification or otherwise) you'll see a list of everything that changed since your last visit.  Combined with Virtual Attendants, workers can also have their notifications routed to any number of places (like text messages).&lt;/p&gt;

&lt;h1&gt;Workspaces / Subtotals&lt;/h1&gt;

&lt;p&gt;Custom worklists for every record type can be created and organized into workspaces.  Workspaces can be owned by groups, roles, or workers.  A group owned workspace is visible to any member of the group, but only managers can make underlying changes to it (e.g. columns, required parameters).  Members can maintain their own preferences for filters, sorting, paging, and subtotaling. &lt;/p&gt;

&lt;p&gt;In Cerb4, ticket worklists had no subtotal sidebar like the default lists of mail.  In Cerb5, you can subtotal any kind of worklist by a large number of columns -- including custom fields and fields from linked records.  For example, on a ticket list you can add custom fields from the sender's organization as columns and also subtotal by them.  This means if you add a custom field for 'Service Level' to organizations you could subtotal and filter tickets using it.  This also makes it easier to organize tasks, opportunities, and other less structured record types.&lt;/p&gt;

&lt;h1&gt;Presets&lt;/h1&gt;

&lt;p&gt;In Cerb5 you can save commonly used search filters as presets, allowing you to quickly switch between combinations of filters in a single click on any worklist of the same type.&lt;/p&gt;

&lt;h1&gt;Comments&lt;/h1&gt;

&lt;p&gt;In Cerb4 you could only add comments to tickets.  Comments can be added to every record type in Cerb5, which greatly enhances group collaboration.  Comments can also generate notifications.&lt;/p&gt;

&lt;h1&gt;Choosers&lt;/h1&gt;

&lt;p&gt;Cerb5 introduced the concept of "choosers", which are popups that allow you to peek at content, edit it, or establish links regardless of where you happen to be in the interface.  For example, when filtering a list of tickets or generating a report, one of the common options is providing a list of workers or groups.  You can start typing names and the autocomplete functionality will give you hints -- and this works well for a limited number of things to choose from -- but a chooser will allow you to use presets and filters to quickly narrow down very long lists like contacts, tasks, or tickets (anywhere; even in the middle a ticket reply). &lt;/p&gt;

&lt;h1&gt;Connections (Context Links)&lt;/h1&gt;

&lt;p&gt;Context links have a scary name, but a very useful purpose.  They allow you to connect any two records together.  If you're working on a ticket and it involves a couple of organizations and several tasks, you can link all those records together for quick reference.  A lot of functionality, like time tracking entries and opportunities, will automatically link themselves to records they're created from.  Cerb4 lacks a comparable equivalent.&lt;/p&gt;

&lt;h1&gt;Snippets&lt;/h1&gt;

&lt;p&gt;Cerb4 had email templates.  Cerb5 has snippets, which provide far larger list of placeholders that will automatically be substituted with the proper information based on the current record.  Snippets are available for all the major record types, and can be owned by workers or groups.  Unlike email templates, snippets can also contain conditional logic and modifiers.  For example, you an inject a customer's first name when it's known.  You could send a message that begins with "We haven't heard from you in a while" if it happens to be true.  There are countless uses for such functionality, especially when combined with Broadcast.&lt;/p&gt;

&lt;h1&gt;Broadcast&lt;/h1&gt;

&lt;p&gt;Cerb4 lacked a feature to mass reply to several tickets at once.  Cerb5 introduced a feature called Broadcast which allows to draft a message to any worklist that has contact information: tickets, addresses, opportunities, etc.  You can use snippets so each message is personalized to the recipient.  You can filter worklists with custom fields and target broadcasts at very specific audiences.  During the 2008 U.S. Elections, we had a Senate campaign use broadcasts to instantly send personalized messages to two dynamic mailing lists of constituents (based on buckets): those who supported the financial bailouts of the auto and banking industries, and those who opposed them.  Broadcasts also use an efficient mail queue to deliver messages so your system's performance doesn't suffer even for large lists.&lt;/p&gt;

&lt;h1&gt;Explore mode&lt;/h1&gt;

&lt;p&gt;In Cerb4 you could Next/Prev through a list of tickets to quickly change pages.  However, this only worked for tickets and if you left the page you lost your place.  In Cerb5 we introduced 'Explore mode', which is available for every worklist type.  It provides a small banner at the top of the page with the familiar next/previous navigation information, but that banner remains on the page as you navigate around -- perhaps switching from a ticket to look up a contact record and then creating a task.  You can instantly return back to where you were working with a single click.&lt;/p&gt;

&lt;p&gt;Explore mode is also social -- if you have a list of 250 opportunities you need to review by the end of the day and you're called off to a meeting, you can send the URL to another worker and they can pick up exactly where you left off (with all the same search filters).  This is also a very efficient way to distribute work on a team.  The team leader can perform the searches and then simply send the URLs to other workers by email or IM.&lt;/p&gt;

&lt;p&gt;Explore mode is also very useful when combined with things like notifications, as you can explore all your notifications without having to return to the list to click on the next one.  Notifications are also 'folded' in explore mode, meaning you'll only visit each record once even if it had 20 notifications pointing you to it (and they'll all be marked read automatically).&lt;/p&gt;

&lt;h1&gt;Drafts&lt;/h1&gt;

&lt;p&gt;A common request in Cerb4 was the ability to have drafts auto-saved while writing responses.  In Cerb5 we've implemented this feature, and also gone a step further to where your draft on a ticket is visible to other workers in that group.  This has several great uses.  For one, another worker looking at a ticket will immediately see that it is being worked on.  Similarly, a worker can also send a ticket link to someone else (including their manager) &lt;em&gt;before&lt;/em&gt; hitting send and ask for proofreading or approval (which is far superior to copy/paste or dragging someone over to your desk from across the building).&lt;/p&gt;

&lt;h1&gt;Reports&lt;/h1&gt;

&lt;p&gt;In Cerb4 the selection of reports was fairly limited.  In Cerb5 the reports are much more visual and interactive.&lt;/p&gt;

&lt;h1&gt;Plugins / SDK&lt;/h1&gt;

&lt;p&gt;Cerb4 supported plugins, but they lacked documentation and community effort.  Cerb5 has a growing list of plugins for you to use and learn from on GitHub: https://github.com/cerb5-plugins/ -- including very useful things like integration with OpenID, LDAP, Campfire, Twitter, Twilio, Facebook, Freshbooks, and more.  Cerb5 also includes an SDK with examples in every distribution.&lt;/p&gt;

&lt;h1&gt;Platform/Performance&lt;/h1&gt;

&lt;p&gt;Cerb4 was fast, but Cerb5 is even faster despite doing so much more.  We've streamlined our custom platform (Devblocks) through years of experience hosting a large network of On-Demand instances of the software.  We've relentlessly profiled and optimized the software -- keeping memory usage low, loading the least amount of code required to serve a request, serving images as sprites to reduce HTTP connections, favoring dynamic content pulled through Ajax instead of reloading entire pages, strategically caching all kinds of information to reduce the complexity and frequency of database queries, and more.&lt;/p&gt;

&lt;p&gt;One common performance bottleneck in Cerb4 is fulltext searching of message content; which occurs for a number of reasons: every new message inserted into the database requires an expensive update to the index, and updating the index prevents lookups for commonly used information like displaying conversations.  In Cerb5 we split up this process.  Indexing happens on a separate table, and it's efficiently done in batches from a scheduler rather than performed in real-time (though it's close enough; usually within a couple minutes).&lt;/p&gt;

&lt;h1&gt;Storage&lt;/h1&gt;

&lt;p&gt;In Cerb4 we had moved heavy content that never changes out of the database and into the filesystem -- and this was a good first step.  In Cerb5, you can ship that content off to services like Amazon S3.&lt;/p&gt;

&lt;h1&gt;Translations&lt;/h1&gt;

&lt;p&gt;In Cerb4 most of the available translations were scattered all over the place and quickly became out of date.  In Cerb5 we bundle several up-to-date translations with the distribution: English, German, Spanish, Italian, Dutch, Russian, and Portuguese.  We're aware of several others that are being updated (French, Chinese, Japanese).&lt;/p&gt;

&lt;h1&gt;UTF-8/Unicode&lt;/h1&gt;

&lt;p&gt;Cerb5 fully supports UTF-8 for international language support.  This worked in a basic fashion in Cerb4 for things like email messages, but Cerb5 goes much further.  We "Romanize" non-Latin languages like Chinese, Greek, and Russian, which makes their content available for search indexing or spam filtering without polluting the word database with foreign characters.  That also means you can interchangeably search for text in either the native character set (such as Chinese or Japanese) or the Romanized equivalents.  Either approach will yield the same matches.  This also works for accented characters, making them optional in searches.&lt;/p&gt;

&lt;p&gt;In Cerb4, the anti-spam system simply ignored non-English content.  It did "de-accent" characters, so a word like "r&#xE9;sum&#xE9;" would be converted to "resume"; but this did nothing about spam in languages like Chinese, Japanese, or Russian.  By ignoring all that content, spam usually couldn't be given a high probability (since messages were considered blank, and 50% probable) so it created a lot of clutter.  In Cerb5, the process of Romanizing foreign languages is very effective at quarantining this spam as well.&lt;/p&gt;

&lt;h1&gt;jQuery&lt;/h1&gt;

&lt;p&gt;This is a fairly esoteric bullet point for the benefit of web developers, but we also switched from the YUI (Yahoo User Interface) library in Cerb4 to jQuery in Cerb5.  This provides cross-browser scripting, Ajax, effects, and familiar user interface patterns like tabs, drag&amp;amp;drop, autocompletes, popups, and more.  This allows us to provide a great user experience in a web browser, while spending more of our limited time creating value instead of battling with browser inconsistencies.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/79</link><pubDate>Wed, 26 Oct 2011 00:04:28 GMT</pubDate><guid isPermaLink="false">6aabc230eb912d7401a6cf6c8fed0c96</guid></item><item><title>Using LDAP to authenticate client and worker logins based on an existing directory of contacts</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol"&gt;LDAP&lt;/a&gt;&lt;/strong&gt; (Lightweight Directory Access Protocol) is a service designed to share contact information between applications.  It is often used to provide centrally managed corporate account information.  A single login/password combination can allow access to various applications, and it only needs to be changed in a single place to take effect everywhere.&lt;/p&gt;

&lt;p&gt;We provide a &lt;a href="https://github.com/cerb5-plugins/wgm.ldap"&gt;plugin for LDAP integration&lt;/a&gt; with Cerb5.  This article explains how to use it.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;This plugin requires the &lt;a href="http://php.net/manual/en/book.ldap.php"&gt;LDAP PHP extension&lt;/a&gt;.  This is usually available through the package manager for your distribution.&lt;/p&gt;

&lt;p&gt;On Debian/Ubuntu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install php5-ldap
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Installing the plugin&lt;/h2&gt;

&lt;p&gt;The plugin needs to be installed in the &lt;code&gt;storage/plugins/&lt;/code&gt; directory of your Cerb5 installation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Change directory to &lt;code&gt;/path/to/cerb5/storage/plugins&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the command:&lt;br&gt;
&lt;code&gt;git clone git://github.com/cerb5-plugins/wgm.ldap.git&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Enabling the plugin&lt;/h2&gt;

&lt;p&gt;The plugin can be enabled from the web interface.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Cerb5 in your web browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;em&gt;Setup-&gt;Plugins&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the &lt;em&gt;[Cerb5] LDAP Integration&lt;/em&gt; plugin and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Configuring the plugin&lt;/h2&gt;

&lt;p&gt;You should substitute your own LDAP connection details during this section.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Plugins&lt;/em&gt; menu and select &lt;em&gt;LDAP&lt;/em&gt; from the list.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/78/setup_plugins_menu.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your LDAP settings:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/78/setup_ldap_credentials.png" alt="" title=""&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your connection information will be verified when you save it.&lt;/p&gt;

&lt;h2&gt;Enabling LDAP logins for workers&lt;/h2&gt;

&lt;p&gt;A worker account needs to exist in Cerb5 with an associated email address that matches their contact record in your LDAP directory.&lt;/p&gt;

&lt;p&gt;A new LDAP option will appear on the login form:  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/78/login_switch_ldap.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;The worker should enter their email address and the password on file in your LDAP directory.&lt;/p&gt;

&lt;h2&gt;Enabling LDAP logins in the Support Center&lt;/h2&gt;

&lt;p&gt;Unlike worker authentication, contacts &lt;em&gt;will&lt;/em&gt; be automatically created in your Support Center during their first login if they exist in your LDAP directory.  Additionally, their given name and surname will be imported if available.&lt;/p&gt;

&lt;h3&gt;Configuring your Support Center profile&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to &lt;em&gt;Setup-&gt;Community Portals-&gt;Configure&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Support Center where you want to enable LDAP logins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;em&gt;Settings&lt;/em&gt; tab, scroll to the &lt;em&gt;Login&lt;/em&gt; section and select &lt;strong&gt;LDAP&lt;/strong&gt; for the &lt;em&gt;"Authenticate logins using these methods:"&lt;/em&gt; option.  This can be set exclusively, or in conjunction with other login methods.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/78/sc_login_ldap.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Logging in&lt;/h3&gt;

&lt;p&gt;Contacts from your LDAP address book should now be able to log in using their existing email address and password.&lt;/p&gt;

&lt;h1&gt;Next Steps&lt;/h1&gt;

&lt;h2&gt;Alternate credentials&lt;/h2&gt;

&lt;p&gt;With a relatively simple modification to the plugin's code you could change the login credentials from email/password to any other combination.  For example, your users may be familiar with using a screen name or account number instead of an email address.&lt;/p&gt;

&lt;h2&gt;Multi-factor authentication&lt;/h2&gt;

&lt;p&gt;You could also modify the plugin's code to use multi-factor authentication for improved security.  Two-factor security, for instance, is comprised of "something you know" and "something you have".&lt;/p&gt;

&lt;p&gt;For example, at an ATM (automated bank-teller machine), you &lt;em&gt;have&lt;/em&gt; an access card and &lt;em&gt;know&lt;/em&gt; a secret PIN number.  You generally cannot use the ATM to access your account without both factors.  Other accounts may also require a &lt;a href="http://en.wikipedia.org/wiki/Security_token"&gt;security token&lt;/a&gt; in addition to a login and password.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/78</link><pubDate>Thu, 08 Sep 2011 00:04:37 GMT</pubDate><guid isPermaLink="false">9f2bb3bc3f9bc9833bf46741879fb26b</guid></item><item><title>Adding Contact Situations to the Support Center</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;The Support Center community portal by default does not have any Contact Situations configured.  This article will walk you through the process of adding a couple situations to your Support Center.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;p&gt;For this article we will assume you have already added a Support Center under the Community Portals tab in Setup. &lt;/p&gt;

&lt;h2&gt;Configuring the Support Center&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;em&gt;Setup&lt;/em&gt; on the right of the global navigation menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Community Portals&lt;/em&gt; menu and select &lt;em&gt;Configure&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/68/sc_community_portals_menu.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the Support Center that you would like to edit.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Making sure you have the Contact Us Module enabled&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After entering into the Support Center profile, scroll down to the section called &lt;em&gt;Modules&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that the Module that says &lt;em&gt;Contact Us&lt;/em&gt; is set for either Everyone, or Logged in.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/77/sc_modules.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have not enabled any Modules before, any that you set to Everyone or Logged in will appear automatically as you enable them.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Adding a Contact Situation&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Proceed to the section that says &lt;em&gt;Contact Us&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will notice several options here including:  Allow users to provide their own ticket subjects, Allow Attachments from:, and CAPTCHA:.  You may set these as you feel is necessary for your company.  In our use case here we will leave everything set to the default settings.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/77/contact_us_module.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Add New Situation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that the Status is set to &lt;em&gt;Visible&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter in a &lt;em&gt;Reason for contacting&lt;/em&gt;.  This also acts as the subject of the message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter in a &lt;em&gt;Deliver&lt;/em&gt; to: Address. Make sure this address is an address that is in your Cerb5 installation.  If you leave it blank, the e-mail address entered will be your default Reply-To address as set in your helpdesk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You may also choose to enter in subsequent &lt;em&gt;Follow-up&lt;/em&gt; questions if you wish (as shown here).  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/77/contact_us_situations.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button to save the configuration.&lt;/p&gt;

&lt;h2&gt;Test it!&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If you have your index.php file already deployed on your server, your changes will automatically be applied (you do not need to re-deploy the index.php file to have the changes take effect).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the Contact Us tab in your Support Center.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/77/sc_contact_us.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select one of the newly created Contact Situations and there you go!  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/77/sc_contact_us_final.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/77</link><pubDate>Wed, 07 Sep 2011 21:22:25 GMT</pubDate><guid isPermaLink="false">8c213e7f03c02e20ec66e3ce7adaa3bb</guid></item><item><title>Integrating the DISQUS comments platform with knowledgebase articles in the Support Center</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;DISQUS is a free comments platform that can be installed on any website.  It provides social network integration, user profiles, single sign-on, anti-spam, moderation, mobile commenting, and email notifications.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Sign up for a free DISQUS account&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://disqus.com/admin/register/"&gt;Register for a free account at DISQUS&lt;/a&gt; if you don't already have one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your site information:  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/76/disqus_register_site.png" alt="" title=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site URL&lt;/strong&gt; is the top-level URL of your Support Center.&lt;br&gt;
(&lt;em&gt;e.g. http://support.example.com&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site Name&lt;/strong&gt; is the name of your Support Center.&lt;br&gt;
(&lt;em&gt;e.g. Cerb5 Community&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site Shortname&lt;/strong&gt; is your subdomain at disqus.com where you can configure and moderate your comments system.&lt;br&gt;
(&lt;em&gt;e.g. example.disqus.com&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your moderator information, or click the &lt;em&gt;"Already have a profile?"&lt;/em&gt; link if you've used DISQUS before.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/76/disqus_register_mod.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Continue&lt;/em&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure your basic settings and click the &lt;em&gt;Continue&lt;/em&gt; button again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can ignore the installation step since the code is provided below.&lt;/p&gt;

&lt;h2&gt;Adding DISQUS comments to knowledgebase articles&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open a new browser to Cerb5.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;em&gt;setup&lt;/em&gt; from the top right navigation menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;em&gt;Community Portals&lt;/em&gt; and select &lt;em&gt;Configure&lt;/em&gt; from the menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select on your Support Center and click the &lt;em&gt;Custom Templates&lt;/em&gt; tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Add Custom Template&lt;/em&gt; button and select &lt;strong&gt;[cerberusweb.kb] support&amp;#95;center/kb/article.tpl&lt;/strong&gt; template from the dropdown.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copy the following HTML and paste it just above the last &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt; tag at the bottom of the &lt;code&gt;article.tpl&lt;/code&gt; template.  Replace &lt;code&gt;&amp;lt;shortname&amp;gt;&lt;/code&gt; on the 4th line (&lt;code&gt;var discus_shortname = '&amp;lt;shortname&amp;gt;';&lt;/code&gt;) with the DISQUS short name you created during registration.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id="disqus_thread"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
    {devblocks_url assign=article_url full=true}c=kb&amp;amp;p=article&amp;amp;id={$article-&amp;gt;id}{/devblocks_url}
    var disqus_shortname = '&amp;lt;shortname&amp;gt;'; // required: replace example with your forum shortname
    var disqus_identifier = 'kb_article_{$article-&amp;gt;id}';
    var disqus_url = '{$article_url}-{$article-&amp;gt;title|devblocks_permalink}';

    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
&amp;lt;/script&amp;gt;
&amp;lt;noscript&amp;gt;
    Please enable JavaScript to view the 
    &amp;lt;a href="http://disqus.com/?ref_noscript"&amp;gt;comments powered by Disqus.&amp;lt;/a&amp;gt;
&amp;lt;/noscript&amp;gt;
&amp;lt;a href="http://disqus.com" class="dsq-brlink"&amp;gt;
knowledgebase comments powered by &amp;lt;span class="logo-disqus"&amp;gt;Disqus&amp;lt;/span&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button to save the template.&lt;/p&gt;

&lt;h2&gt;Test it!&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open a knowledgebase article from your Support Center and scroll to the bottom.  You should now see a DISQUS comment box:  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/76/kb_discus_comment_box.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/76</link><pubDate>Fri, 02 Sep 2011 05:25:56 GMT</pubDate><guid isPermaLink="false">37faf7a2539aec8b6da16a6d0b2ba2bb</guid></item><item><title>Tracking worker performance using profiles, subtotals, and the Activity Log</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Using subtotals on the Activity Log from a worker's profile gives you a broad overview of their contributions during a given date range.  By clicking on a particular activity you can review a summary of all the related activity.  For example, if you click the &lt;em&gt;"Comment Created"&lt;/em&gt; activity, you'll be shown a list of all the comments created by that worker.  This provides insight into how workers spent their time in the helpdesk.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Displaying a worker's activity&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;em&gt;profiles&lt;/em&gt; in the top right navigation menu:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/menu_profiles.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select a worker by clicking on their name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;em&gt;Activity Log&lt;/em&gt; tab:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/profiles_activity_log_tab.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Using subtotals&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Expand the subtotals if they aren't visible by clicking on the &lt;em&gt;subtotals&lt;/em&gt; link in the top right of the worklist:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/view_subtotals.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the subtotals aren't sorted by &lt;em&gt;Activity&lt;/em&gt;, click on the title of the subtotals and select it from the menu:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/subtotals_category_activity.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Filtering to a specific date range&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;em&gt;Filters&lt;/em&gt; bubble above the worklist and select &lt;em&gt;Toggle Advanced&lt;/em&gt; from the menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a filter to restrict the date range of activity to only events that happened today.  Click the &lt;em&gt;Add Filter&lt;/em&gt; button when finished:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/view_filter_created.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should now see all the activity performed by this worker during the current day:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/subtotals_activity.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Saving a preset&lt;/h2&gt;

&lt;p&gt;You can save a preset for the date range so you don't have to add the filter manually each time you view a worker's profile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select &lt;em&gt;Save filters as preset&lt;/em&gt; from the &lt;em&gt;-action-&lt;/em&gt; dropdown in the &lt;em&gt;Filters&lt;/em&gt; section:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/view_preset_today.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any time you want to use this preset, simply select it from the menu on the &lt;em&gt;Filters&lt;/em&gt; bubble:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/75/view_preset_today_load.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/75</link><pubDate>Fri, 02 Sep 2011 09:26:41 GMT</pubDate><guid isPermaLink="false">34c5c182e2b55d4199d31b1f44432f69</guid></item><item><title>Viewing sent messages like a traditional email client</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Traditional email applications provide a &lt;em&gt;Sent&lt;/em&gt; folder for reviewing mail that was sent by you to someone else.  You can easily reproduce this functionality in Cerb5, and then enhance it with powerful functionality like subtotals, presets, and workspaces.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Building the worklist&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;em&gt;mail&lt;/em&gt; in the top navigation menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;em&gt;Search Messages&lt;/em&gt; tab.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/mail_search_msgs_tab.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;em&gt;Filters:&lt;/em&gt; bubble above the worklist and select &lt;em&gt;Toggle Advanced&lt;/em&gt; from the menu.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_filters_advanced.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;em&gt;Add Filter&lt;/em&gt; section on the right, add a filter for &lt;em&gt;Is Outgoing = yes&lt;/em&gt; and click the &lt;em&gt;Add Filter&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_add_filter_outgoing.png" alt="" title=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You now have a worklist of recently sent messages.&lt;/p&gt;

&lt;h2&gt;Filtering by worker&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;em&gt;Add Filter&lt;/em&gt; section on the right, add a filter for &lt;em&gt;Worker&lt;/em&gt;, select your desired worker(s), and click the &lt;em&gt;Add Filter&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_add_filter_worker.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Filtering by date range&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;em&gt;Add Filter&lt;/em&gt; section on the right, add a filter for &lt;em&gt;Created&lt;/em&gt;, select your desired date range, and click the &lt;em&gt;Add Filter&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_add_filter_created.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Creating a preset&lt;/h2&gt;

&lt;p&gt;You can save your desired filters as a preset so you can quickly display a list of sent messages in the future without having to add each search filter again.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;em&gt;Filters&lt;/em&gt; section on the left above the worklist, choose &lt;em&gt;Save filters as preset&lt;/em&gt; from the &lt;em&gt;-action&lt;/em&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Name your preset and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/preset_create.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the future when you want to use this preset:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Filters:&lt;/em&gt; bubble above the worklist.&lt;/li&gt;
&lt;li&gt;Select your preset from the menu.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/preset_load.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Using subtotals&lt;/h2&gt;

&lt;p&gt;You can also use subtotals to categorize the worklist of sent messages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;subtotals&lt;/em&gt; link in the top right of the worklist if subtotals aren't currently displayed to the left of the list.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_subtotals.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Subtotals will be displayed for your desired category:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/subtotals_groups.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;You can change the category by clicking on the green title above the subtotals:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/subtotals_worker.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Copy to a workspace&lt;/h2&gt;

&lt;p&gt;If you access the worklist of sent messages frequently then you can add it to a workspace.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;copy&lt;/em&gt; link in the top right of the worklist.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/74/view_copy.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Name the worklist.&lt;/li&gt;
&lt;li&gt;Choose an existing workspace or create a new one.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can now add this worklist to any page from the tab with a &lt;em&gt;+&lt;/em&gt; on it.  Try it on the &lt;em&gt;mail&lt;/em&gt; page.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/74</link><pubDate>Thu, 01 Sep 2011 20:01:26 GMT</pubDate><guid isPermaLink="false">a1d684e5fb77f5d117ea22598b5ef440</guid></item><item><title>Customizing the Support Center logo and color scheme</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;The default Support Center uses the Cerberus Helpdesk logo and a fairly plain color scheme.  Most administrators will want to change the logo used, and many will also want to change the color scheme to match the corporate / institutional colors.  This article will show you how to do both of those.&lt;/p&gt;

&lt;h2&gt;Modifying your Support Center with custom templates&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Setup&lt;/em&gt; on the right of the global navigation menu.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Community Portals&lt;/em&gt; menu and select &lt;em&gt;Configure&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/73/sc_community_portals_menu.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the Support Center that you would like to edit.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Custom Templates&lt;/em&gt; tab.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/73/sc_custom_templates_tab.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Changing the default logo&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Add Custom Template&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select the template &lt;strong&gt;[cerberusweb.support&amp;#95;center] support&amp;#95;center/header.tpl&lt;/strong&gt; and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second line reads, in part:  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;src="{devblocks_url}c=resource&amp;amp;p=cerberusweb.support_center&amp;amp;f=images/_wgm/logo.gif{/devblocks_url}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Replace the contents of the image src property with a link to your corporate / institutional logo, like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;src="http://example.com/images/logo.png"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;

&lt;h2&gt;Changing the color scheme&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add Custom Template&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select template: &lt;strong&gt;[cerberusweb.support&amp;#95;center] support&amp;#95;center/style.css.tpl&lt;/strong&gt; and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can edit any of the CSS styles of the support center here, but as an example, we'll change the H1 tag from blue to green.&lt;/p&gt;

&lt;p&gt;First, find the section that says:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;H1 {
    font-size:20px;
    font-weight:bold;
    color: rgb(8,90,173);
    margin-top:0px;
    margin-bottom:3px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then edit the color to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    color: rgb(0,120,0);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;

&lt;h2&gt;Test it!&lt;/h2&gt;

&lt;p&gt;Browse to your Support Center.  You should now see your new logo and color scheme.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/73/sc_example.png" alt="" title=""&gt;&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/73</link><pubDate>Fri, 02 Sep 2011 21:53:04 GMT</pubDate><guid isPermaLink="false">a25c916a1da2f310b9749af12e9a141f</guid></item><item><title>What is the privacy policy for Cerb5 and On-Demand services?</title><description>&lt;h1&gt;Privacy Statement and Disclosure&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;WebGroup Media LLC&lt;/strong&gt; ("WGM") is a commercial open source company that has been leading and supporting the community development of Cerberus Helpdesk (Cerb5) since January 2002. In connection with this business, we operate the &lt;a href="http://cerberusweb.com"&gt;cerberusweb.com&lt;/a&gt; project website, as well as an On-Demand ("software as a service") network of applications hosted by subscription as subdomains of cerb5.com.&lt;/p&gt;

&lt;p&gt;It is WGM's policy to respect your privacy regarding any information we may collect while operating our websites and services. We do not sell any personally-identifiable information or data stored by On-Demand services to third-parties. We do not directly share your information with third-parties without explicit permission except to comply with the law or to provide necessary infrastructure in connection with the services you request; however, there is some passive risk of exposure to third-party access inherent in web-based services that is outlined in detail below. We do our best to mitigate and minimize these risks on your behalf.&lt;/p&gt;

&lt;h2&gt;Website Visitors&lt;/h2&gt;

&lt;p&gt;Like most website operators, WGM collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. WGM's purpose in collecting non-personally identifying information is to better understand how WGM's visitors use its website. From time to time, WGM may release non-personally-identifying information in the aggregate; e.g., by publishing a report on trends in the usage of its website.&lt;/p&gt;

&lt;p&gt;WGM also collects potentially personally-identifying information like Internet Protocol (IP) addresses for visitors and logged in workers. WGM only discloses IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below.&lt;/p&gt;

&lt;h2&gt;Gathering of Personally-Identifying Information&lt;/h2&gt;

&lt;p&gt;Certain visitors to WGM's websites choose to interact with WGM in ways that require us to gather personally-identifying information. The amount and type of information that WGM gathers depends on the nature of the interaction. For example, we ask workers who sign up for On-Demand services to provide an email address. Those who engage in transactions with WGM -- by purchasing products and services for Cerb5, for example -- are asked to provide additional information, including as necessary the personal and financial information required to process those transactions. In each case, WGM collects such information only insofar as is necessary or appropriate to fulfill the purpose of the visitor's interaction with WGM. WGM does not disclose personally-identifying information other than as described below. And visitors can always refuse to supply personally-identifying information, with the caveat that it may prevent them from purchasing or engaging in certain services.&lt;/p&gt;

&lt;h2&gt;Aggregated Statistics&lt;/h2&gt;

&lt;p&gt;WGM may collect statistics about the behavior of visitors to its websites or workers of its On-Demand software. For instance, WGM may gather metrics about individual Cerb5 instances like the number of workers, addresses, conversations, messages, and attachments; the composition of file attachments such as distributions of sizes or file types; or the amount of activity over a given time period. This information is used to improve the usability and performance of products and services provided by WGM.&lt;/p&gt;

&lt;p&gt;WGM may display this aggregate, anonymous information publicly or provide it to others. However, WGM does not disclose personally-identifying information other than as described below.&lt;/p&gt;

&lt;h2&gt;Protection of Certain Personally-Identifying Information&lt;/h2&gt;

&lt;p&gt;WGM discloses potentially personally-identifying and personally-identifying information only to those of its employees, contractors and affiliated organizations that (i) need to know that information in order to process it on WGM's behalf or to provide products and services available at WGM's websites, and (ii) that have agreed not to disclose it to others. Some of those employees, contractors and affiliated organizations may be located outside of your home country; by using WGM's websites, you consent to the transfer of such information to them. WGM will not rent or sell potentially personally-identifying and personally-identifying information to anyone. Other than to its employees, contractors and affiliated organizations, as described above, WGM discloses potentially personally-identifying and personally-identifying information only in response to a subpoena, court order or other governmental request, or when WGM believes in good faith that disclosure is reasonably necessary to protect the property or rights of WGM, third parties or the public at large.&lt;/p&gt;

&lt;p&gt;If you are a registered user of a WGM product or service like Cerb5 and have supplied your email address, WGM may occasionally send you an email to tell you about new features, solicit your feedback, or just keep you up to date with what's going on with WGM and our products. We primarily use our social network profiles to communicate this type of information, so we expect to keep this type of email to a minimum. If you send us a request (for example via a support email or via one of our feedback mechanisms), we reserve the right to publish it in order to help us clarify or respond to your request or to help us support other users. WGM takes all measures reasonably necessary to protect against the unauthorized access, use, alteration or destruction of potentially personally-identifying and personally-identifying information.&lt;/p&gt;

&lt;h2&gt;Third-Party Data Centers, Cloud Computing, and Virtualization&lt;/h2&gt;

&lt;p&gt;WGM provisions, administers, and maintains servers remotely in various data centers throughout the world and WGM does not maintain a physical presence in any of them. Most On-Demand services are currently provided from machines exclusively leased and operated by WGM from SoftLayer in their Seattle and Dallas facilities. However, other services, like our project portal, are provided from virtual servers in cloud computing and storage environments at Amazon Web Services, Linode, and Slicehost (Rackspace Cloud). In virtual environments, many users from various organizations share a pool of resources like computational power and storage capacity, although provisioned resources are isolated from one another to a similar degree as leased machines in a datacenter.&lt;/p&gt;

&lt;p&gt;Due to the remote nature of leased servers, colocation, cloud computing, and virtualization, authorized technicians from our vendors and service providers may have temporary access to our servers in order to perform physical maintenance and upgrades, or to provide hands-on assistance with troubleshooting issues like RAID degradation and hardware failures.&lt;/p&gt;

&lt;p&gt;In such events we defer to upstream privacy policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.softlayer.com/legal/privacy"&gt;http://www.softlayer.com/legal/privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/privacy/"&gt;http://aws.amazon.com/privacy/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slicehost.com/privacy"&gt;http://www.slicehost.com/privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.linode.com/privacy.cfm"&gt;http://www.linode.com/privacy.cfm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rackspace.com/information/legal/privacystatement.php"&gt;http://www.rackspace.com/information/legal/privacystatement.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Backups&lt;/h2&gt;

&lt;p&gt;If you communicate with WGM, or use On-Demand services provided by WGM, your information will be copied regularly for the express purpose of maintaining backups for continuity and disaster recovery. Nightly backups and redundant storage are kept on machines controlled remotely by WGM. Backups may be transferred to Amazon's Simple Storage Service (S3) for long-term, off-site archival. Upon cancellation, we will comply with authorized client requests for all backups to be immediately destroyed. Otherwise, these backups may be retained for a period of months or years to provide the capability for a customer to resume service at a future date.&lt;/p&gt;

&lt;h2&gt;Testimonials&lt;/h2&gt;

&lt;p&gt;WGM displays a list of clients and testimonials on our websites. We do not disclose the names of licensed organizations, or their representatives, without explicit permission, except in the event that a client freely discloses their identity through postings on public forums or social networks.&lt;/p&gt;

&lt;h2&gt;Cookies&lt;/h2&gt;

&lt;p&gt;A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the website each time the visitor returns. WGM uses cookies to help WGM identify and track visitors, their usage of WGM website, and their website access preferences. Visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using WGM's websites, with the drawback that certain features of WGM's websites may not function properly without the aid of cookies. Web-based products like Cerb5 require cookies to be enabled, although their use is limited to maintaining a logged-in session within the software.&lt;/p&gt;

&lt;h2&gt;Business Transfers&lt;/h2&gt;

&lt;p&gt;If WGM, or substantially all of its assets were acquired, or in the unlikely event that WGM goes out of business or enters bankruptcy, user information would be one of the assets that is transferred or acquired by a third party. You acknowledge that such transfers may occur, and that any acquirer of WGM may continue to use your personal information as set forth in this policy.&lt;/p&gt;

&lt;h2&gt;Ads&lt;/h2&gt;

&lt;p&gt;In the rare event that ads appear in any of our applications or on any of our websites, they may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by WGM and does not cover the use of cookies by any advertisers.&lt;/p&gt;

&lt;h2&gt;Privacy Policy Changes&lt;/h2&gt;

&lt;p&gt;Although most changes are likely to be minor, WGM may change its Privacy Policy from time to time, and in WGM's sole discretion. WGM encourages visitors to frequently check this page for any changes to its Privacy Policy. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;This privacy policy is available under a &lt;a href="http://creativecommons.org/licenses/by-sa/2.5/"&gt;Creative Commons Sharealike&lt;/a&gt; license derived from original groundwork by &lt;a href="http://automattic.com/privacy/"&gt;Automattic&lt;/a&gt;. WGM has no professional affiliation with Automattic.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/72</link><pubDate>Thu, 01 Sep 2011 09:20:32 GMT</pubDate><guid isPermaLink="false">933b8d44d1640aedf607d6cf92efea5a</guid></item><item><title>Switching a Cerb5 installation from Subversion to Git</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Prior to the release of Cerb5, the official recommendation was to use Subversion for installing and upgrading the app.  This made sense years ago when support wasn't prevalent for the next generation of distributed version control tools like &lt;a href="http://git-scm.com"&gt;Git&lt;/a&gt;.  Today, Git is available for all major platforms.  Our official repositories are managed with Git and collaboration is provided through &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;If you're still using Subversion to manage your Cerb5 installation, we highly recommend that you migrate to Git.&lt;/p&gt;

&lt;p&gt;As of January 2012 we have discontinued hosting our own Subversion repositories.  If for some reason you are unable to use Git, you can &lt;a href="http://www.cerberusweb.com/support/kb/article/90-Switching_to_the_new_Subversion_repository_hosted_by_GitHub"&gt;switch to our new Subversion repository at GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Make the change&lt;/h1&gt;

&lt;p&gt;Move your existing Cerb5 installation to a directory named &lt;code&gt;cerb5-svn&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Make a backup&lt;/h2&gt;

&lt;p&gt;Make a recent backup using the instructions here:&lt;br&gt;
&lt;a href="http://wiki.cerb5.com/wiki/Backups"&gt;http://wiki.cerb5.com/wiki/Backups&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Keep local modifications&lt;/h2&gt;

&lt;p&gt;Change directory to your existing files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd cerb5-svn
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Make a patch of your local modifications:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;svn diff &amp;gt; my_changes.patch
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Find your existing version&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;grep "APP_VERSION" -m 1 api/Application.class.php
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Download the same version of Cerb5 with Git&lt;/h2&gt;

&lt;p&gt;Return to the parent directory where &lt;code&gt;cerb5-svn&lt;/code&gt; is located:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ..
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perform a fresh checkout of the Cerb5 project files from Git &lt;em&gt;using the same version&lt;/em&gt;.  Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; in the command below with the version number from the previous section above with the following convention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;5.5.0&lt;/code&gt; -&gt; &lt;code&gt;5.5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5.5.2&lt;/code&gt; -&gt; &lt;code&gt;5.5.2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, if the version ends in &lt;code&gt;.0&lt;/code&gt; then just include the first two numbers.&lt;/p&gt;

&lt;p&gt;Checkout the latest version of Cerb5 from GitHub using Git:  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone -b &amp;lt;version&amp;gt; git://github.com/wgm/cerb5.git cerb5-git
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Merge the copies&lt;/h2&gt;

&lt;p&gt;Remove the &lt;code&gt;.svn&lt;/code&gt; subdirectories from &lt;code&gt;storage&lt;/code&gt; and then move it to &lt;code&gt;cerb5-git&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;find cerb5-svn/storage -type d -name '.svn' -exec rm -Rf {} \;

mv -n cerb5-svn/storage/* cerb5-git/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can then apply your patch to the new files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cp cerb5-svn/my_changes.patch cerb5-git

cd cerb5-git

patch -p0 &amp;lt; my_changes.patch

rm my_changes.patch
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Finish up&lt;/h2&gt;

&lt;p&gt;If you placed any &lt;em&gt;custom&lt;/em&gt; plugins in the &lt;code&gt;/features&lt;/code&gt; directory, move them from &lt;code&gt;cerb5-svn/features&lt;/code&gt; to &lt;code&gt;cerb5-git/storage/plugins&lt;/code&gt;.  This is where all custom plugins should go in the future.  Be careful to &lt;strong&gt;not&lt;/strong&gt; copy any official plugins.&lt;/p&gt;

&lt;p&gt;Move or rename the &lt;code&gt;cerb5-git&lt;/code&gt; directory back to your desired location.&lt;/p&gt;

&lt;p&gt;Make sure all the files are owned and readable by the webserver user, and the &lt;code&gt;/storage&lt;/code&gt; directory and its contents are owned and writeable+readable by the webserver user.&lt;/p&gt;

&lt;p&gt;This might be a good time to &lt;a href="http://cerberusweb.com/support/kb/article/70-Upgrading_to_the_latest_stable_version_of_Cerb5_using_Git"&gt;upgrade to the latest version using Git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Open Cerb5 in your web browser.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/71</link><pubDate>Wed, 14 Mar 2012 22:59:40 GMT</pubDate><guid isPermaLink="false">5bf0db4d3b80aa0c6f65419a067ec63e</guid></item><item><title>Upgrading to the latest stable version of Cerb5 using Git</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;If you installed Cerb5 from &lt;a href="https://github.com/wgm/cerb5"&gt;GitHub&lt;/a&gt; using Git then the process of updating to a new version is simple and straightforward.  If you're using Subversion, you can &lt;a href="http://cerberusweb.com/support/kb/article/71-Switching_a_Cerb5_installation_from_Subversion_to_Git"&gt;switch to Git with these instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You won't need to copy your &lt;code&gt;framework.config.php&lt;/code&gt; or &lt;code&gt;storage&lt;/code&gt; directories.  Everything will be upgraded in place.&lt;/p&gt;

&lt;h1&gt;Check your license expiration&lt;/h1&gt;

&lt;p&gt;First, verify that your license is valid for the latest version.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/70/license_check.png" alt="" title=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;em&gt;Setup-&gt;Settings-&gt;License&lt;/em&gt; in Cerb5.&lt;/li&gt;
&lt;li&gt;Check the date for &lt;strong&gt;Software Updates Expire:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;If it's in the future, you're all set.  Continue to the next section.&lt;/li&gt;
&lt;li&gt;If it's in the past, you either need to &lt;a href="http://cerberusweb.com/buy/onsite"&gt;renew your license&lt;/a&gt; or upgrade to the latest version covered by your license.  You can check approximate release dates from our profile on &lt;a href="http://freshmeat.net/projects/cerberushelpdesk"&gt;Freshmeat&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Make a backup&lt;/h1&gt;

&lt;p&gt;Refer to the instructions here to make a recent backup:&lt;br&gt;
&lt;a href="http://wiki.cerb5.com/wiki/Backups"&gt;http://wiki.cerb5.com/wiki/Backups&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Updating the project files&lt;/h1&gt;

&lt;p&gt;We recommend creating a new branch for each version of the project.  With a branch per version you can make an informed decision about which of your modifications and hacks to carry over.  Some of your modifications to the project files may not make sense in the latest version because your feedback was implemented.&lt;/p&gt;

&lt;p&gt;You're perfectly welcome to modify the main project files, but the officially recommended way to extend the software is to take advantage of our comprehensive plugin system.  Using plugins, your changes will be easily portable between versions or environments.&lt;/p&gt;

&lt;p&gt;Let's proceed with the upgrade by creating a new version branch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a console on your server and change to the directory of your Cerb5 installation.&lt;/li&gt;
&lt;li&gt;First, you'll want to &lt;em&gt;stash&lt;/em&gt; your local changes to files like &lt;code&gt;framework.config.php&lt;/code&gt;, which will make merging changes easier:&lt;br&gt;
&lt;code&gt;git stash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Find the name of the remote repository.  In most cases this will be &lt;strong&gt;origin&lt;/strong&gt; by default.  You can verify this with:&lt;br&gt;
&lt;code&gt;git remote&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fetch the branches from the remote server:&lt;br&gt;
&lt;code&gt;git fetch origin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;From here you can decide which version to upgrade to:&lt;br&gt;
&lt;code&gt;git branch -r&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add a new local branch for the desired version:&lt;br&gt;
&lt;code&gt;git branch --track 5.5.2 origin/5.5.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Switch to the new version branch:&lt;br&gt;
&lt;code&gt;git checkout 5.5.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Re-apply your local stashed changes:&lt;br&gt;
&lt;code&gt;git stash pop&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: If you'd prefer to use a single branch instead of one branch per version, you can use the &lt;em&gt;stable&lt;/em&gt; branch instead of a version number.  This branch will always contain the files for the most recent release, but you may have to manually merge conflicts if you've made changes to the code.&lt;/p&gt;

&lt;h1&gt;In the event of conflicts...&lt;/h1&gt;

&lt;p&gt;If your &lt;em&gt;stashed&lt;/em&gt; changes were non-trivial then you may run into a situation where your changes conflict with our changes in the new version.&lt;/p&gt;

&lt;p&gt;In such a situation you can decide to merge the changes by hand, using a command like &lt;code&gt;git mergetool&lt;/code&gt;, or you can simply reset such files to their default state with &lt;code&gt;git checkout -- &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;Permissions&lt;/h1&gt;

&lt;p&gt;It is possible that using version control systems like Git and Subversion will modify your file permissions.  You should verify that all files are owned and readable by your webserver user, and that the &lt;code&gt;/storage&lt;/code&gt; directory and its contents are owned and readable+writeable by your webserver user.&lt;/p&gt;

&lt;h1&gt;Upgrading the database&lt;/h1&gt;

&lt;p&gt;Once your files are updated to a new version, Cerb5 automatically brings your database up to date and migrates any relevant data to new formats.  For a major upgrade there will almost always be changes to the database.  This section may not apply for smaller maintenance updates like the changes between &lt;code&gt;5.5.1&lt;/code&gt; and &lt;code&gt;5.5.2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To start the database upgrade process you simply need to navigate to your helpdesk using a browser.  You can also initiate this process manually by opening the &lt;code&gt;/update&lt;/code&gt; page.  For example, if your helpdesk is located at &lt;code&gt;http://example.com/cerb5/&lt;/code&gt; then you would open &lt;code&gt;http://example.com/cerb5/update&lt;/code&gt; in your browser.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: If you aren't using friendly URLs, then you would navigate to &lt;code&gt;http://example.com/cerb5/index.php/update&lt;/code&gt; instead.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once the database is upgraded then you'll be returned to your login form and you can resume using the helpdesk.&lt;/p&gt;

&lt;h1&gt;Purge the /install directory&lt;/h1&gt;

&lt;p&gt;Make sure the &lt;code&gt;/install&lt;/code&gt; directory is deleted.  It is possible for version control systems like Git to restore this directory during an upgrade.&lt;/p&gt;

&lt;h1&gt;Updating Community Portals&lt;/h1&gt;

&lt;p&gt;If you have Community Portals in use, like the Support Center, then it's a good idea to make sure they're using the latest version of the deployed &lt;code&gt;index.php&lt;/code&gt; file.  This file rarely changes, but you will experience subtle and difficult to diagnose problems if it does change and you don't update your portals.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;em&gt;Setup-&gt;Community Portals-&gt;Configure&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;For each Community Portal, click on it and open the &lt;em&gt;Installation&lt;/em&gt; tab.&lt;/li&gt;
&lt;li&gt;Copy the contents of &lt;code&gt;index.php&lt;/code&gt; to the location where your portal is installed.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/70/portal_install.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;All done!&lt;/h1&gt;

&lt;p&gt;You should be all set to take advantage of our latest improvements.  Be sure to &lt;a href="http://wiki.cerb5.com/wiki/Category:Changelog"&gt;review the list of changes for the new version&lt;/a&gt;.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/70</link><pubDate>Tue, 10 Jan 2012 07:29:47 GMT</pubDate><guid isPermaLink="false">c7b4fdaef8fdd743a0bb26add65d7d94</guid></item><item><title>Integrating Facebook comments with knowledgebase articles in the Support Center</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Facebook provides a &lt;a href="http://developers.facebook.com/docs/reference/plugins/comments/"&gt;Comments Box plugin&lt;/a&gt; that allows visitors to leave comments on your site using their Facebook account.  A commenter has the option of sharing the comment on their wall, which links to your content so that other people in their network can discover you.&lt;/p&gt;

&lt;h1&gt;Instructions&lt;/h1&gt;

&lt;h2&gt;Create a Facebook app for your Support Center&lt;/h2&gt;

&lt;p&gt;While creating a Facebook App for your Support Center is not strictly required, doing so gives you an easier way to designate moderators and manage comments.  If you already have a Facebook App that you'd like to use you can skip ahead.&lt;/p&gt;

&lt;p&gt;If you need to create a new Facebook App:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit &lt;a href="https://developers.facebook.com/apps"&gt;https://developers.facebook.com/apps&lt;/a&gt; and log in if necessary.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create New App&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/68/fb_create_app_button.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Enter the requested information.  The majority of the settings won't matter for the purpose of enabling comments in your Support Center's knowledgebase.&lt;/li&gt;
&lt;li&gt;Once complete, you'll be given an &lt;em&gt;Application ID&lt;/em&gt;.  Make a note of this number since you will need it below.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/68/fb_create_app_page.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Modifying your Support Center with custom templates&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Setup&lt;/em&gt; on the right of the global navigation menu.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Community Portals&lt;/em&gt; menu and select &lt;em&gt;Configure&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/68/sc_community_portals_menu.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the Support Center where you want to enable comments using Facebook.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Custom Templates&lt;/em&gt; tab.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/68/sc_custom_templates_tab.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First we need to add your Facebook App ID to the META headers of your Support Center.  This instructs Facebook that you are the administrator of the site for moderation and configuration purposes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Add Custom Template&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select the template &lt;strong&gt;[cerberusweb.support&amp;#95;center] support&amp;#95;center/index.tpl&lt;/strong&gt; and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below the line &lt;code&gt;&amp;lt;HEAD&amp;gt;&lt;/code&gt;, insert:  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property="fb:app_id" content="{YOUR_APPLICATION_ID}"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Replace &lt;code&gt;{YOUR_APPLICATION_ID}&lt;/code&gt; with your Facebook App's ID.  This information is available from &lt;a href="https://developers.facebook.com/apps"&gt;https://developers.facebook.com/apps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;

&lt;p&gt;Now we need to add the comment box below the content of each knowledgebase article:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add Custom Template&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select template: &lt;strong&gt;[cerberusweb.kb] support&amp;#95;center/kb/article.tpl&lt;/strong&gt; and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the very bottom of the template, right above the last line of &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;, insert:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id="fb-root"&amp;gt;&amp;lt;/div&amp;gt;  
&amp;lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;fb:comments  
    href="{devblocks_url}c=kb&amp;amp;p=article&amp;amp;id={$article-&amp;gt;id}{/devblocks_url}"   
    num_posts="2"  
    width="500"&amp;gt;
&amp;lt;/fb:comments&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/p&gt;

&lt;h2&gt;Test it!&lt;/h2&gt;

&lt;p&gt;Browse to an article in your Support Center's knowledgebase.  You should now see a Facebook comment box; just like the one at the bottom of this article.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/68</link><pubDate>Tue, 30 Aug 2011 11:02:31 GMT</pubDate><guid isPermaLink="false">bfd184872c269859e57883fdcd068da6</guid></item><item><title>Setting up a Cerb5 local development environment</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;We recommend that each developer maintains a local web environment on their development machine with a self-contained webserver, database, and dummy mail server.  This article will explain how to accomplish this using the same toolset as the official developers.&lt;/p&gt;

&lt;h1&gt;Installing Eclipse as your Integrated Development Environment (IDE)&lt;/h1&gt;

&lt;p&gt;We recommend using Eclipse as your IDE, along with the PHP Development Tools (PDT) plugin.&lt;/p&gt;

&lt;p&gt;There was no PDT package for the latest Eclipse 3.7 (Indigo) release, so you'll need to download Eclipse Classic and then install the PDT plugin manually.&lt;/p&gt;

&lt;h2&gt;Installing Eclipse&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.eclipse.org/downloads/"&gt;Download Eclipse Classic&lt;/a&gt; for your platform.&lt;/li&gt;
&lt;li&gt;Extract it.&lt;/li&gt;
&lt;li&gt;Run it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll be prompted to create a new workspace directory (e.g. "php5-workspaces").  Choose a location that is convenient for you; it does not need to be in the same place where your web-accessible files are located.&lt;/p&gt;

&lt;h2&gt;Installing PDT&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;em&gt;Help&lt;/em&gt; menu and select &lt;em&gt;Install New Software&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Work With:&lt;/em&gt; dropdown, select "Indigo - http://download.eclipse.org/releases/indigo"&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;filter&lt;/em&gt; box, type "pdt" and hit ENTER.&lt;/li&gt;
&lt;li&gt;Check "PHP Development Tools" under &lt;em&gt;Programming Languages&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Next&lt;/em&gt; button twice.&lt;/li&gt;
&lt;li&gt;Accept the software terms and click the &lt;em&gt;Finish&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;When prompted to restart Eclipse, select &lt;em&gt;Restart Now&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/eclipse_install_pdt.png" alt="" title=""&gt;&lt;/p&gt;

&lt;h1&gt;Installing a web environment with Apache, MySQL, and PHP&lt;/h1&gt;

&lt;p&gt;Your local development machine should have the following services available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webserver (e.g. Apache, Nginx, lighttpd, IIS)&lt;/li&gt;
&lt;li&gt;MySQL Server 5.x+&lt;/li&gt;
&lt;li&gt;PHP 5.2+

&lt;ul&gt;
&lt;li&gt;Extensions: curl, imap, mailparse, mbstring&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are countless ways to install and maintain a local server:&lt;/p&gt;

&lt;h2&gt;XAMPP&lt;/h2&gt;

&lt;p&gt;One of the easiest ways to install a local webserver for PHP development is to use &lt;a href="http://www.apachefriends.org/en/xampp.html"&gt;XAMPP&lt;/a&gt;.  This will provide Apache, MySQL, and PHP.  Installers are available for Linux, Mac OS X, Solaris, and Windows.&lt;/p&gt;

&lt;h2&gt;MacPorts&lt;/h2&gt;

&lt;p&gt;If you're using a Mac, you can use &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; to install these applications in &lt;code&gt;/opt&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install apache2 php5 mysql5-server
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Unix&lt;/h2&gt;

&lt;p&gt;If you're using a Unix-based operating system, use your distribution's package manager (e.g. apt-get, yum) to install these applications.&lt;/p&gt;

&lt;p&gt;In Debian/Ubuntu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get install apache2 mysql-server php5
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Installing a dummy mail server&lt;/h1&gt;

&lt;p&gt;Your development machine can use an existing mailserver, although you often want to remove the possibility of accidentally sending test messages to real recipients; especially if you're developing using a copy of your live data.  This is best accomplished with a dummy SMTP server on a non-standard port (e.g. &lt;code&gt;2525&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;There are a couple different options for a fake mail server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install &lt;a href="http://www.postfix.org/"&gt;Postfix&lt;/a&gt; using your package manager and set up a null transport.&lt;/li&gt;
&lt;li&gt;If you're using a Mac, install our &lt;a href="https://github.com/jstanden/fakesmtp-app"&gt;FakeSMTP&lt;/a&gt; project.  This will listen for SMTP connections on an arbitrary port (&lt;code&gt;2525&lt;/code&gt; by default) and provide an easy way to inspect outgoing mail without actually delivering anything.&lt;/li&gt;
&lt;li&gt;Python provides a dummy SMTP server by default:&lt;br&gt;
&lt;code&gt;sudo python -m smtpd -n -c DebuggingServer localhost:2525&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Installing Git&lt;/h1&gt;

&lt;p&gt;We use &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; for distributed source control and versioning.  You can test if Git is currently installed by running the command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git --version
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If Git is not installed, you can download the latest version for your platform from:  &lt;a href="http://git-scm.com/download"&gt;http://git-scm.com/download&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Pulling the project files from GitHub&lt;/h1&gt;

&lt;p&gt;Our &lt;a href="https://github.com/wgm/cerb5"&gt;project&lt;/a&gt; and &lt;a href="https://github.com/cerb5-plugins/repositories"&gt;plugins repositories&lt;/a&gt; are hosted on &lt;a href="http://www.github.com"&gt;GitHub&lt;/a&gt;.  You don't need a GitHub account to simply download our project files, but we recommend creating one so you can take advantage of the collaborative tools.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the web-accessible directory for the appropriate virtual host (or default) of your local webserver.  For example, if you're using Apache this path is usually something like &lt;code&gt;/var/www/&lt;/code&gt;.  In Windows Server with IIS it may be &lt;code&gt;C:\Inetpub\&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Selecting a repository&lt;/h2&gt;

&lt;p&gt;We have two main repositories for the project.  The &lt;strong&gt;wgm/cerb5.git&lt;/strong&gt; repository is a &lt;em&gt;fork&lt;/em&gt; of &lt;strong&gt;jstanden/cerb5.git&lt;/strong&gt;.  The &lt;strong&gt;jstanden&lt;/strong&gt; repository is where development and integration actually take place.  During a stable release, the progress from &lt;strong&gt;jstanden&lt;/strong&gt; is &lt;em&gt;pushed&lt;/em&gt; to the &lt;strong&gt;wgm&lt;/strong&gt; repository for public consumption.  Most people will only need to use the latter.&lt;/p&gt;

&lt;h3&gt;If you're only developing third-party plugins...&lt;/h3&gt;

&lt;p&gt;If you only intend to work on your own custom plugins then you can anonymously use our repositories.&lt;/p&gt;

&lt;p&gt;For access to stable releases, issue the following command at the console:&lt;br&gt;
  &lt;code&gt;git clone https://github.com/wgm/cerb5.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Otherwise, for access to development builds, issue the following command instead:&lt;br&gt;
  &lt;code&gt;git clone https://github.com/jstanden/cerb5.git&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;If you plan to contribute to Cerb5, and work on plugins...&lt;/h3&gt;

&lt;p&gt;If you plan to contribute patches (e.g. bug fixes) to the Cerb5 project, in addition to working on custom plugins, we recommend that you &lt;em&gt;fork&lt;/em&gt; the project on GitHub.  This will create your own copy of our official repository that you can &lt;em&gt;commit&lt;/em&gt; (save) your changes to.  It also makes it easier for us to view and integrate those changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/signup/free"&gt;Create a free account at GitHub&lt;/a&gt; if you don't already have one.&lt;/li&gt;
&lt;li&gt;Once logged in, browse to &lt;a href="https://github.com/jstanden/cerb5"&gt;https://github.com/jstanden/cerb5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Fork&lt;/em&gt; button in the top right.  This will create your own personal repository for making modifications to Cerb5.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/github_fork_button.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When your repository is created, use the credentials from the SSH section on your page at GitHub to download your files.&lt;/p&gt;

&lt;p&gt;For example (replace &lt;code&gt;&amp;lt;you&amp;gt;&lt;/code&gt; with your account at GitHub):  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone git@github.com:&amp;lt;you&amp;gt;/cerb5.git
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Git graphical user interfaces&lt;/h2&gt;

&lt;p&gt;You can also use a graphical Git client like &lt;a href="http://code.google.com/p/tortoisegit/"&gt;TortoiseGit&lt;/a&gt; for Windows or &lt;a href="http://www.git-tower.com/"&gt;Tower.app&lt;/a&gt; for Mac; however, it is worth becoming proficient with the command line interface to Git since it will always provide you with full functionality.  Git also comes with a simple GUI for managing your repository which can be accessed with the &lt;code&gt;git gui&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;At WebGroup Media (WGM), we develop on Macs and use GitX to make it easy to visually audit changes before staging and committing them.  Everything else is accomplished from the command line.&lt;/p&gt;

&lt;h1&gt;Importing the Cerb5 project in Eclipse&lt;/h1&gt;

&lt;p&gt;At this point, you will have a copy of the project in a web-accessible path.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Eclipse.&lt;/li&gt;
&lt;li&gt;Open the &lt;em&gt;File&lt;/em&gt; menu and select &lt;em&gt;Import&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/eclipse_pkg_explorer_import.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Expand &lt;em&gt;General&lt;/em&gt; and select &lt;em&gt;Existing Projects into Workspace&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/eclipse_import_existing.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Next&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Browse&lt;/em&gt; button next to &lt;em&gt;Select root directory:&lt;/em&gt; and select the &lt;code&gt;cerb5&lt;/code&gt; directory from your webserver's web-accessible path.  Click the &lt;em&gt;Open&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;The Cerb5 project should automatically be detected by Eclipse.  Click the &lt;em&gt;Finish&lt;/em&gt; button at the bottom of the popup window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It may take a few minutes to index the project the first time you open it.  This process will enable many useful features like API autocompletion.&lt;/p&gt;

&lt;h1&gt;Configuring Eclipse for PHP development&lt;/h1&gt;

&lt;h2&gt;Perspective&lt;/h2&gt;

&lt;p&gt;If you see something other than &lt;em&gt;PHP&lt;/em&gt; for the perspective in the top right, open the &lt;em&gt;Window&lt;/em&gt; menu, select &lt;em&gt;Open Perspective-&gt;Other...&lt;/em&gt; and double-click &lt;em&gt;PHP&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;*.tpl files&lt;/h2&gt;

&lt;p&gt;Our Smarty-based template files use the *.tpl file extension, which is not associated with the HTML editor in Eclipse by default.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Eclipse's preferences.&lt;/li&gt;
&lt;li&gt;Expand &lt;em&gt;General&lt;/em&gt; from the tree on the left and select &lt;em&gt;Content Types&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Expand &lt;em&gt;Text&lt;/em&gt; on the right and select &lt;em&gt;HTML&lt;/em&gt;.  Click the &lt;em&gt;Add&lt;/em&gt; button below, enter &lt;code&gt;*.tpl&lt;/code&gt; and click the &lt;em&gt;OK&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;OK&lt;/em&gt; button at the bottom of the popup window.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Validation&lt;/h2&gt;

&lt;h3&gt;HTML&lt;/h3&gt;

&lt;p&gt;By default, Eclipse PDT will output several HTML validation warnings.  To suppress these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open up Eclipse's &lt;em&gt;Properties&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;Validation&lt;/em&gt; from the tree on the left of the popup.&lt;/li&gt;
&lt;li&gt;Click the "&lt;strong&gt;...&lt;/strong&gt;" button to the right of _HTML Syntax Validator`.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/eclipse_prefs_validation_html.png" alt="" title=""&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Add Exclude Group&lt;/em&gt; button to the right of the popup.&lt;/li&gt;
&lt;li&gt;Highlight &lt;em&gt;Exclude Group&lt;/em&gt; on the left and click the &lt;em&gt;Add Rule...&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;File Extension&lt;/em&gt; and click the &lt;em&gt;Next&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Enter the extension &lt;code&gt;tpl&lt;/code&gt; and click the &lt;em&gt;Finish&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;OK&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Click the "&lt;strong&gt;...&lt;/strong&gt;" button to the right of _HTML Syntax Validator (for PHP Files)`.

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Add Exclude Group&lt;/em&gt; button to the right of the popup.&lt;/li&gt;
&lt;li&gt;Highlight &lt;em&gt;Exclude Group&lt;/em&gt; on the left and click the &lt;em&gt;Add Rule...&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;Folder or File Name&lt;/em&gt; and click the &lt;em&gt;Next&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Enter the filename &lt;code&gt;devblocks-dao.php&lt;/code&gt; and click the &lt;em&gt;Finish&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;OK&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;OK&lt;/em&gt; button at the bottom of the popup and let Eclipse refresh validation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;XML&lt;/h3&gt;

&lt;p&gt;There will also be a few XML validation errors from &lt;code&gt;cerb5_lang_*.xml&lt;/code&gt; translation files due to missing schemas.  To suppress these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Eclipse's preferences.&lt;/li&gt;
&lt;li&gt;Expand &lt;em&gt;XML-&gt;XML Files&lt;/em&gt; in the tree on the left and select &lt;em&gt;Validation&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;On the &lt;em&gt;No grammar specified&lt;/em&gt; option change &lt;em&gt;Warning&lt;/em&gt; to &lt;em&gt;Ignore&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/66/eclipse_prefs_xml_grammar.png" alt="" title=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;OK&lt;/em&gt; button and let Eclipse refresh validation.&lt;/li&gt;
&lt;/ol&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/66</link><pubDate>Tue, 11 Oct 2011 18:35:39 GMT</pubDate><guid isPermaLink="false">e6e53d5faa4e98774295268032fc716c</guid></item><item><title>Automatically closing conversations that wait too long for a contact reply</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;The &lt;em&gt;'waiting for reply'&lt;/em&gt; status on conversations provides a simple way to de-clutter by temporarily hiding conversations that need a response from one of your contacts before continuing.  Generally, things that are &lt;em&gt;waiting for reply&lt;/em&gt; either are awaiting additional information, or they require a confirmation from the contact that their issue has been adequately resolved.  In the latter case, some contacts will never write back to let you know that their issue is fixed.  It's not preferable to keep conversations in &lt;em&gt;waiting for reply&lt;/em&gt; status forever, and it's tedious to constantly follow-up with each one before closing it.&lt;/p&gt;

&lt;p&gt;With Virtual Attendants and scheduled behavior you can automate the lifecycle of conversations that are waiting for reply.  In this article we'll build a custom behavior to close an idle conversation after 3 days if a worker never hears back from a contact.  For simplicity of demonstration, we'll also automatically schedule this behavior every time a worker replies to a conversation.  In practice, your team may want to confine the use of auto-close behavior to only situations where you feel you have satisfactorily addressed the issue but want to give contacts a couple days to let you know if they need additional help.  This is especially useful in an environment that charges contacts &lt;em&gt;per incident&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The following examples may seem overly complex for the objective of closing tickets that are left waiting too long; and it's true that you could simply run a bulk update from search results, or create a plugin that runs a simple SQL query in the database.  The important thing to realize with this approach is the level of customizability you have in configuring Virtual Attendant behavior.  This is often called "emergent behavior" because you are creatively using a set of existing tools to solve new problems.  If we provided a rigid feature to automatically close waiting tickets, you may want two warnings before closing tickets and we may have only provided the option for one; or you may want to notify customers through a method other than email, and you'd have to modify the source code yourself (causing problems during future updates).&lt;/p&gt;

&lt;p&gt;Virtual Attendants allow you to build complex business automation behavior without touching a single line of code.  The experience you gain by learning to take advantage of them will free you from "one size fits all" solutions that force you to adapt to the narrow confines of features.  Instead you will mold Cerb5 to work in the way most convenient for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE: This functionality requires Cerb5 version 5.5 or later.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Configuring the group Virtual Attendant&lt;/h1&gt;

&lt;p&gt;We'll need to define two custom behaviors.  One will send our contact a notification about the impending closure of their ticket.  The second one will actually close it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;em&gt;groups&lt;/em&gt; from the top right of the navigation menu.&lt;/li&gt;
&lt;li&gt;Select the group where you want to automatically close tickets that wait too long.&lt;/li&gt;
&lt;li&gt;Click on the &lt;em&gt;Virtual Attendants&lt;/em&gt; tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Creating the auto-close behavior&lt;/h2&gt;

&lt;p&gt;We'll create the auto-close behavior first.  It's common to build a series of dependent behaviors in reverse order because each behavior needs to schedule the one that follows it.  If that concept doesn't make sense it should by the end of the example.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Create Behavior&lt;/em&gt; button.  Enter the following details before clicking &lt;em&gt;Save Changes&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_behavior_close.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click the new event node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.  Title the new decision "Is it waiting for reply?" and &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the new decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_close_outcome.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the new &lt;em&gt;'Yes'&lt;/em&gt; outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following actions before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_close_actions.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Creating the idleness warning behavior&lt;/h2&gt;

&lt;p&gt;We could use the existing behavior as-is, but it's probably preferable to give our contacts a warning before we automatically close the conversation.  Now we'll create a new behavior that sends an idleness warning and then schedules the auto-close behavior that we created above.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Create Behavior&lt;/em&gt; button.  Enter the following details before clicking the &lt;em&gt;Save Changes&lt;/em&gt; button.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_behavior_idle.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Click on the new event node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.  Title it &lt;em&gt;"Is it waiting for reply?"&lt;/em&gt; and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the new decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details and then &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_idle_outcome.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the new outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following details before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_idle_actions.png" alt=""&gt;&lt;br&gt;
Notice in the &lt;em&gt;"If duplicate behavior is scheduled"&lt;/em&gt; section we've selected &lt;em&gt;"Only schedule latest occurrence"&lt;/em&gt;.  In the event that multiple auto-close behaviors are scheduled we only want to use the one with the latest date to give our contact the most time to reply.  This may happen if the contact only replies when they receive the idleness warning, and this goes on through several exchanges.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Scheduling the idleness warning behavior after worker replies&lt;/h1&gt;

&lt;p&gt;At this point you could manually schedule the idleness warning behavior from each record or by using bulk update on a worklist.  To simplify things, let's automatically schedule the behavior every time a worker replies to a group conversation and marks it as &lt;em&gt;waiting for reply&lt;/em&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Create Behavior&lt;/em&gt; button and enter the following details before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_behavior_schedule.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Click the event node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.  Title it "Is it waiting for reply?" and click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the new decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_schedule_outcome.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the new &lt;em&gt;'Yes'&lt;/em&gt; outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following actions before clicking &lt;em&gt;Save Changes&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_schedule_actions.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now when your workers reply to a conversation and mark it as &lt;em&gt;waiting for reply&lt;/em&gt;, an idleness warning will be scheduled for 3 days in the future.  If the contact doesn't reply within 3 days the idleness warning will be sent and an auto-close behavior will be scheduled for 2 days in the future.  If the contact still doesn't reply within 2 additional days the conversation will be closed and the contact will be notified.  If the contact replies at any point the scheduled behavior will be ignored.&lt;/p&gt;

&lt;h1&gt;Unscheduling behavior to restart the chain of events&lt;/h1&gt;

&lt;p&gt;You can explicitly unschedule behavior when a contact responds to a conversation. This isn't strictly necessary in this example for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our behavior ensures the status is &lt;em&gt;waiting for reply&lt;/em&gt; before doing anything.  If the ticket is reopened, or prematurely closed, our behavior will simply be ignored.&lt;/li&gt;
&lt;li&gt;If the worker and contact exchange replies several times in a row, our custom behavior will always be scheduled for 3 days in the future from the latest contact.  This replaces any earlier scheduled behavior of the same type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, it's still possible in rare situations for something like the following chain of events to occur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A worker replies to a contact's new conversation.&lt;/li&gt;
&lt;li&gt;After 3 days of idleness the contact hasn't replied and the idleness warning behavior runs, scheduling the auto-close behavior in 2 days.&lt;/li&gt;
&lt;li&gt;After a few hours the contact replies and the ticket is reopened.&lt;/li&gt;
&lt;li&gt;If the workers do nothing for nearly 2 days then the auto-close behavior will be ignored because the conversation is &lt;em&gt;open&lt;/em&gt;.  However, it's much more likely that the workers will reply almost immediately and a new idle warning will be scheduled when the conversation returns to &lt;em&gt;waiting&lt;/em&gt; status.&lt;/li&gt;
&lt;li&gt;The auto-close behavior is still scheduled.  If the ticket remains waiting for another day then the auto-close behavior would run &lt;em&gt;before&lt;/em&gt; the second idleness warning.  This is undesirable because a reply from the customer should start the whole sequence of events over again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To correct this, you can add an &lt;em&gt;Unschedule behavior&lt;/em&gt; action in one of two places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a contact replies to a conversation, clear any idleness or auto-close behavior.&lt;/li&gt;
&lt;li&gt;When a worker replies, clear any auto-close behavior since it will be added automatically by the idleness behavior.  The idleness behavior is already replacing any other instances of itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Where to go from here&lt;/h1&gt;

&lt;h2&gt;Combining the idleness warning and auto-close behavior&lt;/h2&gt;

&lt;p&gt;For simplicity this article creates several behaviors.  You could combine the idleness warning and auto-closure into a single behavior.  After determining that the conversation is &lt;em&gt;waiting for reply&lt;/em&gt; as an outcome of the first decision, a second decision could be made to determine if the message has been idle for more than 5 days, and if not, check if it has been idle for more than 3 days.  At 5 days without a contact response we'd do the auto-close actions, and at 3 days we'd do the idleness warning.  Instead of scheduling the auto-close behavior from the idleness warning we'd just reschedule the same behavior for a duration long enough to trigger the auto-close but not short enough to send the idleness warning again.  This would remove the need to unschedule the alternate behavior, but it's more complicated to understand for someone just becoming familiar with scheduled behavior loops.&lt;/p&gt;

&lt;p&gt;The combined behavior would look something like this:  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/65/new_combined_behavior.png" alt=""&gt;&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/65</link><pubDate>Mon, 08 Aug 2011 12:40:29 GMT</pubDate><guid isPermaLink="false">54eb79a576e3a66bb2bb14acd8a1d54d</guid></item><item><title>Scheduling reminders about anything using Virtual Attendants</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;We've had many requests for the ability to leave previously read notifications open as a crude reminder.  Reminders are necessary, but notifications should remain disposable so workers click on them when they pop up, instead of becoming desensitized to their novelty by always leaving a few open.&lt;/p&gt;

&lt;p&gt;Mail conversations have had the ability for quite some time to enter a &lt;em&gt;'waiting for reply'&lt;/em&gt; status until a specific future date (usually with an accompanying comment about what to do when it is revived).  If you mark a conversation as &lt;em&gt;'waiting until Monday'&lt;/em&gt; on a Friday then it serves as a reminder; however, this functionality is limited to mail when it would also be useful for records like tasks, calls, and opportunities.  It also requires conversations to be returned to &lt;em&gt;'open'&lt;/em&gt; status to serve as the reminder, which grabs the attention of all the watchers or group members instead of reminding a specific worker to do something.&lt;/p&gt;

&lt;p&gt;Tasks have also filled in for reminders in earlier versions; but without reminders about those tasks themselves you have to remember to look at your tasks all the time, and they have no way of getting your attention if you aren't logged in.  On some tasks you may want multiple reminders before the due date, and on others you may not want any.  Some tasks may be important enough you want an SMS reminder to your mobile phone -- but not about everything.&lt;/p&gt;

&lt;p&gt;Scheduled behavior in Virtual Attendants provides an elegant solution to these requirements.  You can instruct your Virtual Attendant how and when you want to be reminded about anything, and you can make these decisions for each individual record.&lt;/p&gt;

&lt;p&gt;In this example we're going to create a reusable behavior that sends a notification reminder about tasks at a future date.  The knowledge you gain from this tutorial can be applied to countless situations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE: This functionality requires Cerb5 version 5.5 or later.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Building reminder behavior using Virtual Attendants&lt;/h1&gt;

&lt;h2&gt;Creating custom behavior&lt;/h2&gt;

&lt;p&gt;The first thing we want to do is to create a custom task behavior that generates a notification as the only action.  At this point we're not concerned about a specific task or particular time to be notified.  Once we're done we'll be able to use this custom behavior for any task and schedule it to take place at any time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your personal Virtual Attendant by clicking on your name in the top right of the page and selecting &lt;em&gt;Virtual Attendant&lt;/em&gt; from the menu.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/topmenu_va.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;em&gt;Create Behavior&lt;/em&gt; button.  Enter the following details and click the &lt;em&gt;Save Changes&lt;/em&gt; button.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/selfva_create_behavior.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the new event node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following details and click the &lt;em&gt;Save Changes&lt;/em&gt; button.  Be sure to choose yourself in the "Notify:" section.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/selfva_reminder_action.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Scheduling a reminder&lt;/h1&gt;

&lt;p&gt;Now that you have a custom behavior that creates a task notification, let's take a look at the two most common places where you'll want to use it.&lt;/p&gt;

&lt;h2&gt;When viewing a task&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;em&gt;Virtual Attendant&lt;/em&gt; button when viewing a task page and select the new &lt;em&gt;Task reminder&lt;/em&gt; behavior.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/task_display_va.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify when you want to schedule your reminder and then click the &lt;em&gt;OK&lt;/em&gt; button.  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/task_display_va_sched.png" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you schedule a reminder for &lt;em&gt;"now"&lt;/em&gt; then it will run immediately.  Otherwise you will see a new entry in the &lt;em&gt;Scheduled behavior&lt;/em&gt; section, like so:  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/task_display_schedule.png" alt=""&gt;&lt;/p&gt;

&lt;h2&gt;From bulk update on a task worklist&lt;/h2&gt;

&lt;p&gt;You can also schedule behavior from bulk update.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select your desired tasks in a worklist, or leave nothing selected to select all the tasks.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;bulk update&lt;/em&gt; button at the bottom of the worklist.&lt;/li&gt;
&lt;li&gt;Choose your reminder custom behavior in &lt;em&gt;Behavior&lt;/em&gt;, and schedule the behavior in &lt;em&gt;When&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/64/task_bulk_va.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Scheduled behavior that is initiated from bulk update will run in a background queue to reduce the impact on performance.  For this reason, it may take a few minutes for your changes to take effect if they are applied to a long worklist.&lt;/p&gt;

&lt;h1&gt;Where to go from here&lt;/h1&gt;

&lt;h2&gt;SMS notifications&lt;/h2&gt;

&lt;p&gt;You can use our &lt;a href="https://github.com/cerb5-plugins/wgm.twilio"&gt;Twilio&lt;/a&gt; or &lt;a href="https://github.com/cerb5-plugins/wgm.clickatell"&gt;Clickatell&lt;/a&gt; plugins to send reminders directly to your mobile devices through SMS.  This is useful for high priority reminders -- like important phone calls that must take place at a specific time.  You can create multiple custom behaviors with different methods of getting your attention and then schedule the most appropriate one.&lt;/p&gt;

&lt;p&gt;See: &lt;a href="http://www.cerberusweb.com/support/kb/article/88-Sending_scheduled_reminders_to_your_mobile_phone_using_Virtual_Attendants_and_Twilio"&gt;Sending scheduled reminders to your mobile phone using Virtual Attendants and Twilio&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Task due date escalation&lt;/h2&gt;

&lt;p&gt;You can create custom behavior to notify you once per day leading up to a task's due date -- perhaps with notifications only starting three days prior to the final due date.  If the due date is reached without the task being marked as completed then you can escalated to a higher priority reminder like an SMS message.  This is easy to do if you have custom behavior reschedule itself with a time like &lt;em&gt;"tomorrow 8am"&lt;/em&gt;.  You can add conditions to the custom behavior to check if the task is completed already, and if the due date has elapsed.&lt;/p&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/64</link><pubDate>Sun, 15 Jan 2012 22:46:21 GMT</pubDate><guid isPermaLink="false">8bb6465720e3ba7d94dd6f143ddedd25</guid></item><item><title>Enforcing Service Level Agreements (SLAs) with Virtual Attendants and scheduled behavior</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;A Service Level Agreement (SLA) is a formal contract that defines a server provider's performance obligations to a customer.  For example, customers who pay for priority support through email are generally guaranteed a response within a certain timeframe, such as "within 2 hours" or "before the close of the next business day".&lt;/p&gt;

&lt;p&gt;With Cerb5, you can configure Virtual Attendant behavior to enforce your SLA commitments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE: This functionality requires Cerb5 version 5.5 or later.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Defining Service Levels on organization records&lt;/h1&gt;

&lt;p&gt;The first step is to grant service levels to the appropriate contacts.  You have plenty of leeway using Cerb5 to model this according to your particular business practices.  &lt;/p&gt;

&lt;p&gt;Our usual recommendation is to create a picklist custom field on organization records called "Service Level".  Even if you only have a single service level like "Priority Support" this will give you room for future expansion compared to using a checkbox.  We recommend that you add this field to organization records so it covers all the contacts that you assign to the organization, which saves you the hassle of assigning service levels to each individual contact.  However, if you limit the number of authorized contacts then everything in this article is still applicable if you put the custom field on individual address records.&lt;/p&gt;

&lt;p&gt;For simplicity our examples will use the organization-based approach.&lt;/p&gt;

&lt;h2&gt;Creating the Service Level custom field&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Setup&lt;/em&gt; in the top right of the navigation menu.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;Settings-&gt;Custom Fields&lt;/em&gt; from the Setup menu.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Organization&lt;/em&gt; record type.&lt;/li&gt;
&lt;li&gt;Create a new &lt;em&gt;picklist&lt;/em&gt; called "Service Level" and add "Priority Support" as a field option.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/cfield_org_servicelevel.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Automating the process with Virtual Attendants&lt;/h1&gt;

&lt;p&gt;Now that we have a custom field for granting priority support to specific organizations, we need to instruct our group Virtual Attendant to give their messages special consideration.&lt;/p&gt;

&lt;h2&gt;Creating the SLA Escalation custom behavior&lt;/h2&gt;

&lt;p&gt;We're going to enforce our SLA by attaching custom behavior to a ticket when one of our priority contacts writes in.  This behavior will make a decision based on whether or not our workers have provided a response within the desired timeframe.  For the purpose of this example we're going to enforce 2 hour response times.&lt;/p&gt;

&lt;p&gt;Let's create the custom behavior.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Groups&lt;/em&gt; in the top right of the navigation menu.&lt;/li&gt;
&lt;li&gt;Choose the group you want to enforce an SLA for.  In this example we'll be using a group called Support.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Virtual Attendant&lt;/em&gt; tab.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create Behavior&lt;/em&gt; button and enter the following details:&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_createbehavior.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now see a brand new decision tree on the &lt;em&gt;Custom ticket behavior&lt;/em&gt; event.  This is where we define decisions, outcomes, and actions to instruct the Virtual Attendant how to perform our desired behavior.  It's called a &lt;strong&gt;decision tree&lt;/strong&gt; because each decision can have various outcomes, and each of those can have various actions.  An outcome can also have start the whole process over with a new decision that continues branching.  A decision tree is built using simple building blocks, but the behavior you can create can be very complex depending on your needs.  Each of the clickable bubbles in the decision tree is referred to as a &lt;strong&gt;node&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our objective is to have a place where we can react accordingly if the current ticket has not had a worker reply within the past 2 hours.  We will verify that a message was sent by an SLA-covered organization later.  Let's create the new behavior.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the event node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_dectree.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Title the new decision: "Has a worker replied within 2 hours?" and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Now click on the decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details and click the &lt;em&gt;Save Changes&lt;/em&gt; button.  This will give us an outcome where a ticket is &lt;em&gt;open&lt;/em&gt; and is lacking a worker reply for the past 2 hours.  Note that we're filtering out the &lt;em&gt;waiting for reply&lt;/em&gt; status because if we are waiting on the customer then the clock is not running.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_decision.png" alt=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point you could do a number of things on a ticket where a paying customer is anxiously waiting for an answer and a worker has not replied recently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there are watchers, notify them.&lt;/li&gt;
&lt;li&gt;If there aren't watchers, notify the group manager(s) or a designated dispatcher.&lt;/li&gt;
&lt;li&gt;Force assign the issue to someone.&lt;/li&gt;
&lt;li&gt;Send a series of SMS text messages, email messages, post to a Campfire support team chat room, etc.  With plugins there is really no limit to the kinds of things you can instruct Virtual Attendants to do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the sake of a simple demonstration, we're going to have our Virtual Attendant check if the ticket has watchers or not and react appropriately in either situation.  If there are watchers we're going to send them a notification.  If there aren't watchers we're going to notify the group managers.&lt;/p&gt;

&lt;p&gt;In our official helpdesk environment at WebGroup Media, our team is always connected to a &lt;a href="http://www.campfirenow.com/"&gt;Campfire&lt;/a&gt; group chat room.  We use the &lt;a href="https://github.com/cerb5-plugins/wgm.campfire"&gt;Cerb5 Campfire Integration&lt;/a&gt; plugin to send automated status updates from our Virtual Attendants to chat where we can quickly decide in real-time who will take care of any issues.  For us, this is the ideal place to send notifications about SLA obligations.  We'll assume that you don't do that (perhaps you should), and instead we'll just send a simple notification to a specific worker that we'll assume is our group's manager or dispatcher.  If your team stays in touch in a different way (e.g. IRC chat, Skype, scrolling LED marquee on the office wall, office loudspeaker with text-to-speech orders droned out 1984-style) then consider hiring us to build a Virtual Attendant plugin for integration with your existing infrastructure.&lt;/p&gt;

&lt;p&gt;Let's continue our decision tree.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new outcome node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.  Title the decision "Are there watchers?" and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click on the new decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details and then click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_are_there_watchers.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the new outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following details and then click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_notify_watchers.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Now we also want to react if there aren't watchers.  Click on the "Are there watchers?" decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Title the outcome "No" and click the &lt;em&gt;Save Changes&lt;/em&gt; button.  We don't need to provide any conditions because if the "Yes" condition doesn't match then we can safely assume "No" is the correct outcome.&lt;/li&gt;
&lt;li&gt;Click on the new "No" outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following details and then click the &lt;em&gt;Save Changes&lt;/em&gt; button.  Notice that we are notifying specific workers (our managers or dispatchers) instead of the non-existent watchers.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_notify_managers.png" alt=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Understanding behavior loops&lt;/h2&gt;

&lt;p&gt;At this point, when our new behavior runs it will notify either the watchers or the group managers if an open ticket from a priority customer has not been replied to within the agreed-upon timeframe.  After that, though, it won't provide any subsequent notifications if nobody does anything and the conversation continues to rot.  That's where behavior loops come to the rescue.  Custom behavior is capable of scheduling other behavior, including itself, to run in the future when certain conditions are met.  In our case, we want the SLA Escalation behavior to continue to notify us every hour while a ticket remains overdue -- in other words, we want it to schedule itself to run again.&lt;/p&gt;

&lt;p&gt;The proper place to schedule the behavior loop is after the first decision ("Has a worker replied within 2 hours?") because we want the behavior to loop whether or not there are watchers.  This saves us from having to schedule future behavior individually for each subsequent outcome.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the first "No" outcome node and select "Add Action" from the menu.  Enter the following details and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_reschedule_self.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;We want our behavior to be rescheduled as the first thing that happens on the "No" outcome, so click the new "Reschedule SLA Escalation" action node and drag it to the first "No" outcome.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_reschedule_self_drag.png" alt=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This reschedules our behavior to run again in one hour.  The "If duplicate behavior is scheduled:" option instructs the Virtual Attendant on what to do in the event we ever end up with multiple SLA Escalation behaviors on a single ticket conversation.&lt;/p&gt;

&lt;p&gt;We're selecting the "Only schedule earliest occurrence" option because if there is already an SLA reminder scheduled for 5 minutes from now, we want it to run it then instead of resetting it to an hour from now.  For example, if a customer is waiting on our response and an SLA response is due in 10 minutes, a customer may happen to write in with the message "Hello?  Is anybody home?".  If we reset the SLA timer to an hour in the future due to their activity then it would take another hour before our custom behavior attempted to get the attention of the watchers or managers.  When a customer is waiting on us, we always want to respect the SLA timer with the least amount of time left on it.  That means if a customer writes in several times in rapid succession, we are not attaching new SLA behavior to the conversation if it already exists.  Once the original behavior runs, it will reschedule itself for an hour in the future anyway.  We've found this to be a very elegant solution to the potential problem of "stacking" the same behavior on a particular record too many times.&lt;/p&gt;

&lt;h2&gt;Scheduling custom behavior for new messages&lt;/h2&gt;

&lt;p&gt;If you're particularly astute, you may be wondering how our custom behavior is added to conversations in the first place.  &lt;/p&gt;

&lt;p&gt;Now that we have our custom SLA Escalation behavior that tries to get our attention when we're not responding to customers fast enough, and it's capable of rescheduling itself until our SLA commitments are met, we need to schedule it when someone writes in who has an SLA.&lt;/p&gt;

&lt;p&gt;You should still be on the group's Virtual Attendant tab.  If not, navigate back there.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;Create Behavior&lt;/em&gt; button.  Enter the following details and then click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_schedule_behavior.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the new event node and select &lt;em&gt;Add Decision&lt;/em&gt; from the menu.  Title it "Is it an incoming message with an SLA?" and click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click on the new decision node and select &lt;em&gt;Add Outcome&lt;/em&gt; from the menu.  Enter the following details and then click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_schedule_outcome.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;Click on the new "Yes" outcome node and select &lt;em&gt;Add Actions&lt;/em&gt; from the menu.  Enter the following details and then click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;br&gt;
&lt;img src="https://s3.amazonaws.com/cerb5-public/support/kb/63/groupva_schedule_actions.png" alt=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our custom SLA Escalation behavior will now be scheduled 2 hours in the future on a ticket conversation every time a customer writes in who has a priority SLA.  If the customer writes in multiple times before a worker replies, the SLA Escalation behavior with the shortest timer remaining is used and the others are discarded.  If a worker doesn't reply within 2 hours then our behavior will send out notifications and reschedule itself every hour until the customer receives a response or the ticket is closed.&lt;/p&gt;

&lt;h1&gt;Assign a priority service level to some organizations&lt;/h1&gt;

&lt;p&gt;You probably want to assign a service level to a couple organizations to take advantage of this SLA Escalation behavior.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have a few V.I.P. customers that you want to pay extremely close attention to, ensuring they have the best customer support experience, then this is a great way to do it.&lt;/li&gt;
&lt;li&gt;If you offer corporate support for a fee in exchange for guaranteed response times, this approach should be flexible enough to accomodate your needs.&lt;/li&gt;
&lt;li&gt;Or perhaps you may want to do this for every customer contact, because that's just the kind of customer-focused company that you are.  Kudos!  We hope it helps you remain accountable to that commitment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;If you need any help, just ask.&lt;/h1&gt;

&lt;p&gt;We recognize how important SLA functionality is, and that's why we didn't want to provide it as an inflexible, presumptive feature that forces you into changing how you do everything.  This may seem a little complicated to you the first few times you set up new Virtual Attendant behavior, but as you become comfortable with it you'll likely realize countless uses for it. These skills are widely reusable for configuring business automation and workflow in Cerb5.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="http://www.cerberusweb.com/support/contact"&gt;contact us&lt;/a&gt; if you need help fine-tuning your Virtual Attendant behavior.  We're available for hire to build custom integration, as well as to provide training or consulting on moving more of your online processes to the Cerb5/Devblocks platform.&lt;/p&gt;

&lt;h1&gt;Where to go from here&lt;/h1&gt;

&lt;h2&gt;Business hours&lt;/h2&gt;

&lt;p&gt;You could modify your Virtual Attendant to schedule behavior based on business hours. For example, if it's currently a weekend then it could be scheduled for "Monday 8am".  If it's currently after-hours on a weekday it could be scheduled for 8am the next day.  It's a safe bet that we'll be adding new conditions to make calendar and work hour based processes even easier.&lt;/p&gt;

&lt;h2&gt;Additional service levels&lt;/h2&gt;

&lt;p&gt;If you have several tiers of service level agreements you could create a behavior for each one "SLA Platinum Escalation", or you could add another decision with a series of outcomes to the decision tree that would set target response times accordingly.&lt;/p&gt;

&lt;h2&gt;True escalation&lt;/h2&gt;

&lt;p&gt;Currently we're checking to see if an open conversation from a priority contact has the last worker contact more than 2 hours ago.  You could gradually escalate to more aggressive forms of attention-grabbing reminders after 2 hours, 4 hours, and 8 hours.  This could be accomplished by scheduling a different custom behavior if the worker reply is extremely late.  An ideal place to do that is at the top of a decision tree by scheduling a new behavior to occur "now" and then abandoning the current behavior.  &lt;/p&gt;

&lt;p&gt;That's easy to do if you nest decisions from the oldest period first.  For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is 8 hours late?

&lt;ul&gt;
&lt;li&gt;Yes&lt;/li&gt;
&lt;li&gt;No

&lt;ul&gt;
&lt;li&gt;Is 4 hours late?

&lt;ul&gt;
&lt;li&gt;Yes&lt;/li&gt;
&lt;li&gt;No

&lt;ul&gt;
&lt;li&gt;Is 2 hours late?

&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/63</link><pubDate>Sat, 06 Aug 2011 20:30:18 GMT</pubDate><guid isPermaLink="false">fd5dfb0a2ccf937a4728f2923dce9995</guid></item><item><title>Automatically refreshing pages using popular browser plugins</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Historically, Cerberus Helpdesk has provided an auto-refresh feature that reloads the current page while displaying a countdown timer.  This is useful in multi-monitor environments, or when displaying helpdesk information on a projector in a network operations center (NOC).&lt;/p&gt;

&lt;p&gt;When we started the project in January 2002, browsers provided fewer services to the sites that displayed inside them, and browser plugins weren't mainstream.  There was a time when we even supplied our own spellchecking feature, despite the fact it makes far more sense for browsers to cooperate with the operating system to support consistent dictionaries (and learn/ignore lists) across all applications with all languages, instead of requiring every application to provide its own isolated dictionary.&lt;/p&gt;

&lt;p&gt;Today, auto-refresh functionality is in a similar position.  All major browsers can support the ability to reload a page at an interval through plugins.  Opera includes the feature by default.&lt;/p&gt;

&lt;p&gt;There are several reasons why the browser is a better place for this functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The refresh countdown can be visible at all times without obscuring web pages.&lt;/li&gt;
&lt;li&gt;The browser is capable of determining an idle state across the entire system (for pausing/resuming the timer) in a way that a web page is not.  Ideally, a page would not auto-refresh while you were interacting with it.&lt;/li&gt;
&lt;li&gt;Web-based applications won't have to provide their own inconsistent implementations for automatically refreshing pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've compiled a list of auto-refresh plugins for all the mainstream browsers.  The Chrome and Firefox solutions work the best.&lt;/p&gt;

&lt;h3&gt;Chrome&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ChromeReload&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/njoipeaphfnaplplihpbgndfojhdhmjo" title=""&gt;https://chrome.google.com/webstore/detail/njoipeaphfnaplplihpbgndfojhdhmjo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/de2154ce-e500-102e-a560-0030487e9650/62-chrome_ext2.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/4b1e71a6-e501-102e-a560-0030487e9650/62-chrome-ext1.png" alt="" title=""&gt;&lt;/p&gt;

&lt;h3&gt;Firefox&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ReloadEvery&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/reloadevery/" title=""&gt;https://addons.mozilla.org/en-US/firefox/addon/reloadevery/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Safari&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto-Refresh&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://agriffindesign.com/downloads/autorefresh/" title=""&gt;http://agriffindesign.com/downloads/autorefresh/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Opera&lt;/h3&gt;

&lt;p&gt;The functionality is built-in, although it doesn't show a countdown timer like the plugins.  Right-click on the page and choose from the &lt;em&gt;Reload Every...&lt;/em&gt; menu.&lt;/p&gt;

&lt;h3&gt;Internet Explorer&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Yrefresher&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://www.snapfiles.com/get/yrefresher.html" title=""&gt;http://www.snapfiles.com/get/yrefresher.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://www.cerberusweb.com/support/kb/article/62</link><pubDate>Fri, 10 Jun 2011 22:30:27 GMT</pubDate><guid isPermaLink="false">fec77db73e0408bdbd47f4e3722a189e</guid></item></channel></rss>

