<?xml version="1.0"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
		<channel><title>[Cerberus Helpdesk - Support Center] Recently Updated Articles</title><link>http://cerberusweb.com/support/rss/kb/recent_changes</link><description></description><item><title>6.4 Changelog</title><description>&lt;h1&gt;Release notes for Cerb 6.4&lt;/h1&gt;

&lt;p&gt;Cerb (6.4) is a major functionality update in development as of May 8, 2013.   It currently contains over 56 new features and usability tweaks from community feedback.&lt;/p&gt;

&lt;p&gt;See: &lt;a href="http://wiki.cerbweb.com/6.4"&gt;http://wiki.cerbweb.com/6.4&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Usability]&lt;/strong&gt; Dashboard widgets now display a single icon in the top right with a dropdown menu.  This provides a place to add more options.  Previously, every option was an icon, which limited the amount of space available to display the widget title.  The new menu will be used to provide options like duplicating widgets or exporting their data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Gauges]&lt;/strong&gt; Gauge widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Counters]&lt;/strong&gt; Counter widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Charts]&lt;/strong&gt; Chart widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Subtotals]&lt;/strong&gt; Subtotal widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Scatterplots]&lt;/strong&gt; Scatterplot widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Pie Chart]&lt;/strong&gt; Pie chart widgets can now 'Export Data' to JSON or CSV.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Usability]&lt;/strong&gt; When using the 'expand' option in the Web-API, the extra records no longer contain extraneous fields like 'global timestamp' and the currently active worker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Authentication]&lt;/strong&gt; Refactored the Web-API so that any code that checks for the 'active worker' may be used in API calls. The Web-API doesn't require sessions or cookies. Previously, the API implemented its own authentication, and the use of code that checked for a worker session would fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Plugins/Contexts]&lt;/strong&gt; Implemented a context for Workspace Pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Plugins/Contexts]&lt;/strong&gt; Implemented a context for Workspace Tabs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Plugins/Contexts]&lt;/strong&gt; Implemented a context for Workspace Widgets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Devblocks/Plugins]&lt;/strong&gt; Implemented  DevblocksPlatform::intClamp($n, $min, $max) for conveniently constraining a numeric value within a given range.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Devblocks/Plugins]&lt;/strong&gt; Implemented DevblocksPlatform::strFormatJson($json) to format JSON in a human-friendly output.  Nested properties are indented, and one key/value pair or array element is displayed per line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Code Cleanup]&lt;/strong&gt; Fixed an issue where worklist and subtotal widgets created an extra worker&lt;em&gt;view&lt;/em&gt;model record in the database during rendering.  There should be one entry per worklist-based series.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Widgets/Code Cleanup]&lt;/strong&gt; Improved the way that widgets store worklist datasource information.  Previously, Cerb stored a C4_AbstractViewModel object for each worklist datasource, serialized in PHP format, and base64 encoded in the widget properties.  This was bloated and not very human friendly.  It included a lot of information that could be reconstructed from worklist contexts.  Worklist information is now stored by widgets in an easily readable JSON format, without any extraneous data, encoding, or serialization.  At the same time, uniquely identifying information (like worklist IDs) are no longer used in widget properties, which paves the way for many new and highly anticipated features, like the ability to copy or share any widget.  The format of existing widgets will be automatically converted during the upgrade process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Widgets/Code Cleanup/Performance]&lt;/strong&gt; Removed some unnecessary code that ran when configuring several workspace widgets: counters, gauges, subtotals, worklists.  Several of these were derived from the original charting widget, and they emulated pulling a list of fields through Ajax every time the context (record type) of the worklist was changed in config.  That information isn't used by any of these widgets, and its retrieval created a few needless calls to Cerb and the database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Widget/Export]&lt;/strong&gt; All workspace widgets now support the ability to export their configuration to a plaintext format (JSON).  This option may be accessed by clicking the configuration menu in the top right of the widget, and selecting 'Export Widget'.  Using this feature, widgets may be saved and transferred electronically; providing the beginnings of a community exchange for useful widgets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Calendars]&lt;/strong&gt; Migrated calendar workspace tabs to the new worklist datasource format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Worklists]&lt;/strong&gt; Migrated Virtual Attendant 'Set List Variable' actions to the new worklist datasource format.  This is a prerequisite for creating VA import/export functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboard/Widgets/Import]&lt;/strong&gt; Dashboard widgets may now be imported from the 'Add Widget' popup (using the same JSON format that they export to).  The popup now has tabs for 'Build' and 'Import'.  This addresses several requests, including the ability to move and clone widgets, and to share widgets between workers or Cerb installations.  This was the last missing piece blocking an official repository of widgets from being created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboards/Widgets/Import]&lt;/strong&gt; When importing dashboard widgets, the import file may now specify any number of fields that should prompt the current worker for additional information.  The answers to these prompts can customize the widget before it is imported, rather than needing to instruct workers to make edits later.  This also handles the situation where data like workers or groups are different between Cerb installs.  For example, a counter widget that reports on the number of overdue tasks owned by a specific worker can now prompt for which worker to use when being imported.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Devblocks/Plugins]&lt;/strong&gt; Implemented DevblocksPlatform::jsonGetPointerFromPath() for making arbitrary changes at any depth to a JSON object by using an XPath-like path.  This is used by the Virtual Attendant and Dashboard Widget import functionality to allow guided customizations prior to import.  This helper method can be reused anywhere that similar functionality is required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2530" title=""&gt;CHD-2530&lt;/a&gt;] [&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2688" title=""&gt;CHD-2688&lt;/a&gt;] [Virtual Attendants/Export]&lt;/strong&gt; All Virtual Attendant behaviors now support the ability to export their decision trees to a plaintext format (JSON).  This option may be accessed by clicking on the behavior and selecting 'Export Behavior' from the menu.  Using this functionality, VA behaviors can now be duplicated, shared, or saved.  The project can also maintain an official repository of useful VA behaviors that can be easily installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Import]&lt;/strong&gt; Virtual Attendant behaviors may now be imported from the 'Create Behavior' popup (using the same JSON format that they export to).  The popup now has tabs for 'Build' and 'Import'.  This addresses several requests, including the ability to move and copy behaviors, and to share behaviors between groups, workers, or Cerb installations.  For example, once setting up a complex auto-responder behavior for a group, it can be quickly copied to several other groups without having to tediously repeat the whole process of adding decisions, outcomes, and actions.  This also makes it possible for the project to maintain an official repository of useful behaviors that can be easily imported into any Cerb instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Import]&lt;/strong&gt; When importing Virtual Attendant behavior, the import file may now specify any number of fields that should prompt the current worker for additional information.  The answers to these prompts can customize the behavior before it is imported, rather than needing to instruct workers to make edits later.  This also handles the situation where data like workers or groups are different between Cerb installs.  For example, a custom behavior that assigns tickets to a particular worker can now prompt for which worker to use when the behavior is imported in a new environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Debug/Virtual Attendants]&lt;/strong&gt; The Virtual Attendant 'Export Behavior' option on the /debug page now uses the same JSON format as 'Export Behavior' does in the app.  Previously, this used a special XML format which was only intended for human review but not importing.  The new format allows imports by developers and QA to assist customers with troubleshooting.  The advantage of using this option is that it exports all behaviors at once.  It may also be used by administrators to review or make backups of all VA behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Workspaces]&lt;/strong&gt; Implemented a 'GET /workspaces/pages/list.json' method to the RESTful Web-API.  This retrieves a list of all workspace pages accessible by the current worker; owned by them, their groups, or roles.  The 'expand' parameter includes additional information about each page's owner, tabs, widgets, or worklists.  This is very useful for bringing workspace data into external interfaces (such as mobile apps).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Workspaces]&lt;/strong&gt; Implemented a 'GET /workspaces/pages/123.json' method to the RESTful Web-API.  This retrieves a specific page.  The 'expand' parameter includes additional information about the page's owner, tabs, widgets, or worklists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Workspaces]&lt;/strong&gt; Implemented a 'GET /workspaces/tabs/123.json' method to the RESTful Web-API.  This retrieves a specific worklist tab.  The 'expand' parameter includes additional information about widgets, widget data, or worklists.  The data for all widgets on the tab may be retrieved in a single request, which makes it very easy to empower remote scripts and apps with the ability to monitor and report on Cerb dashboards.  For example, a dashboard tab could summarize information about a series of servers in a datacenter, and a remote script could check those metrics against thresholds, whether they're counters, gauges, charts, etc.  This is useful, since Cerb dashboards are very informative but they don't get a worker's attention if they aren't proactively monitored.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Workspaces]&lt;/strong&gt; Implemented a 'GET /workspaces/widgets/123.json' method to the RESTful Web-API.  This retrieves information about a specific workspace widget, and always includes the widgets raw data.  This has all the same advantages for remote monitoring and reporting as pulling a workspace tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Workspaces]&lt;/strong&gt; Implemented a 'GET /workspaces/worklists/123.json' method to the RESTful Web-API.  This retrieves information about a specific workspace worklist.  The response provides search results with support for sorting and paging.  By setting up the desired filters on the Cerb dashboard, a remote API consumer doesn't have to concern itself with filtering results.  For example, a remote app could display the 'Available tickets' worklist from an existing workspace, which may use a dozen filters to highlight the appropriate tickets.  This not only saves the API consumer a lot of work in listing that information, but it also means that remote apps don't need to update every time the filters on the underlying worklist change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2930" title=""&gt;CHD-2930&lt;/a&gt;] [&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3082" title=""&gt;CHD-3082&lt;/a&gt;] [Mail/POP3/Scheduler]&lt;/strong&gt; A failing POP3/IMAP mailbox will no longer be auto-disabled after 5 consecutive failures.  Instead, a delay of two minutes will be incurred for each consecutive failure up to a maximum delay of 30 minutes.  This ensures that the mailbox will be retried within a reasonable amount of time.  Previously, mailboxes could remain disabled over a weekend if no admins were available.  Saving a mailbox in setup will reset the failure and delay counters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Setup/Mail/POP3/Usability]&lt;/strong&gt; Failing POP3 mailboxes are now marked with an icon in "Setup-&gt;Mail-&gt;POP3 Accounts".  A message is also displayed when editing a failing mailbox that reads "Error!  This mailbox has failed to check mail for (n) consecutive attempts".  This should help admins spot potential issues more easily.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Setup/Mail/POP3/Aesthetics]&lt;/strong&gt; Improved the process of deleting a mailbox from "Setup-&gt;Mail-&gt;POP3 Accounts".  This is now more consistent with the rest of the app.  Previously, you had to check a box at the bottom of the form to delete the mailbox.  Nothing else in Cerb works like that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Library/Setup]&lt;/strong&gt; The 'Download updates' button in the Plugin Library will now automatically download any updates for all installed plugins.  Previously, it just updated the version information but an admin had to update each plugin by clicking a button in the list.  If a '.git' development directory exists in a plugin then it won't be automatically updated (as this would interfere with development).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Library/Upgrade/Platform]&lt;/strong&gt; When upgrading from the /update page, Cerb will now attempt to download the latest version of all installed plugins from the Plugin Library.  This should spare admins from having to manually update and re-enable all third-party plugins after an upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Custom Fieldsets]&lt;/strong&gt; Custom fieldsets allow groups of related custom fields to be added to records in order to classify them. Previously, adding a new custom field to a type of record (e.g. tasks, tickets) would always display that field on every record. This led to a lot of clutter when custom fields were only used by a single group, worker, or Virtual Attendant behavior; and when a custom field was only related to a subset of records of the same type. With fieldsets, you can optionally add multiple sets of custom fields to a specific record.  For example, an asset record could have a 'Car' fieldset added to it, with fields that describe mileage, color, make, model, VIN, etc.  Another asset record could have a 'Computer' fieldset, with fields for CPU speed, RAM, serial #, etc.  Both of these records would be assets, but they would be classified separately.  These fields would not be mixed between the two records. It is still possible to have global custom fields for all records of the same type, as before; it's just no longer the only option.  Fieldsets can be owned by roles, groups, or workers. Existing group-based custom fields will be converted to group-owned fieldsets during the migration. Fieldsets are managed in the peek popup and can be added using the 'Add Fieldset' button which displays a menu of available fieldsets. A fieldset can also be deleted by clicking the red X button that is displayed when hovering over any of its fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Groups/Custom Fields]&lt;/strong&gt; The 'Custom Fields' tab on Group Setup now manages the custom fieldsets owned by the group, rather than individual global fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Custom Fields/Usability/Contexts]&lt;/strong&gt; Contexts (record types) can now provide a hint that they implement custom fields for their records.  This allows Cerb to only show custom field options for records that support them.  Previously, the 'Custom Fields' page in Setup displayed many record types that had no way to display or edit such fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Profiles/Usability/Aesthetics]&lt;/strong&gt; On the profile for every record type, the toolbar has been moved to the very top of the page.  Since custom fieldsets are now displayed at the top of profiles, this helps the page flow better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Custom Fieldsets/Subtotals]&lt;/strong&gt; Since custom fieldsets have increased the length of many custom field names, the title of the subtotals sidebar on worklists will now be wrapped when necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Custom Fieldsets/Bulk Update]&lt;/strong&gt; Custom fieldsets and their fields may be set from the Bulk Update popup for any records that support them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Knowledgebase/Bulk Update/Custom Fields]&lt;/strong&gt; Custom fields may now be set on knowledgebase articles using Bulk Update.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Compose/Custom Fieldsets]&lt;/strong&gt; Custom fieldsets may be set when composing mail.  This solves a long-standing issue where desired custom fields couldn't easily be set when creating a ticket, and instead had to be set by subsequently editing the newly created record.  Additionally, custom fields could only be set based on the group associated with the ticket. Now, all custom fieldsets are available when creating a ticket, irrespective of factors like the group.  This also simplifies the compose popup by not displaying custom fields that aren't needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Custom Fieldsets]&lt;/strong&gt; Virtual Attendants can now utilize custom fieldsets on conditions and actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Reply/Custom Fields]&lt;/strong&gt; When replying to a ticket, custom fields will no longer be displayed at the bottom of the form.  The main problem with the previous approach is that it led to overwriting any custom field changes that took place on the same record while a long reply was being drafted. This is because the form set the value of all fields, rather than only setting a few specific fields.  This functionality can be reintroduced later in a better way.  For now, custom fields may be set from the peek popup using the edit button after replying to a ticket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Custom Fieldsets/Worklists/Subtotals]&lt;/strong&gt; Subtotals and filters on worklists will now automatically adapt the available custom fields based on any active fieldset filters. For example, if there are 10 possible fieldsets for tickets, then you'll see a lot of custom fields for filtering or subtotaling a worklist. If the same worklist is filtered to a specific kind of fieldset, then only custom fields from that fieldset will be displayed when configuring the worklist. This helps progressively reduce clutter once the intentions of the worker are known to Cerb.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Update]&lt;/strong&gt; When using the /update page to update Cerb, the lockfile being written to the temp directory was prefixed with 'c4' (from Cerb4). This has been changed to 'cerb' instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Choosers]&lt;/strong&gt; The chooser popup is now given information about the record being displayed when it was opened, which allows it to customize itself appropriately.  For example, a custom fieldset chooser should only show fieldsets for the given context (e.g. task, ticket).  Other choosers can use this information to predict a worker's intentions and save them time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboards]&lt;/strong&gt; Fixed an issue on dashboards where worklist-based counters and gauges didn't load values from custom fields that weren't in the filters.  For example, a counter intended to SUM the value of a custom field may have displayed '0' even though several values existed.  The reason for this is very technical, but has to do with how worklists intelligently use the most efficient way to load values based on how they are needed.  When filtering, a slower LEFT JOIN is needed.  For just displaying a value, a quick subquery is used without any joins.  Counters and gauges always need to join values for aggregate functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboards]&lt;/strong&gt; Fixed an issue on worklist-based chart widgets where custom fields as axes may not display the proper values when they aren't used as filters on the underlying worklist.  This had to do with how worklists interact with the database.  The process is now more intuitive and custom fields can be selected without any other considerations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboards]&lt;/strong&gt; Fixed an issue where scatterplots didn't display any plots if the dataset only had a single sample.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform]&lt;/strong&gt; Removed the concept of ONDEMAND_MODE from the code, since this is handled better through a forked version of the project now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Dashboards/Worklists/Usability]&lt;/strong&gt; Worklists that are used as widgets on dashboards now label each field they display. Previously, a worker had to constantly refer to the horizontal order of the headings to figure out the vertical values being displayed for each row.  The new approach uses a little more space but improves usability dramatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Plugin Development]&lt;/strong&gt; The devblocks-dao.php script in /install/extras/sdk will now assist with creating the initial code and templates for contexts, profiles, and peeks.  It also adds several useful virtual fields to the generated worklist: context links, watchers, and 'has fieldset'.  Custom fields are enabled by default.  The 'delete' option on peeks uses the two-step verification rather than the gaudy browser confirmation popup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://cerberusweb.com/support/kb/article/101</link><pubDate>Fri, 10 May 2013 23:33:48 GMT</pubDate><guid isPermaLink="false">a7e0a900e3b1fbbb225436a4eaad488d</guid></item><item><title>6.3 Changelog</title><description>&lt;h1&gt;Release notes for Cerb 6.3&lt;/h1&gt;

&lt;p&gt;Cerb (6.3) is a major functionality update released on March 25, 2013.   It contains over 64 new features and usability tweaks from community feedback.&lt;/p&gt;

&lt;p&gt;See: &lt;a href="http://wiki.cerbweb.com/6.3"&gt;http://wiki.cerbweb.com/6.3&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3136" title=""&gt;CHD-3136&lt;/a&gt;] [Watchers/Worklists]&lt;/strong&gt; Fixed an issue when the 'watcher' filter was added to both the required and user-editable filter sections of a worklist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Plugins]&lt;/strong&gt; Workspace Tab extensions may now provide a configuration section that is displayed in the Edit Tab popup.  This provides a consistent experience, opposed to each tab having its own method of being configured.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Calendars]&lt;/strong&gt; Any number of calendars can now be added to workspaces as tabs.  These calendars are capable of displaying any worklist data that contains dates: tasks due, invoices billed, tickets created, worker replies, time tracking, worker logins, Twitter @mentions, etc.  A calendar is configured using a worklist, and the results will be displayed in the appropriate day's cell.  A label format using placeholders may be provided to customize the output; for example, an invoice calendar may show the amount due and the client, a task calendar may show the title and time, and a login calendar may show each worker's name.  A color may be configured for each set of labels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2903" title=""&gt;CHD-2903&lt;/a&gt;] [Broadcast/Attachments]&lt;/strong&gt; Broadcast messages may now include attachments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3274" title=""&gt;CHD-3274&lt;/a&gt;] [Workspaces/Worklists]&lt;/strong&gt; Workspace Widget worklists may now use the 'export' feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3268" title=""&gt;CHD-3268&lt;/a&gt;] [Activity Log/Tasks]&lt;/strong&gt; The Activity Log will now record which worker or Virtual Attendant behavior created a new task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3267" title=""&gt;CHD-3267&lt;/a&gt;] [Tasks]&lt;/strong&gt; Added a 'created' field to task records.  This can be used for reporting on task creation over time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3266" title=""&gt;CHD-3266&lt;/a&gt;] [Contacts/Bulk Update]&lt;/strong&gt; Contact Person worklists now have a Bulk Update option to set or unset watchers and custom fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3263" title=""&gt;CHD-3263&lt;/a&gt;] [Worklists/Dates]&lt;/strong&gt; Worklists with date fields can now be filtered by that field being blank.  Previously, it was only possible to find unset custom date fields with a search like 'BETWEEN 0 AND 1' or 'BETWEEN big bang AND -10 years'.  This was unintuitive compared to a simple 'is blank' operator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Worklists/Dates]&lt;/strong&gt; Worklists with date fields can now be filtered using a 'NOT BETWEEN' operator.  This allows a date range to be exclusive rather than inclusive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Quick Search/Dates]&lt;/strong&gt; When using Quick Search on a date-based field, the options 'empty', 'blank', or 'null' will automatically filter for blank date fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3260" title=""&gt;CHD-3260&lt;/a&gt;] [Virtual Attendants/Defunct]&lt;/strong&gt; Virtual Attendant behaviors that involve email addresses (e.g. new message in a group conversation) may now create conditions that check the 'is defunct' status of those addresses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Snippets]&lt;/strong&gt; Added a 'total uses' column to snippet records.  This makes it much easier to report on the total number of uses for each snippet.  For instance, on a dashboard with a worklist widget.  Previously, snippet worklists only showed the hits per worker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-1987" title=""&gt;CHD-1987&lt;/a&gt;] [Snippets/Reports]&lt;/strong&gt; Snippet usage statistics are now recorded with timestamps. Previously, it was only possible to report how many times each worker used a particular snippet (i.e. all-time).  Now it is possible to report on how often a snippet was used over a given date range.  This uncovers trends where a snippet may become more or less popular over time; which is useful when performing maintenance on those records.  The original cumulative stats are imported at the beginning of the time range so they are included in the grand totals, but not on any reports with a range like "Past 30 days". New stats will have to be collected for these reports and dashboard widgets to display useful information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-1987" title=""&gt;CHD-1987&lt;/a&gt;] [&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3117" title=""&gt;CHD-3117&lt;/a&gt;] [Snippets/Reports]&lt;/strong&gt; Added a 'Most/Least Popular Snippets over Date Range' report.  This allows reporting on snippet usage, with filters by date or by any number of workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Comments]&lt;/strong&gt; A new global event point for 'New comment on a record' is available for Virtual Attendant behaviors.  This triggers every time a new comment is added to any record.  Abstract placeholders are available for the record type (e.g. task), record label (e.g. task title, ticket subject), and record permalink URL.  This makes it very easy to send comment notifications to any channel -- email, SMS, Campfire, HipChat, etc.  Comment behaviors can be filtered by type, author, content, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Comments]&lt;/strong&gt; Added a new group-level event point for 'New comment on a conversation in group'.  This triggers when a new comment is added to one of the group's tickets, which allows Virtual Attendant behavior to perform custom business logic. For instance, managers may elect to receive an email copy of all group comments without having to explicitly watch every conversation. Comments may also be posted to other channels like SMS, Campfire, or HipChat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3272" title=""&gt;CHD-3272&lt;/a&gt;] [Virtual Attendants/Performance/Reports]&lt;/strong&gt; Virtual Attendant usage statistics are now recorded when behaviors run.  Entries are sorted by a per-day timestamp, each with the number of uses and the cumulative runtime for that time period (which can be used to compute average runtimes).  Previously, usage stats for Virtual Attendant behaviors were not collected at all.  These stats provide much more insight into how Virtual Attendants are behaving.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Reports/Virtual Attendants]&lt;/strong&gt; Added a 'Virtual Attendant Usage over Date Range' report.  This allows reporting on Virtual Attendant behavior filtered to a specific time period.  Data is displayed for the number of uses for each behavior, along with its total runtime, average runtime, owner, and event.  The report may also be sorted by any of those fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3276" title=""&gt;CHD-3276&lt;/a&gt;] [Tasks/Usability]&lt;/strong&gt; On the profile page of a task, the Comments tab is now the default. It is also shown before the Activity Log tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3275" title=""&gt;CHD-3275&lt;/a&gt;] [Mail/Attachments/Usability]&lt;/strong&gt; Workers may now upload multiple files at once when using an HTML5-compatible browser (e.g. Chrome).  Previously, each file had to be attached individually using the file dialog.  Multiple files may be selected by using CTRL/CMD, or SHIFT, when left-clicking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Attachments/Performance]&lt;/strong&gt; Performed some optimizations on the way attachment link UUIDs (universally unique IDs) are stored and indexed in the database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Attachments/Scalability/Replication]&lt;/strong&gt; Modified the way attachment links are inserted into the database so they are compatible with binary logging. Previously, these queries used MySQL's UUID() function in INSERT statements. This is technically fine, since the UUID value isn't used in any other tables; however, MySQL may still record error_log entries about using dynamic functions in inserts when binary logging is enabled.  These inserts are now done in two steps, with a SELECT UUID() and then an explicit INSERT value for the 'guid' column.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3280" title=""&gt;CHD-3280&lt;/a&gt;] [Virtual Attendant/Custom Fields]&lt;/strong&gt; Virtual Attendant behaviors may now set cross-record custom fields. For example, a ticket behavior can also set custom fields on the sender and their organization. This enables many new VA workflows. You could now have a 'new message' behavior set a date custom field on the sender's record to keep track of their latest incoming message.  This could be used for sales, marketing, or even to throttle auto-replies.  For another example, VAs could automatically manage 'unsubscribe' functionality by setting a 'do not contact' custom field on sender addresses when they reply with 'remove me'.  Previously, all this advanced behavior required scheduling macros on other records, which didn't run immediately, and also left a lot of one-use macro clutter in Virtual Attendants. This new solution is much simpler and more powerful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2570" title=""&gt;CHD-2570&lt;/a&gt;] [Security/Who's Online]&lt;/strong&gt; Fixed an issue where the "Who's Online" list doesn't display if the Suhosin extension is installed and session data is being encrypted.  Cerb no longer needs to decrypt sessions to list active workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2835" title=""&gt;CHD-2835&lt;/a&gt;] [Security]&lt;/strong&gt; Disabling a worker's account now immediately ends all of their active sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3289" title=""&gt;CHD-3289&lt;/a&gt;] [Security/Sessions/Setup]&lt;/strong&gt; Admins may now view a list of all active worker sessions from Setup-&gt;Sessions.  This includes IP addresses and user agents (e.g. browser, OS, version).  Sessions may be force expired from the Bulk Update popup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3288" title=""&gt;CHD-3288&lt;/a&gt;] [Security/Sessions/Preferences]&lt;/strong&gt; Workers may now view their own list of active sessions from Settings-&gt;Sessions.  This displays IP addresses, browser, and operating system.  Sessions can be force logged out by using the Bulk Update button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Attachments]&lt;/strong&gt; Files may now be uploaded through the Web-API and saved as attachments.  These may then be linked to various records.  Refer to the documentation for the '/attachments/upload' action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3066" title=""&gt;CHD-3066&lt;/a&gt;] [Web-API/Mail/Compose]&lt;/strong&gt; New mail may now be composed by using the Web-API.  This sends an email message to the recipients and creates a new ticket in Cerb.  File attachments, status, and custom fields may also be included.  Refer to the documentation for the '/tickets/compose' action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Macros]&lt;/strong&gt; Application-owned Virtual Attendant behaviors will now show up in macro menus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-882" title=""&gt;CHD-882&lt;/a&gt;] [&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3244" title=""&gt;CHD-3244&lt;/a&gt;] [Virtual Attendants/Mail/Reply]&lt;/strong&gt; Implemented a new Virtual Attendant event point for '[UI] Before replying to a message'.  This allows behaviors that automate modifications to the reply form in the browser using jQuery actions.  For example, a group-owned behavior can set the default 'status' (e.g. open, waiting, closed) per group.  If the default status is 'waiting' the reopen date can be automatically set with intelligence, such as "+4 business hours", which accounts for evenings and weekends.  As another example, the 'custom fields' section can be hidden by default using a worker-level reply behavior, and made visible using another 'Show custom fields' behavior from the reply form in only the situations where it's needed.  Behaviors for this event may be owned by the app (global), roles, groups, or workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Reply/Usability]&lt;/strong&gt; When replying to mail, the text box is no longer forced as the focused element.  This allows VA automation to move the cursor somewhere else (e.g. to the first blank line).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Mail/Reply]&lt;/strong&gt; Added a '[UI] While replying to a message' event point for Virtual Attendant behavior.  This makes user interface automation possible with macros that a worker can activate as-needed.  These actions can run custom jQuery code.  For example, during a reply a worker may want to automatically insert a summarized history of the current recipient's support history (e.g. reference number, subject, date, status).  This wouldn't be possible using snippets, but a VA behavior can build a worklist in a private behavior variable and then use the results as placeholders that output some text in the reply box.  A single macro can also: watch the conversation, add attachments, change the status, move the convo, assign it, and click the 'send' button.  'While replying' macros may be owned by the app (global), roles, groups, or workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Worklists/Export]&lt;/strong&gt; The field names are now properly capitalized in the 'Export' action of worklists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3290" title=""&gt;CHD-3290&lt;/a&gt;] [Security/Logins]&lt;/strong&gt; When logging out, a worker may now choose 'Sign off (all my sessions)' to expire all their active sessions at the same time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3284" title=""&gt;CHD-3284&lt;/a&gt;] [Mail/Worklists/Piles/Merge]&lt;/strong&gt; The pile sorter on ticket worklists now allows 'merge' as an action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3265" title=""&gt;CHD-3265&lt;/a&gt;] [Contacts/People/Import]&lt;/strong&gt; Contact Person records may now be imported in worklists using .CSV (comma-separated value) files.  The supported fields are: email address, password, created date, first name, and last name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Comments]&lt;/strong&gt; Comments may now be authored by any kind of record (e.g. app, role, group, worker, email address).  Previously, comments had to be authored by an email address, which didn't make a distinction between workers, customers, or Virtual Attendants.  It would now be possible for the same functionality to mix comments from different sources (e.g. internal and public interfaces).  For example, a knowledgebase article could have customer comments that are shown publicly, with worker comments that are highlighted as authoritative.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendant/Simulator]&lt;/strong&gt; The Virtual Attendant behavior simulator will now show more property values in the popup.  Previously, the simulator was only showing properties that had values, and it wasn't using the lazy loader to look up values on linked records.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3258" title=""&gt;CHD-3258&lt;/a&gt;] [Virtual Attendants/Comments]&lt;/strong&gt; When Virtual Attendants post a new comment, the author of that comment will now be set to the owner of the VA behavior.  Previously, comments created through Virtual Attendants always showed the author as '(system)', which wasn't very helpful.  Now the app, or any role, group, or worker will be shown instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Comments]&lt;/strong&gt; Comments on any record may now be searched through the Web-API.  Results may be filtered by target record or author details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3201" title=""&gt;CHD-3201&lt;/a&gt;] [Virtual Attendants/Mail]&lt;/strong&gt; Virtual Attendants may now set custom mail headers when using the 'Send Email' or 'Send Email to Recipients' actions.  This is useful if you want to provide a header like 'X-Precedence: bulk' to combat auto-responder loops, or if you want to send structured information in email to an automated script.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2895" title=""&gt;CHD-2895&lt;/a&gt;] [Virtual Attendants/Mail/Recipients]&lt;/strong&gt; Virtual Attendants may now add new recipients to conversations from ticket and message-based behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-2789" title=""&gt;CHD-2789&lt;/a&gt;] [Virtual Attendants/Mail/Orgs]&lt;/strong&gt; Virtual Attendants may now set organizations as an action on ticket and message-based behaviors.  The organization may be set for the ticket or any associated addresses (e.g. sender).  For example, a VA can automatically set an organization for new senders based on their domain name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendant/Mail/Simulator]&lt;/strong&gt; Implemented Virtual Attendant simulator output for the 'Set owner' action on ticket and message-based behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3305" title=""&gt;CHD-3305&lt;/a&gt;] [Virtual Attendants/Setup]&lt;/strong&gt; Fixed an issue with 'Setup-&gt;Virtual Attendants' where adding a new behavior on an owner tab (e.g. app, role, group, worker) didn't always refresh the affected part of the page.  This had to do with page elements not having unique IDs, and multiple owner tabs having the same event point in use.  In this case, the first tab showing the event point was improperly being reloaded, rather than the focused tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Usability]&lt;/strong&gt; When adding actions to a Virtual Attendant behavior, the 'Add Action' button is now a filterable menu (like when adding outcomes) rather than dropdown.  This makes it much more efficient to filter a long list of actions because the filtering text doesn't have to match the beginning of the option, like with a dropdown.  For instance, filtering for 'Face' will quickly limit the actions to a list including 'Post to Facebook'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Security]&lt;/strong&gt; The ticket 'peek' popup now verifies that the current worker has access to the ticket's group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3306" title=""&gt;CHD-3306&lt;/a&gt;] [Workspaces/Mail/Security]&lt;/strong&gt; The Search-&gt;Messages worklist now enforces group memberships as a filter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Mail/Filtering]&lt;/strong&gt; The 'is defunct' field of the sender may now be used as a condition in VA-driven mail filtering behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Mail Filtering]&lt;/strong&gt; Virtual Attendant Mail Filtering behaviors may now set the sender 'is defunct' and 'is banned' fields as actions.  This makes it possible to ban/unban a sender during mail filtering, and to remove the defunct flag when a previously defunct sender writes a new incoming message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Mail Filtering/Simulator]&lt;/strong&gt; Fixed an issue with using the Virtual Attendant Simulator on Mail Filtering behaviors.  Due to the way that the event works in conjunction with the parser, the underlying fields (i.e. those not set by the simulator's form) didn't have any values set.  This made it difficult to simulate behaviors that looked at related records; for example, getting or setting values for the sender as an action during mail filtering.  The issue was solely with the simulator; the actual events always worked properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3307" title=""&gt;CHD-3307&lt;/a&gt;] [Mail/Parser/Defunct]&lt;/strong&gt; The 'defunct' flag will now be automatically removed from a sender's record if they send a new incoming message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3304" title=""&gt;CHD-3304&lt;/a&gt;] [Mail/Profiles/Permalink]&lt;/strong&gt; When displaying a mail conversation, each expanded message now contains a 'permalink' link below the headers.  This makes it easy to send a link to another worker regarding a specific message.  In addition to scrolling the browser down to the appropriate message, the message will also be briefly highlighted for a visual cue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Profiles/Comments]&lt;/strong&gt; When displaying a mail conversation, each comment now contains a 'permalink' link in the top right.  This allows workers to exchange URLs that will focus a specific comment in the timeline.  Just like the permalinks for messages, the focused comment will show a highlight effect as a visual cue.  The focused message will also be maximized automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Profiles/Usability]&lt;/strong&gt; When viewing a mail conversation timeline, the 'minimize' and 'maximize' links will now only be shown for the message under the mouse cursor.  This improves usability by reducing the number of links on the page at a given time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Usability]&lt;/strong&gt; When clicking into a ticket from a message worklist, the conversation will now automatically focus and expand that message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3302" title=""&gt;CHD-3302&lt;/a&gt;] [Mail/Sticky Notes/Watchers]&lt;/strong&gt; Creating a sticky note on a ticket message will now automatically notify any watchers on that ticket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Sticky Notes/Usability]&lt;/strong&gt; When displaying a sticky note, a 'permalink' link is now available in the top right.  This allows workers to share a URL that automatically focuses a particular note.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3300" title=""&gt;CHD-3300&lt;/a&gt;] [Support Center/Knowledgebase/Usability]&lt;/strong&gt; In the Support Center, the number of knowledgebase articles displayed per page in worklists is now a configurable option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3297" title=""&gt;CHD-3297&lt;/a&gt;] [Mail/Sticky Notes]&lt;/strong&gt; Fixed a bug in ticket conversations where sticky notes were no longer displayed for a particular message after minimizing and maximizing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3296" title=""&gt;CHD-3296&lt;/a&gt;] [Groups/Setup/Buckets]&lt;/strong&gt; Bucket names may now be up to 64 characters in length.  When editing a bucket, the form will now enforce this maximum length.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.atlassian.net/browse/CHD-3295" title=""&gt;CHD-3295&lt;/a&gt;] [UI/Worklists/Usability]&lt;/strong&gt; The '(dismiss)' option for worklist helpers is now consistently located in their top right corner.  Previously, an 'undo' helper showed dismiss on the left.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://cerberusweb.com/support/kb/article/100</link><pubDate>Wed, 27 Mar 2013 16:52:37 GMT</pubDate><guid isPermaLink="false">a714b95e14d201cede428a376c6b44ba</guid></item><item><title>6.2 Changelog</title><description>&lt;h1&gt;Release notes for Cerb 6.2&lt;/h1&gt;

&lt;p&gt;Cerb (6.2) is a major functionality update released on December 17, 2012.   It contains over 123 new features and usability tweaks from community feedback.&lt;/p&gt;

&lt;p&gt;See: &lt;a href="http://wiki.cerbweb.com/6.2"&gt;http://wiki.cerbweb.com/6.2&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Pie Charts/Subtotals]&lt;/strong&gt; Subtotal widgets on dashboards can now be configured to display their values as a pie chart instead of a frequency table.  There are default wedge colors for up to 20 values, and they've been selected for clean visual separation as well as aesthetics.  While following a rainbow pattern, the colors begin at green rather than red, ensuring the largest wedges are one of the green-blue-violet spectrum subdued colors instead of an alarming large red block on a dashboard. A list of subtotal values is displayed below the chart.  The pie charts also have mouse interaction.  Hovering over a wedge will render a slightly transparent bumper at the edge, and it will display a highlighter style on the appropriate subtotal; making it very easy to identify which value is associated with the selected pie wedge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Subtotals]&lt;/strong&gt; Subtotal widgets can now limit their results to the top 3-20 subtotal categories.  This is useful when you want to build a 'Top 10' list, even though there may be extra results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Community Portals/Proxy]&lt;/strong&gt; Moved the visitor cookie handling into the Community Portals functionality. It was originally in the deployed &lt;code&gt;index.php&lt;/code&gt; per portal, but this made it difficult to replace the PHP reverse proxy with other proxy software.  It's now trivial to forego the &lt;code&gt;index.php&lt;/code&gt; file and deploy Community Portals with more capable proxies like Apache mod_proxy or Nginx instead.  The index.php deployment is no longer recommended, but it will remain available because it's the easiest option that is supported in nearly all environments (including shared hosting).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Plugins]&lt;/strong&gt; Plugins can contribute new datasources for dashboard widgets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Charts]&lt;/strong&gt; Each series on a dashboard chart widget may now specify its own datasource. This makes it possible to plot data from multiple sources on a single chart. Previously charts were limited to just worklist data, but additional sources may be now implemented through plugins. Existing charts will be migrated automatically to the new format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Plugins]&lt;/strong&gt; Implemented dashboard widget datasource extensions for worklist, url, and manual entry. These behave comparably to the earlier built-in options; however, they can now be reused in new types of widgets (even in third-party plugins).  A datasource extension can specify in its manifest which widgets it knows how to provide data for.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Counters]&lt;/strong&gt; Counter widgets on dashboards can now pull in data using datasource plugins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Gauges]&lt;/strong&gt; Gauge widgets on dashboards can now pull in data using datasource plugins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Usability]&lt;/strong&gt; Some friendly instructions are now provided on gauge and counter widgets when they have no data source configured.  This helps disambiguate true values of zero in those widgets from a non-configured widget.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Counters/Usability]&lt;/strong&gt; Improved the usability when setting up a new counter on a dashboards. You no longer have to click into multiple tabs to configure its style and data source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Counters/Usability]&lt;/strong&gt; When setting up a counter, the data format for 'seconds' has been renamed to 'time elapsed' to make its purpose more intuitive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboard/Gauges/Usability]&lt;/strong&gt; When setting up a gauge on a dashboard you can now always override the data format (e.g. number, decimal, percentage, time elapsed), or prepend and append text to the label.  Previously these options were only available when using the 'manual' data source.  This improves the flexibility of other data sources (especially arbitrary ones like 'URL').&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Charts/Usability]&lt;/strong&gt; Improved the usability of configuring charts on dashboards. You now no longer have to click into multiple tabs to set the type of chart and pick a data source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Bar Charts]&lt;/strong&gt; Bar charts on dashboards are now capable of displaying a mix of positive and negative values. This is especially useful when plotting changes (i.e. deltas) in some metric over time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Bar Charts/Usability]&lt;/strong&gt; Bar charts on dashboards now display a line through zero on the y-axis.  For regular bar charts with all positive values this improves readability when some bars may represent a zero values (and appear to have gaps).  For charts with positive and negative values the origin line draws a clear distinction between them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Charts]&lt;/strong&gt; Line charts on dashboards can now be used to plot negative values.  This is especially useful on time series charts where the y-axis value may be a positive or negative change (i.e. delta) in value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Platform/Usability]&lt;/strong&gt; Improved the mouseover tooltips for dashboard charts.  They used to be printed directly on the chart, which meant they didn't handle long values well, and they also partially obscured the upper bounds of the data.  Now the tooltips are handled by jQuery and CSS, so they could float or be stylized however we want.  Eventually these will be exposed as custom events in the charting library, but the new defaults are more useful than the previous behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Scatterplots/Usability]&lt;/strong&gt; Scatterplots on dashboards are now their own widget. Previously they were a rendering option on charts, but their usage is different and it was confusing to many people that some line or bar charts couldn't display as a scatterplot without modification.  It's now possible for datasource extensions to treat scatterplots specially; they're designed to visualize non-linear clusters of data.  Existing scatterplots will be automatically migrated to the new format and shouldn't require any modification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Scatterplots]&lt;/strong&gt; Scatterplots will now scale their axes based on the given data.  Previously, all scatterplots had (0,0) in the bottom left and if data was significantly larger (or negative) then most of the chart was wasted whitespace.  Now you can use dates and timestamps on an axis and the chart will be scaled to the time between the min/max date, rather than showing 'all time'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Scatterplots]&lt;/strong&gt; Scatterplots can now display negative values.  This is useful when plotting deltas where a trend may be decreasing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Pie Charts]&lt;/strong&gt; A new pie chart widget has been added to dashboards. This can be used to visualize distributions for external datasources.  The subtotals widget is still the easiest way to render a pie chart from a worklist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Pie Charts]&lt;/strong&gt; The legend on pie charts can be set visible or hidden.  When hidden, only the label and value of the currently focused wedge will be displayed.  This is useful when there are many wedges and displaying the values all the time would clutter the dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboard/Pie Charts]&lt;/strong&gt; The value for pie chart wedges can be given a specific type (e.g. seconds elapsed, bytes, number, percentage, decimal) as well as a prefix and/or suffix.  This makes it easier to discern units and whether you're looking at frequencies, averages, or sums.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Charts]&lt;/strong&gt; Added a slight margin to the top and bottom of line charts so their min/max plots aren't cut in half.  The y-zero line is also adjusted by -0.5 if it was on an odd numbered pixel, since this gives sharper straight lines w/o anti-aliasing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Counters/Gauges/Usability]&lt;/strong&gt; Dashboard counters and gauges may now display their values in 'bytes', which will display human readable units of storage space (e.g. 50KB, 270MB, 4.7GB).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Performance/Platform/Plugins]&lt;/strong&gt; Prior to version 6.2, viewing the Plugins page in Setup would automatically scan the filesystem for new plugins or updates. This had a considerable performance impact because it reloaded every feature and plugin, including some expensive database operations (ACL, translations, etc). The process because generally unnecessary due to the introduction of the Plugin Library in version 5.7. Given those factors, this functionality has now been optimized in two ways: (1) Cerb will only scan for new plugins and changes in the storage/plugins/ directory when visiting the plugin page; (2) only plugins with a new version number in their plugin.xml will be re-synchronized.  For most visits to the plugins page there should be a dramatic reduction in the amount of REPLACE queries run against the database.  During development, the DEVELOPMENT_MODE flag circumvents this behavior to make it more convenient to edit code and view the results without constantly running the /update page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Plugins]&lt;/strong&gt; Fixed a bug in the DevblocksPlatform::sortObjects() method that forced all numbers to be compared as integers, thus rendering it incapable of properly sorting decimals (e.g. 0.5 and 0.3 were both rounded to zero). Numbers are now properly compared as floating point values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Usability/Plugins]&lt;/strong&gt; Added a 'TB' (terabytes) grouping to the 'bytes' format options and DevblocksPlatform::strPrettyBytes().&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Scatterplots]&lt;/strong&gt; Multiple series on a dashboard scatterplot widget can now be plotted on independent or shared axes.  Independent axes are useful when you want to look for relative trends between series on different scales.  Shared axes compares each series on the same scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Scatterplots/Usability]&lt;/strong&gt; Scatterplots now make a clearer distinction between plots from different series by using as a different symbol (e.g. o, +, x, *) as well as color.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Platform/Dependencies]&lt;/strong&gt; Upgraded to jQuery UI 1.9 from 1.8.18&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3144" title=""&gt;CHD-3144&lt;/a&gt;] [Autocomplete/Usability]&lt;/strong&gt; FIXED: Autocompletes overwrite input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Devblocks/Platform]&lt;/strong&gt; Added DevblocksPlatform::strBase32Encode() and ::strBase32Decode() helper functions.  This is an uncommon encoding, but it's used for integration with Google Authenticator and there aren't built-in functions to base32 encode/decode (RFC-4648) in PHP5.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security/Usability]&lt;/strong&gt; The login system has been renovated to support different authentication methods per worker.  Previously, a worker had to know to switch between password, LDAP, OpenID, etc.  Now, admins assign a specific method to a worker.  The login form has two steps: in the first the worker provides their email address, and then they are routed to the appropriate login method for their account.  This makes it much easier to standardize authentication on something like LDAP and hide normal Cerb password logins entirely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security/Usability]&lt;/strong&gt; When a new worker is invited to Cerb, or a worker's authentication method changes, they will be given the opportunity to set up their account's credentials on the next login.  Previously an admin had to establish the initial password for new workers, and it was sent in plaintext through email -- and was possibly communicated in other ways between the admin and worker (SMS, email, chat room, etc).  This process was a weak link in security.  Now the worker can verify their identity through a one-time code, and they can set up a secure password right from their browser.  This process also works for the advanced authentication methods like OpenID or Password+GoogleAuth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security/Usability]&lt;/strong&gt; When a login authentication method other than 'password' is in use, workers will not be shown the 'change password' option.  Additionally, if the OpenID plugin is installed but not activated for a given worker, they will not be shown the OpenID options in their preferences.  This should reduce confusion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security/Recover]&lt;/strong&gt; Each worker may now configure up to three 'secret questions' that are used to verify their identity when recovering their account's login information.  In the past, all a worker needed to do to reset their login information was receive a code to their email address.  The secret questions add an extra layer of security, because even if the code is intercepted (e.g. man-in-the-middle attack, packet sniffer, key logger) the attacker would need to know secret information about the worker to assume their identity.  The page for setting up these questions makes recommendations about secure questions, but they should be open-ended non-quantitative questions like "What is your favorite sentence in your favorite book?".  Answers to such questions are incredibly difficult to research or guess compared to "How old were you when&#x2026;" or "What is your father's middle name?".  Secret questions shouldn't have answers that can be found with a Google search or through social media.  The wording of the answer must be exact, with all punctuation; although answers are case insensitive.  An optional hint may be provided for each question and answer pair.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security/Recover/Plugins]&lt;/strong&gt; A new centralized system for recovering an a worker account has been implemented.  This saves plugin developers from having to implement redundant or inconsistent recovery methods.  When a worker starts the account recovery process they are sent a one-time code through email and they are asked their secret questions (if configured).  Once identified, their login method is instructed to reset their credentials and their next login will run through the set up process again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security]&lt;/strong&gt; When an invalid worker email address is typed into the login form, the password form will always be shown to make it more difficult for an attacker to discover valid logins.  If the login form specified "Invalid worker" then an attacker could guess valid email addresses by using known worker names.  They may still be able to guess worker email addresses, but the system will not confirm if they are valid or not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Security]&lt;/strong&gt; Invalid email addresses or failed authentication (i.e. bad password) will now cause Cerb to pause for two seconds before reporting an error.  This slows down brute force attempts (at least on a single connection).  In a near future update this delay could become longer with each successive failure, and lock the account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Plugins]&lt;/strong&gt; The login process may now be asynchronous.  For example, with the OpenID plugin there are multiple URL redirects before authentication is successful or fails.  Previously, Cerb expected an immediate answer from $extension-&gt;authenticate().  Plugins that need to redirect the browser before proceeding may redirect to the new /login/authenticated endpoint to finalize the new session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Devblocks/Platform/QR]&lt;/strong&gt; The jquery.qrcode plugin by Jerome Etienne is now available in the global jQuery environment.  This is useful to quickly send information to mobile phones from the screen.  See: http://jeromeetienne.github.com/jquery-qrcode/&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3099" title=""&gt;CHD-3099&lt;/a&gt;] [Login/Security/Google Authenticator]&lt;/strong&gt; Implemented a new worker login plugin for two-factor authentication using 'Password + Google Authenticator'.  This plugin requires workers to provide both their password and a time-based one-time password from the Google Auth mobile app (available for iOS, Android, and Blackberry).  Cerb supports configuring Google Authenticator with a QR code that is displayed on the screen during a worker's first login.  This significantly improves security by requiring both "something you know" (the password) and "something you have" (the physical mobile phone) in order to log in; and it's unlikely an attacker will have both.  Each worker's mobile device is configured (via QR code) with a different random 16-character secret.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Peek/Usability]&lt;/strong&gt; The peek popup for tickets now displays the Messages and Properties content on the same screen.  Previously you had to switch between tabs to either preview the conversation or make changes to its properties.  This removes extra clicks from one of the most frequently used interface elements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Widgets/Custom HTML]&lt;/strong&gt; Added a new 'Custom HTML' widget to dashboards.  This provides a block of user-defined HTML/CSS/Javascript.  There are countless uses for this: displaying external images, rendering charts from the Google Charts API, sharing announcements, posting todo lists, displaying widgets from Twitter/GitHub/Facebook, etc.  Previously these things would need to be implemented as widget plugins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Login/Usability]&lt;/strong&gt; The login form now provides a "remember me" option which saves the current worker's email address in a cookie for two weeks.  When enabled, subsequent requests to /login will automatically be redirected to the appropriate login form for the worker with the email address pre-filled.  This streamlines the two-step login process on trusted computers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Security/Sessions/Usability/Mobile]&lt;/strong&gt; In Setup-&gt;Security admins may now determine when session cookies should expire in worker browsers.  Previously these cookies were always removed when the browser was closed, but on mobile devices this distinction isn't always dependable.  This resulted in session cookies that could expire many times per day on a mobile device despite never logging out or closing the mobile browser tab.  Session cookies may now also be set to expire after 1 day, 1 week, 2 weeks, or 1 month.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Security/Session]&lt;/strong&gt; Signing out will now destroy the current session's cookie.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3194" title=""&gt;CHD-3194&lt;/a&gt;] [Mail/History/Usability]&lt;/strong&gt; The 'Recipient History' tab on ticket profiles now shows a count of the total number of rows in the worklist.  The count reflects the scope (recipients, org, domain) and any active worklist filters.  For example, to see the open ticket count on the history tab when viewing tickets you just need to filter the history worklist to status=open.  The count will then automatically reflect open tickets on all subsequent pages.  This should speed up workflows where multiple open tickets from the same sender are reviewed and potentially merged.  Previously, workers always had to click into the history tab to see if anything needed their attention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2783" title=""&gt;CHD-2783&lt;/a&gt;] [Mail/Merge/Usability]&lt;/strong&gt; When merging tickets from a worklist, a confirmation popup is now displayed to verify the action.  Previously, the merge action took place immediately.  This should help prevent accidental merges from workers clicking on the wrong button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3081" title=""&gt;CHD-3081&lt;/a&gt;] [Dashboards/Worklists/Usability]&lt;/strong&gt; The 'add record' popup is now available from worklist widgets on dashboards.  When you hover over a worklist the (+) icon will appear.  This allows new records of any type to be created from dashboards without having to navigate to the search page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Worklists/Usability]&lt;/strong&gt; The 'peek' button will no longer wrap to the next line and leave gaps in worklist widget rows on dashboards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Worklists/Usability]&lt;/strong&gt; Worklist widgets on dashboards will no longer underline record links unless they're hovered over.  This reduces visual clutter, as too many links on the screen can be overwhelming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Reply/Usability]&lt;/strong&gt; The snippet search box on the mail reply screen now shows a hint of "(Ctrl+Shift+I)" as the placeholder.  This lets workers know that a keyboard shortcut is available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Workspaces/Activity Log]&lt;/strong&gt; Activity Log worklists may now be added to dashboards and workspaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Worklists]&lt;/strong&gt; Activity Log worklists may now be filtered to specific actors or targets.  For example, this can create a list of all the activity performed by a specific worker.  Alternatively, you may create a list of all the activities that happened to a worker (e.g. assignments).  This is especially useful when activity log worklists are added to dashboards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Worklists]&lt;/strong&gt; Activity Log worklists may be filtered by actor or target contexts.  The available options are now displayed in a multiple selection list.  For example, a worklist may be created that displays all the activity that happened to task records, or activities that were performed by workers (rather than groups or the system).  This is especially useful when activity log worklists are added to dashboards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Worklists]&lt;/strong&gt; Activity Log worklists may be filtered by activity.  The available options are now displayed in a multiple selection list.  Previously, the person setting up the worklist had to know the internal IDs for the various events (which is unlikely).  This change makes it easy to create a worklist of a specific kind of activity; for example, a list of comments posted on any record over the past week.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2464" title=""&gt;CHD-2464&lt;/a&gt;] [Activity Log/Security/Logins]&lt;/strong&gt; The Activity Log will now record worker login and logout activity.  Both logins and logouts record the IP address in use at the time.  The login event also records the user-agent (platform, browser, version).  This is especially useful when combined with workspace dashboards to perform security oversight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Impersonation/Security]&lt;/strong&gt; The Activity Log now records worker impersonation by administrators.  The entry links to the administrator as the 'actor' with the worker they're impersonating as the 'target'.  This provides accountability for impersonation events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3182" title=""&gt;CHD-3182&lt;/a&gt;] [&lt;a href="http://wgmdev.com/jira/browse/CHD-3057" title=""&gt;CHD-3057&lt;/a&gt;] [Snippets/Worklists/Usability]&lt;/strong&gt; The green (+) add button is now available at the top of all snippet worklists. This consistency improvement enables the quick creation of snippets from arbitrary workspaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2756" title=""&gt;CHD-2756&lt;/a&gt;] [&lt;a href="http://wgmdev.com/jira/browse/CHD-2915" title=""&gt;CHD-2915&lt;/a&gt;] [Activity Log/Mail]&lt;/strong&gt; The Activity Log now records when a ticket is moved between groups or buckets.  This is useful for SLAs and accountability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Subtotals/Platform/Plugins]&lt;/strong&gt; Implemented an abstract &lt;em&gt;getSubtotalDataForContextAndIdColumns() method on C4&lt;/em&gt;AbstractView for subtotaling a combination of context/context_id fields for any table.  This makes it easy to implement a two-step subtotal process (e.g. first pick 'Worker', then pick a specific worker) for any record type.  This was first implemented for use by snippets (owners) and the Activity Log (actors, targets).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Subtotals]&lt;/strong&gt; Activity Log worklists can now be subtotaled by 'Actor' or 'Target' using the two-step filtering process from context links.  First a record type is selected (e.g. worker, task, ticket), then a specific record of that type may be selected.  This replaces the 'Actor Context' and 'Target Context' subtotal fields because they're redundant with the first part of this new process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Snippets/Subtotals]&lt;/strong&gt; Snippet worklists can now be quickly filtered using owner subtotals.  This uses a two-step subtotal process where the first step selects the owner type (e.g. worker, group, role) and the second step can optionally pick a specific owner of that type.  This is more flexible than the 'owner' filter, which doesn't currently provide the option to find any worker-owned snippets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workspaces/Subtotals/Code Cleanup]&lt;/strong&gt; Broken context links (e.g. links to records that have been deleted) will no longer be included in subtotal counts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2822" title=""&gt;CHD-2822&lt;/a&gt;] [Choosers/Usability]&lt;/strong&gt; Chooser popups opened from other choosers will now behave properly.  For example, you can filter tickets by watchers using a chooser, and from there you can filter the worker list by a group chooser.  Previously, the nested choosers would replace the first popup, making it impossible to complete the desired action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Activity Log/Virtual Attendants/Worklists]&lt;/strong&gt; Virtual Attendants can now manage worklists and behavior variables using Activity Log data.  For example, a VA can send a daily report about worker login activity to a manager's email address.  This could also be used to build a list of comments (e.g. comments by a particular worker, any comments about tickets, etc).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Links]&lt;/strong&gt; Virtual Attendants can now set dynamic links on any related records, custom fields, or behavior variables.  Previously, each event only had a few actions like 'set ticket links', and the records to link had to be selected ahead of time with a chooser.  Now, there is an 'On:' option for selecting the target record (which could be a ticket's sender's organization), and links can be set using placeholders and behavior variables, as well as choosers.  For example, a VA behavior can read new ticket subjects looking for a domain to be mentioned, and it can automatically link that domain to the ticket.  There could be thousands of possible domains and they don't have to be specified in the VA behavior ahead of time.  This enables much more sophisticated workflow automation.  Existing 'set links' actions will be automatically converted to the new format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Links/Simulator]&lt;/strong&gt; The Virtual Attendant simulator will now display output for all 'Set links' actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3206" title=""&gt;CHD-3206&lt;/a&gt;] [Subtotals/Workspaces/Usability]&lt;/strong&gt; Fixed an issue where clicking '(none)' hid the other totals when subtotaling KB articles by 'Topic' or messages by 'Worker'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3205" title=""&gt;CHD-3205&lt;/a&gt;] [Drafts/Worklists]&lt;/strong&gt; FIXED: Filtering on 'Message Type' via subtotals in a Draft worklist displays untranslated text in the filter bubbles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Knowledgebase]&lt;/strong&gt; Fixed an issue with Markdown-formatted Knowledgebase articles breaking in older versions of PHP 5.x when an article was tens of thousands of characters long.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2819" title=""&gt;CHD-2819&lt;/a&gt;] [Support Center/Registered Contacts]&lt;/strong&gt; Registered Contacts can now be added from worklists.  These records control who can log in to the Support Center.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Support Center/Registered Contacts] Registered&lt;/strong&gt; Contacts can now be deleted from their peek popup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2699" title=""&gt;CHD-2699&lt;/a&gt;] [Virtual Attendants/Links/Watchers]&lt;/strong&gt; Virtual Attendants can now remove links and watchers from any record.  The links to be removed can be placeholders (e.g. fields, watchers, custom fields), selected from choosers, or behavior variables (e.g. dynamic worklists).  The 'Set Links' action has a new mode toggle for choosing between adding or removing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3187" title=""&gt;CHD-3187&lt;/a&gt;] [Virtual Attendants/Mail Filtering]&lt;/strong&gt; Virtual Attendants can now remove attachments on incoming messages from Mail Filtering behavior.  Attachments can be matched with exact filenames, wildcard patterns, or regular expressions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3200" title=""&gt;CHD-3200&lt;/a&gt;] [Security/Parser/Relay]&lt;/strong&gt; Fixed an issue where the relay auth header could be spoofed in order to have arbitrary messages appended to existing tickets.  This is a low severity issue since it's no different than someone spoofing an email address with a known ticket mask from someone else.  Cerb won't automatically add these new senders to the conversation, and the risk for social engineering is low.  However, because the relay auth header uses internal IDs instead of masks, it makes it easier for someone with malicious intent to hit a large range of IDs.  It would be more tedious to clean up these junk messages than if they created new tickets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Counters/Gauges]&lt;/strong&gt; The 'manual' datasource on dashboard counters and gauges will now properly format numbers when they contain commas as thousands separators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Profiles/Calendar/Usability]&lt;/strong&gt; Added keyboard shortcuts to calendar event profiles pages.  The edit popup can be opened with 'e', the 'm' key opens the VA macros popup, and the 1-9 keys change the selected tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Search/Worklists/Usability]&lt;/strong&gt; Fixed an issue on /search worklists where the shortcut for 'select all (a)' wasn't toggling the row selection properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3210" title=""&gt;CHD-3210&lt;/a&gt;] [Mail/Peek/Usability]&lt;/strong&gt; Removed the hidden feature where a worker can double click on the email text in the peek popup to close it.  This constantly interferes with the ability to highlight text for copy/paste.  The shortcut is a remnant from before the ESC key closed the popup window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3197" title=""&gt;CHD-3197&lt;/a&gt;] [Quick Search/Choosers/Usability]&lt;/strong&gt; Fixed an issue in choosers where the last-used quick search filter wasn't automatically selected the next time the form displayed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2780" title=""&gt;CHD-2780&lt;/a&gt;] [Roles/Mail/Drafts]&lt;/strong&gt; Added a new permission that allows workers to delete each other's mail drafts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3192" title=""&gt;CHD-3192&lt;/a&gt;] [Time Tracking]&lt;/strong&gt; FIXED: Some time Tracking activity log entries have a redundant 'mins' unit appended to the end of the description (e.g. "5 mins mins").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3097" title=""&gt;CHD-3097&lt;/a&gt;] [Time Tracking/Activity Log]&lt;/strong&gt; The Activity Log now records status changes on Time Tracking entries (e.g open/closed).  This is useful for change management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.address.update' event for plugin listeners to react to Address record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.calendar_event.update' event for plugin listeners to react to Calendar Event record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.contact_org.update' event for plugin listeners to react to Organization record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.contact_person.update' event for plugin listeners to react to Contact Person record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.group.update' event for plugin listeners to react to Group record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.notification.update' event for plugin listeners to react to Notification record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.snippet.update' event for plugin listeners to react to Snippet record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.worker.update' event for plugin listeners to react to Worker record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.role.update' event for plugin listeners to react to Worker Role record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.workspace_widget.update' event for plugin listeners to react to Workspace Widget record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.feedback_entry.update' event for plugin listeners to react to Feedback record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Events]&lt;/strong&gt; Added a new 'dao.kb_article.update' event for plugin listeners to react to Knowledgebase Article record changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Code Cleanup/Platform/Resources]&lt;/strong&gt; Removed the unnecessary semi-colon from the 'Content-Type:' header in the resource proxy.  Certain webservers (e.g. Nginx) have trouble compressing this content when using a terminator with no additional parameters (e.g. encoding).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Plugin Dev/Broadcast/Links]&lt;/strong&gt; Broadcast functionality can now automatically link the newly created tickets with the involved records.  To do so, include the 'context_links' parameter in the draft with an array of context+id pairs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2821" title=""&gt;CHD-2821&lt;/a&gt;] [CRM/Opportunities/Broadcast/Links]&lt;/strong&gt; When broadcasting to an opportunity worklist, each opportunity will be automatically linked to the new ticket that it opens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Notifications]&lt;/strong&gt; Virtual Attendants may now create notifications without a linked object or URL. Clicking one of these will link back to the worker's notifications list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3100" title=""&gt;CHD-3100&lt;/a&gt;] [Mail/Filters/Notifications]&lt;/strong&gt; Mail filtering behavior can now use the 'Create notification' action.  For example, you can send a notification to admins when bouncing or rejecting an inbound message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3153" title=""&gt;CHD-3153&lt;/a&gt;] [Web-API/Search/Knowledgebase]&lt;/strong&gt; Knowledgebase articles can now be filtered by 'topic_id' through the Web-API search feature.  This returns articles that share the same top-level category.  Each matched article is returned only once, even if it appears in multiple subcategories on the topic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3170" title=""&gt;CHD-3170&lt;/a&gt;] [Address Book/Web-API]&lt;/strong&gt; Added an 'updated' field to address records to make it easier to synchronize the data with other systems.  This timestamp is automatically updated when an address record changes through the GUI or API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Web-API/Search]&lt;/strong&gt; The Web-API now supports the 'between' operator for filtering date fields by range.  The 'value[]' parameter should be a JSON-encoded array with two elements for 'from' and 'to' as Unix timestamps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3143" title=""&gt;CHD-3143&lt;/a&gt;] [Mail/Search/Notes]&lt;/strong&gt; Ticket worklists can now be search filtered by sticky note content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3058" title=""&gt;CHD-3058&lt;/a&gt;] [Virtual Attendants/Tasks/Custom Fields]&lt;/strong&gt; Virtual Attendants can now set custom fields on the 'Create task' action.  The custom field values can use any of the placeholders from the current event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Virtual Attendants/Mail/Custom Fields]&lt;/strong&gt; Virtual Attendants can now set custom fields on the 'Create ticket' action.  The custom field values can use any of the placeholders from the current event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Setup/Virtual Attendants/Usability]&lt;/strong&gt; In Setup-&gt;Configure-&gt;Virtual Attendants, the menu will no longer open multiple instances of the same tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3070" title=""&gt;CHD-3070&lt;/a&gt;] [Snippets]&lt;/strong&gt; Fixed an issue in snippets where placeholders using the '|default' filter would always return default values instead of field values.  For example, the snippet "Hi {{sender&lt;em&gt;first&lt;/em&gt;name|default('there')!" always returned "Hi there!" instead of "Hi Bob!".  This is because the underlying template engine (Twig) wasn't designed with Cerb's dynamic placeholders in mind and their "placeholder exists" checks are too simplistic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2772" title=""&gt;CHD-2772&lt;/a&gt;] [Snippets/Usability]&lt;/strong&gt; Snippet worklists and choosers now show a preview of each snippet's content.  This makes it easier for workers to find the right template compared to just being able to see titles.  When using a chooser, the previews will execute the snippet logic and automatically replace placeholders with the appropriate values from the target record.  This lets workers see the exact text that will be inserted if that snippet is selected.  In the preview, placeholders that have been replaced with their corresponding values have a special style to provide a visual distinction between normal and dynamic text.  Placeholders are also highlighted in the snippet previews on worklists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-1117" title=""&gt;CHD-1117&lt;/a&gt;] &lt;a href="http://wgmdev.com/jira/browse/CHD-2775" title=""&gt;CHD-2775&lt;/a&gt;] [Snippets/Placeholders/Usability]&lt;/strong&gt; You can now add 'fill-in' placeholders to snippets which will prompt the current worker for more information before the text is inserted.  These are values that aren't derived from records or custom fields; for example: order numbers, tracking numbers, product names, ETAs, etc.  There are three types of fill-in placeholders: a single line of text with a descriptive label (e.g. "paste tracking number here"), a single line of text with a default value (that can be modified by the worker if needed), and multiple lines of text (e.g. "paste receipt here").  These can be inserted from the menu when editing snippets.  Fill-in placeholders are required, so a snippet can't be accidentally sent with markers like "(paste order number here)" left in place.  If there are placeholders that haven't been filled in, clicking the 'insert' button will automatically focus the first incomplete field.  The form elements for fill-in placeholders will automatically resize as text is added or removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Usability/Compose]&lt;/strong&gt; When composing or replying to mail, the textbox will now automatically grow to accommodate the full height of the message.  Previously the textbox was a fixed height and workers had to constantly scroll around in a smaller reply window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Compose/Usability]&lt;/strong&gt; The snippet autocomplete box is now available on the compose popup.  This allows workers to efficiently find and insert a snippet without the extra steps required to use the chooser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Compose/Usability/Keyboard]&lt;/strong&gt; Added the Ctrl+Shift+I shortcut to the compose popup for focusing the snippet options.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Compose/Usability/Keyboard]&lt;/strong&gt; Added the Ctrl+Shift+G shortcut to the compose popup for inserting the current worker's signature at the cursor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-3039" title=""&gt;CHD-3039&lt;/a&gt;] [Mail/Compose/Usability]&lt;/strong&gt; The compose popup will now automatically save the current draft every 30 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[&lt;a href="http://wgmdev.com/jira/browse/CHD-2700" title=""&gt;CHD-2700&lt;/a&gt;] [Mail/Reply/Drafts]&lt;/strong&gt; When replying to mail, the current draft will be saved a final time before attempting to send the message.  If the mail server has problems then the draft will be the latest version of the message for later resumption.  Previously, the failure to send a message would only save a draft if none existed already, and drafts are only deleted after a successful send.  This meant that changes to the message since the last save (i.e. within up to 30 seconds) could be lost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Compose/Drafts]&lt;/strong&gt; Fixed a bug on the compose popup where resuming a draft wouldn't properly restore the status (e.g. open, waiting, closed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Reply/Usability]&lt;/strong&gt; When replying to messages, the quoted content will now automatically wrap at 76 characters.  Previously, a right angle bracket (&gt;) was prepended to the beginning of each line from the original message.  Quotes with long lines were difficult to read because they wrapped without the quote character in front of them.  The new functionality rewrites the quoted message to improve readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Mail/Reply/Keyboard]&lt;/strong&gt; Added two new shortcuts to the Mail Reply text box. Ctrl+Shift+J jumps to the first blank line in a quoted message.  Ctrl+Shift+Q wraps quotes to 76 characters.  The wrapping happens automatically for the first quoted message, but the keyboard shortcut is useful when copying and pasting quoted content from elsewhere.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Dashboards/Subtotals/Usability]&lt;/strong&gt; Improved the usability of the subtotals widget on dashboards by combining multiple tabs of options into a single config popup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://cerberusweb.com/support/kb/article/99</link><pubDate>Tue, 26 Mar 2013 09:03:53 GMT</pubDate><guid isPermaLink="false">8ed8085a68c71a8e5ec2aabf5261508b</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 or Cerb6 from &lt;a href="https://github.com/wgm/cerb6"&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 Cerb6.&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 Cerb6 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 6.1.4 origin/6.1.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Switch to the new version branch:&lt;br&gt;
&lt;code&gt;git checkout 6.1.4&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.&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/cerb6/&lt;/code&gt; then you would open &lt;code&gt;http://example.com/cerb6/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/cerb6/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://cerberusweb.com/support/kb/article/70</link><pubDate>Thu, 06 Dec 2012 17:19:46 GMT</pubDate><guid isPermaLink="false">fe319aa98e58a0308008b5f0050ec5a7</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 Cerb6 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/cerb6.git cerb6-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/* cerb6-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 cerb6-git

cd cerb6-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;cerb6-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;cerb6-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 Cerb6 in your web browser.&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/71</link><pubDate>Thu, 06 Dec 2012 17:16:36 GMT</pubDate><guid isPermaLink="false">e55aceb088c9c13b485e24008b276ae6</guid></item><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 you. &lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/97</link><pubDate>Thu, 08 Nov 2012 20:26:46 GMT</pubDate><guid isPermaLink="false">6f06cecbf355bef01a69219074cdc6eb</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/cerb-plugins/wgm.ldap"&gt;plugin for LDAP integration&lt;/a&gt; with Cerb.  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://cerberusweb.com/support/kb/article/78</link><pubDate>Tue, 30 Oct 2012 22:25:17 GMT</pubDate><guid isPermaLink="false">023e1a48f42305aec7499d9b9c48f2c4</guid></item><item><title>Switching GitHub repositories from Cerb5 to Cerb6</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;We maintain two separate code repositories on GitHub for Cerb5 and Cerb6.  Before upgrading to the latest versions of 6.x, you should ensure that you're pulling updates from the proper repository.&lt;/p&gt;

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

&lt;p&gt;First, change to the directory on your server where you've installed Cerb:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /path/to/cerb6
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now pull up a verbose listing of your remote repositories:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see output like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;origin  git@github.com:wgm/cerb6.git (fetch)
origin  git@github.com:wgm/cerb6.git (push)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you see &lt;strong&gt;wgm/cerb5.git&lt;/strong&gt; then you need to switch to the &lt;strong&gt;wgm/cerb6.git&lt;/strong&gt; repository.&lt;/p&gt;

&lt;p&gt;Remove the current remote by name (if you're using a name other than &lt;strong&gt;origin&lt;/strong&gt; then substitute that here):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git remote rm origin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add a new remote that points to the Cerb6 repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git remote add origin git://github.com/wgm/cerb6.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pull the latest information from the repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git fetch origin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If desired, you can also upgrade to the latest stable release by switching branches:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout -m stable
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See &lt;a href="http://cerberusweb.com/book/latest/admin_guide/upgrading/"&gt;the manual&lt;/a&gt; for more information about upgrading to new versions of Cerb.&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/98</link><pubDate>Fri, 14 Sep 2012 00:14:13 GMT</pubDate><guid isPermaLink="false">53babf3e907f229974f7d439d97cd7c5</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 or Cerb6 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;cerb6/&lt;/code&gt; directory to somewhere else (for example, &lt;code&gt;cerb6_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/cerb6/branches/stable cerb6&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;cerb6_old/storage/*&lt;/code&gt; directory to &lt;code&gt;cerb6/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;cerb6/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;cerb6/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 Cerb in a directory other than &lt;code&gt;cerb6/&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;cerb6&lt;/code&gt; directory to upgrade to the latest stable version.&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/90</link><pubDate>Fri, 29 Jun 2012 10:07:05 GMT</pubDate><guid isPermaLink="false">5a4588474fc37bd7d75d63ce0423ecaf</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; (&#x201C;WGM&#x201D;) is a commercial open source company that
has been leading and supporting the community development of Cerb6
(formerly Cerberus Helpdesk) 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 (&#x201C;software as a service&#x201D;)
network of applications hosted by subscription as subdomains of
cerb4.com, cerb5.com, and cerb6.com.&lt;/p&gt;

&lt;p&gt;It is WGM&#x2019;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&#x2019;s purpose in
collecting non-personally identifying information is to better
understand how WGM&#x2019;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 website visitors and 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&#x2019;s websites choose to interact 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 financial
transactions with WGM (e.g. by purchasing products and services) 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&#x2019;s
interaction with WGM. WGM does not disclose personally identifying
information other than as described below. 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 Cerb 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 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&#x2019;s behalf or to
provide products and services available at WGM&#x2019;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; and by using WGM&#x2019;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 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 Cerb and
have supplied your email address, WGM may occasionally send you an email
to tell you about new features or to solicit your feedback. We primarily
use our social network profiles to communicate this type of information,
and we expect to keep email broadcasts to a minimum. If you send us a
request (e.g. via a support email or one of our feedback mechanisms), we
reserve the right to anonymously republish 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 information.&lt;/p&gt;

&lt;h2&gt;Security and Safeguards&lt;/h2&gt;

&lt;p&gt;WGM takes reasonable precautions to protect your data and personally
identifying information.&lt;/p&gt;

&lt;p&gt;We do not have physical access to any of our servers or online storage
mediums. See the section about &#x201C;Third-Party Data Centers&#x201D; for the
upstream security policies of SoftLayer, Amazon Web Services, and
Linode. These servers are protected within state-of-the-art data
centers.&lt;/p&gt;

&lt;p&gt;WGM performs 24/7/365 monitoring of our network and service
infrastructure. This includes metrics like server load, process
information, account access, service utilization, and network activity.&lt;/p&gt;

&lt;p&gt;Web-based communication with our servers is protected through 256-bit
encryption via Secure Socket Layer (SSL) technology. This feature is
included with all On-Demand applications when URLs are prefixed with
&#x201C;&lt;a href="https://"&gt;https://&lt;/a&gt;&#x201D;. It is the responsibility of clients and their
representatives to ensure the use of SSL; and upon request we can
configure your application to require the use of SSL.&lt;/p&gt;

&lt;p&gt;We do not store credit card information on our servers. For one-time
transactions we do not save credit card or bank account numbers
anywhere, although we do store email-based receipts that include contact
information, payment type, transaction IDs, and authorization codes. For
recurring transactions, payment information is stored with vendors who
adhere to the Payment Card Industry Data Security Standards (PCI DSS).
We use &lt;a href="http://www.freshbooks.com"&gt;FreshBooks&lt;/a&gt; for sending invoices and
collecting payments, and they protect financial information with AES
encryption. We process credit card transactions through our merchant
account at Authorize.net. Depending on a client&#x2019;s preferred payment
method, these transactions may alternatively take place through other
vendors like PayPal, or through wire transfers to Wells Fargo Bank. We
do not have access to client credit card numbers or bank account
information through any of these vendors.&lt;/p&gt;

&lt;p&gt;WGM technicians securely access our servers using Secure Shell (SSH)
encryption. Logins are authenticated with &lt;a href="http://en.wikipedia.org/wiki/RSA_(algorithm)"&gt;RSA
keys&lt;/a&gt; rather than simple
passwords. We do not provide general purpose client access (e.g. SSH,
Telnet, FTP) to machines housing multi-tenant On-Demand data.&lt;/p&gt;

&lt;p&gt;We have disabled insecure features in our PHP environment (e.g. process
control, shell command execution, remote file includes) to protect
against arbitrary code execution. To protect against cross-site
scripting (XSS), we
&#x201C;&lt;a href="http://en.wikipedia.org/wiki/HTML#Character_and_entity_references"&gt;escape&lt;/a&gt;&#x201D;
all user-provided data that is displayed in a web browser.&lt;/p&gt;

&lt;h2&gt;Disclosure of Security Breaches&lt;/h2&gt;

&lt;p&gt;WGM will notify you as soon as possible if a security breach results in
the potential disclosure of any personally identifiable information or
data related to your account. At the conclusion of a security
investigation, WGM will provide you with a report about the nature of
any compromised data (e.g. email addresses, worker account passwords)
and the actions taken to prevent future intrusions.&lt;/p&gt;

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

&lt;p&gt;WGM remotely provisions, administers, and maintains servers 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;Cerb has two main components for storing customer data: (1) the
database, and (2) the /storage/ filesystem which contains large,
immutable content like email attachments. Data may be stored on a single
machine, or distributed among several machines, on our On-Demand
network. Generally, that data will be housed on WGM&#x2019;s dedicated servers
in SoftLayer&#x2019;s datacenters.&lt;/p&gt;

&lt;p&gt;If you communicate with WGM, or use On-Demand services provided by WGM,
your information will be regularly copied 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&#x2019;s Simple Storage Service
(S3) for long-term, off-site archival.&lt;/p&gt;

&lt;p&gt;When WGM runs nightly backups, we make full backups of the database, and
incremental backups of the /storage/ filesystem. These are stored in the
same datacenter, and are often attached to the same server, but on an
alternate, redundant storage medium.&lt;/p&gt;

&lt;p&gt;Twice per week (usually Wednesday and Sunday) we off-site the latest
backups to our private buckets on Amazon&#x2019;s S3 service. We also rotate
these to keep a weekly backup for a few months of history, and at least
the most recent three backups.&lt;/p&gt;

&lt;h2&gt;Disposal of Data and Backups&lt;/h2&gt;

&lt;p&gt;Upon cancellation, we remove all client data from the On-Demand network
and send a final backup to Amazon S3. We will attempt to make
arrangements for this backup to be transferred to the client before
permanently destroying our copies of the data. Without an explicit
request for their immediate removal, backups may be persisted for
several months.&lt;/p&gt;

&lt;p&gt;We will comply with any written, and duly authenticated, client requests
for the immediate destruction of all account data and backups.&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&#x2019;s
computer, and that the visitor&#x2019;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&#x2019;s
websites, with the drawback that certain features of WGM&#x2019;s websites may
not function properly without the aid of cookies. Web-based products
like Cerb 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&#x2019;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://cerberusweb.com/support/kb/article/72</link><pubDate>Mon, 21 May 2012 20:11:20 GMT</pubDate><guid isPermaLink="false">2f4381bbcd403ab6bfcc0c720913d48b</guid></item><item><title>Adding more information to the subject line of watcher relayed mail</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Often, watchers who receive copies of new helpdesk messages want to filter those messages in their email client. In earlier versions of Cerb5, the subject line for these messages was hard-coded to include an "incoming" or "outgoing" tag, and a ticket mask.  As of 5.4.3, the subject line for relayed mail defaults to the ticket subject, but you can also customize it through the interface using snippets.&lt;/p&gt;

&lt;p&gt;In this cookbook recipe, we're going to add back tags and ticket masks to the subject lines of watcher email.  With what you'll learn, you'll also be able to include any other information you want in either the subject line or message content.  For example, you can append the ticket status to the subject, or you can even include a due date or organization name.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/142c1d72-dec3-102e-b312-0030487e9650/55-virtual_attendant_relay_subjects.png" alt="" title=""&gt;&lt;/p&gt;

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

&lt;p&gt;To start, navigate to your Virtual Attendant by clicking on your name in the top right and clicking on the 'virtual attendant' link.&lt;/p&gt;

&lt;p&gt;If you haven't created Attendant behavior for relaying messages on watched tickets, do the following (if you have, skip ahead):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under 'Create New Behavior', choose 'New Message on a Watched Conversation'.&lt;/li&gt;
&lt;li&gt;Click on the new behavior and select 'Edit Behavior' from the menu.  Enter the title 'Relay messages to my email account'.  Click the 'Save Changes' button.&lt;/li&gt;
&lt;li&gt;Now we want to filter out any messages sent by yourself.  Click on the new behavior again, and select 'Add Decision' from the menu.  Add the title 'Sent by me' and hit the 'Save Changes' button.&lt;/li&gt;
&lt;li&gt;Click on 'Sent by Me' and enter the title 'No'.  Click the 'Add Condition' button and select 'Message sender address'.  Change the dropdown from 'is' to 'is not' and enter your worker email address.  Click the 'Save Changes' button.&lt;/li&gt;
&lt;li&gt;Click on 'No' and select 'Add Actions' from the menu.  Set the title to 'Relay email'.  Under 'Add Action', select 'Relay to external email'.  Select your desired email address from the list.  If you haven't already, you can add additional email addresses to your account from your worker preferences page (click your name in the top right and then 'my settings').&lt;/li&gt;
&lt;li&gt;At this point you should be seeing the same screen whether you already had email relay behavior or you just set it up.  Now we want to customize the message being sent to us.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set the subject to the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; [{%if is_outgoing %}outgoing{%else%}incoming{%endif%} #{{ticket_mask}}]: {{ticket_subject}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click the 'Test' button to make sure you entered it correctly.&lt;/p&gt;

&lt;p&gt;Here's an explanation of exactly what is going on:&lt;/p&gt;

&lt;p&gt;The conditional statement &lt;code&gt;{%if is_outgoing %}&lt;/code&gt; is checking whether or not the current message is outgoing (i.e. being sent by a worker).  If so, the word "outgoing" is added to the subject.  If not, the &lt;code&gt;{%else%}&lt;/code&gt; section is providing "incoming" as the alternate text to display.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;{{ticket_mask}}&lt;/code&gt; placeholder will display the ticket's mask, such as &lt;em&gt;ABC-12345-678&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And, finally, the &lt;code&gt;{{ticket_subject}}&lt;/code&gt; placeholder will display the ticket's subject.&lt;/p&gt;

&lt;p&gt;This should produce a ticket subject for relayed email that looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[incoming #ABC-12345-678]: I'd like to discuss pricing information.
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;More Things to Try&lt;/h1&gt;

&lt;p&gt;You could also add the sender's organization to the subject line, if you know it, by appending the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{%if sender_org_name %} ({{sender_org_name}}){%endif%}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perhaps you'd also like to append the ticket's current status: open, waiting, closed, or deleted.  Append the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;({{ticket_status}})
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the above examples, the important information is the {{placeholder}}, with double curly braces on either side.  I've also wrapped them in (parenthesis) for clarity, so you can tell them apart from the ticket subject.  You can change this to whatever format you want, just make sure to click the 'Test' button before you save your changes.&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/55</link><pubDate>Thu, 29 Mar 2012 10:40:31 GMT</pubDate><guid isPermaLink="false">3cd597c47db3bbaae77d7b4d8910b4f0</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://cerberusweb.com/support/kb/article/89</link><pubDate>Wed, 25 Jan 2012 07:41:41 GMT</pubDate><guid isPermaLink="false">a0394a66ffb04f31a0f28fd0327f19b8</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://cerberusweb.com/support/kb/article/88</link><pubDate>Sun, 15 Jan 2012 23:06:21 GMT</pubDate><guid isPermaLink="false">2961628dfa8dfaf8b1575d41c6bd056f</guid></item><item><title>Relaying notifications to your mobile phone with Twilio</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;This article provides instructions on how to relay all your notifications to your mobile phone using Virtual Attendants and the Twilio plugin.&lt;/p&gt;

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

&lt;h2&gt;Installing the Twilio plugin&lt;/h2&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 your Virtual Attendant to send SMS notifications&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click on your name in the top right and select &lt;em&gt;Virtual Attendant&lt;/em&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Create New Behavior&lt;/em&gt; choose &lt;em&gt;New notification for me&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;New notification for me&lt;/em&gt; bubble and select &lt;em&gt;Add Action&lt;/em&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Set the title to &lt;em&gt;"Send SMS notification"&lt;/em&gt; and under &lt;em&gt;Add Action&lt;/em&gt; select &lt;em&gt;Send SMS via Twilio&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your mobile phone number and set the content to:  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Helpdesk: {{message|truncate(130)}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;|truncate(130)&lt;/code&gt; modifier will make sure the notification is never longer than the maximum SMS message size.  Some mobile providers will deliver messages longer than this as multiple messages, and others will reject them. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Save Changes&lt;/em&gt; button.&lt;br&gt;
&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/3b90a2f2-e201-102e-a560-0030487e9650/58-twilio_va_action.png" alt="" title=""&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will automatically relay each new notification to your mobile phone.  If you want to send new notifications through SMS only in certain situations you can add a decision before the action and establish the conditions that must be met.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keywords: text, sms, short message service&lt;/em&gt;&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/58</link><pubDate>Sun, 15 Jan 2012 23:05:05 GMT</pubDate><guid isPermaLink="false">540564a530543fcc009d989dd69626e9</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://cerberusweb.com/support/kb/article/64</link><pubDate>Sun, 15 Jan 2012 22:46:21 GMT</pubDate><guid isPermaLink="false">8fd465ed4140b0e2738e20d1fecbaf0d</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://cerberusweb.com/support/kb/article/86</link><pubDate>Fri, 13 Jan 2012 17:06:17 GMT</pubDate><guid isPermaLink="false">320ccb5a36f731a94101bc1685221d25</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://cerberusweb.com/support/kb/article/85</link><pubDate>Fri, 13 Jan 2012 01:44:51 GMT</pubDate><guid isPermaLink="false">266ac5d7b6bc12c609c8c769b71211ef</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://cerberusweb.com/support/kb/article/84</link><pubDate>Wed, 16 Nov 2011 02:30:54 GMT</pubDate><guid isPermaLink="false">7181e2b5d55fe89de41c3d00fd2aabef</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://cerberusweb.com/support/kb/article/83</link><pubDate>Tue, 15 Nov 2011 23:25:51 GMT</pubDate><guid isPermaLink="false">547d66430bcdf781e0a122182206285e</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://cerberusweb.com/support/kb/article/79</link><pubDate>Wed, 26 Oct 2011 00:04:28 GMT</pubDate><guid isPermaLink="false">59f172f8c5fc4b4717cda348888121e4</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://cerberusweb.com/support/kb/article/82</link><pubDate>Wed, 19 Oct 2011 16:14:11 GMT</pubDate><guid isPermaLink="false">5027bae9d92ba3a58804fd1d89db15f4</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://cerberusweb.com/support/kb/article/66</link><pubDate>Tue, 11 Oct 2011 18:35:39 GMT</pubDate><guid isPermaLink="false">c6a1a5f8562c203e83e370ecd4aa37fe</guid></item><item><title>Sending group auto-replies using Virtual Attendants</title><description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Auto-responders are a useful tool in many situations; for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Groups can send a confirmation for new tickets, which gives customers a reference number and an ETA.&lt;/li&gt;
&lt;li&gt;Mail sent to a certain address, or with a specific subject like &lt;em&gt;"Tell me more"&lt;/em&gt;, can be sent an automated response with more information.&lt;/li&gt;
&lt;li&gt;When new mail is received outside regular office hours, an automated response could manage the expectations of the sender with a message like &lt;em&gt;"We'll reply to you first thing Monday morning"&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On their own, automated replies are nothing new.  Many email applications provide "Vacation messages" which act on the same principle.  What makes Cerb5's functionality interesting is that Virtual Attendants can use everything you know about the sender to personalize the message you're automatically sending.&lt;/p&gt;

&lt;p&gt;With Virtual Attendants, auto-replies can be based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hours of operation (e.g. time of day, day of week, month of year)&lt;/li&gt;
&lt;li&gt;Any information about the current conversation ticket (e.g. group; bucket; subject; sender; org)&lt;/li&gt;
&lt;li&gt;Any custom fields attached to the sender or their organization (e.g. service level agreement; paid support)&lt;/li&gt;
&lt;li&gt;The sender's native language&lt;/li&gt;
&lt;li&gt;Product lines or brands&lt;/li&gt;
&lt;li&gt;and pretty much anything else you can think of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, we'll cover how to create a new auto-responder using the group Virtual Attendant.  The response will confirm receipt of the message and it will provide a reference ID.&lt;/p&gt;

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

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/1036e5d6-ded1-102e-b312-0030487e9650/56-virtual_attendant_auto_responder.png" alt="" title=""&gt;&lt;/p&gt;

&lt;p&gt;You'll need to be a group manager to continue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;groups&lt;/strong&gt; in the top right, and then choose the group you would like to create an auto-responder for.&lt;/li&gt;
&lt;li&gt;Select the &lt;em&gt;Virtual Attendant&lt;/em&gt; tab.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Create New Behavior&lt;/em&gt;, choose &lt;em&gt;New message on a group conversation&lt;/em&gt;.  Click on the new behavior and select &lt;strong&gt;Edit Behavior&lt;/strong&gt; from the menu.  Give it the title &lt;em&gt;"New ticket auto-reply"&lt;/em&gt;, and click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We should restrict this behavior to only new messages and not replies to existing conversations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the new behavior again and select &lt;strong&gt;Add Decision&lt;/strong&gt; from the menu.  Set the title to &lt;em&gt;"Is it new?"&lt;/em&gt; and click the &lt;strong&gt;Save Changes&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"Is it new?"&lt;/strong&gt; and select &lt;strong&gt;Add Outcome&lt;/strong&gt; from the menu.  Set the title to &lt;em&gt;"Yes"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Add Condition&lt;/em&gt; button and type &lt;em&gt;"message is"&lt;/em&gt; in the text box.  This filters the conditions to only those that match your search string.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;message is first in conversation&lt;/em&gt; condition to add it.  Leave the default at &lt;em&gt;true&lt;/em&gt;.  Now the behavior will only match the first message of a conversation, and you won't end up spamming your customers with the same auto-reply every time they contact you.&lt;/li&gt;
&lt;li&gt;Next, click the &lt;em&gt;message is outgoing&lt;/em&gt; condition to add it too.  Change its value to &lt;em&gt;false&lt;/em&gt;.  This will make sure you're only sending this auto-reply when customers write in to you, instead of when you're composing a new message to them.&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 we're ready to set up the auto-reply message:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Yes&lt;/strong&gt; bubble on the &lt;em&gt;New ticket auto-reply&lt;/em&gt; behavior and select &lt;strong&gt;Add Actions&lt;/strong&gt; from the menu.  Set the title to &lt;em&gt;"Send confirmation email"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add the action &lt;em&gt;Send email to recipients&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add the following content:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Thanks for writing to us!

Your reference number for the ticket "{{ticket_subject}}" is #{{ticket_mask}}.

We'll get back to you as soon as possible.

- Example, Inc.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can customize this message to suit your needs.&lt;/p&gt;

&lt;p&gt;When sending an auto-reply, you may not want to include the message in the ticket history.  This will prevent a copy of the automatic response from being included in every conversation or treated as a new message.  This is probably what you want, so check the box next to &lt;em&gt;Don't save a copy of this message in the conversation history&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Save Changes&lt;/strong&gt; button and your Virtual Attendant will automatically send this message for every new incoming message that arrives for the group.&lt;/p&gt;

&lt;h1&gt;More Things to Try&lt;/h1&gt;

&lt;h2&gt;Sending time-based auto-reply messages&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/0e08c876-ded4-102e-b312-0030487e9650/56-virtual_attendant_auto_reply_timebased.png" alt="" title=""&gt;&lt;/p&gt;

&lt;h2&gt;Sending auto-replies based on Service Level&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/262cde6e-ded5-102e-b312-0030487e9650/56-virtual_attendant_slas.png" alt="" title=""&gt;&lt;/p&gt;

&lt;h2&gt;Responding with language-appropriate greetings&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cerberusweb.com/support/ajax/downloadFile/2647279c-ded5-102e-b312-0030487e9650/56-virtual_attendant_language.png" alt="" title=""&gt;&lt;/p&gt;
</description><link>http://cerberusweb.com/support/kb/article/56</link><pubDate>Thu, 06 Oct 2011 19:01:12 GMT</pubDate><guid isPermaLink="false">0e1fb30ac7ea1e4f9bec9835f3a35985</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://cerberusweb.com/support/kb/article/77</link><pubDate>Wed, 07 Sep 2011 21:22:25 GMT</pubDate><guid isPermaLink="false">787442e74dd42cc2bea9621592f6ff02</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://cerberusweb.com/support/kb/article/73</link><pubDate>Fri, 02 Sep 2011 21:53:04 GMT</pubDate><guid isPermaLink="false">1fbe202737f271db2db0d9c24298bf18</guid></item></channel></rss>
