Release Name: openCRX/Core 2.8.5 Release Date: 2011-05-04 --------------------------------------------------------------------- Notes: This software is published under the BSD license as listed below. Copyright (c) 2004-2011, CRIXP Corp., Switzerland All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of CRIXP Corp. nor the names of the contributors to openCRX may be used to endorse or promote products derived from this software without specific prior written permission THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------ This product includes software developed by the Apache Software Foundation (http://www.apache.org/). This product includes software developed by contributors to openMDX (http://www.openmdx.org/) --------------------------------------------------------------------- 0. SUMMARY * PrestaShop adapter * Automatic activity replication * GUI workspaces * WebDAV support * CardDAV support * Improved CalDAV support * SalesVolumeBudgets allow to define sales volume budgets and targets and to collect sales volume contributions * Twitter notifiers * CopyDb allows to replace provider name * Auto-link of imported E-Mails with existing activities * Bug fixes * Clean up For more information see below and http://www.opencrx.org/opencrx/2.8/new.htm ============================================================================== Version 2.8.5 2011-05-04 ============================================================================== 1. NEW FEATURES CR10009791 Workspaces. Left-pane added which hosts workspace-level dashboard. The workspace-level dashboard works like the (horizontal) object-level dashboard: * dashlets can be added removed by admin or user * dashlets can be shared by admin by prefixing the label with a * Workspaces can be managed by the segment admin only. CR10009913 UserHomes.initUserHome(). Add a backend method which allows to initialize a user's home. The method can be overriden and extended by a custom-specific subclass. CR10009876 Activity replication. Activity replication is supported as follows: * Activities linked with the link type 'is replica of' or 'is replica of (obfuscated)' are updated when the original activity is modified. The method Activities.replicateActivity() allows to control the replication at attribute-level. By default, the attributes are replicated as follows: * In case activityLinkType is 'is replica of': - name - description - detailedDescription - misc1 - misc2 - misc3 - location - scheduledStart - scheduledEnd - actualStart - actualEnd - dueBy - priority * In case activityLink type is 'is replica of (obfuscated): - name (from activityLink.name) - description (from activityLink.description) - scheduledStart - scheduledEnd - actualStart - actualEnd - dueBy - priority * Upon creation of new activities the creation of replica can be controlled with the method Activities.getActivityReplicationDescrs(). E.g. a custom-specific extension of getActivityReplicationDescrs() can replicate activities created with the creator 'guest~Home~Meetings' with the creator 'guest~Private~Meetings' and obfuscate the replica. CR10009836 UserSettings: Create UserHome > UserProfile > default document profile. CR10009478 PrestaShop integration. The PrestashopSynchronizer integrates PrestaShop (http://www.prestashop.com/). PrestaShop is a PHP-based application. This first version of the adapter imports data from PrestaShop to openCRX. The following business objects are imported: PrestaShop openCRX ---------------------------------------------- Customer Account, Address Orders Sales orders, Invoices Products, Prices, Taxes Products, Prices, Sales Taxes The PrestashopSynchronizer is implemented as Workflow which directly accesses the PrestaShop database. It periodically queries the PrestaShop database for new and updated data. The PrestashopSynchronizer allows to map up to 10 shops to one openCRX segment. All imported data is qualified with the shop name to prevent conflicts. The PrestashopSynchronizer is configured as follows: 1. JDBC Resource ================ For each PrestaShop a JDBC resource entry must be added to web.xml of the opencrx-core-CRX.war and openejb.xml. Here is an example: openejb.xml ----------- JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://127.0.0.1:3306/prestashop UserName root Password manager99 JtaManaged true web.xml of opencrx-core-CRX.war ------------------------------- jdbc_PrestaShop javax.sql.DataSource Container 2. Configure servlet PrestashopSynchronizer =========================================== Add the servlet PrestashopSynchronizer to the web.xml of opencrx-core-CRX.war: Add init-param to the WorkflowController servlet: path[3] /PrestaShopSynchronizer Add servlet configuration: PrestaShopSynchronizer org.opencrx.application.shop.prestashop.PrestaShopSynchronizer providerName provider/CRX Add servlet mapping: PrestaShopSynchronizer /PrestaShopSynchronizer/* 3. Component Configuration ========================== As admin-Root add the following component configuration for PrestashopSynchronizer: PrestaShopSynchronizer String property name Value CRX.Standard.runAs[0] prestashop-test1 CRX.Standard.emailUnique[0] false CRX.Standard.shopName[0] Test1 CRX.Standard.jdbcResourceName[0] jdbc_PrestaShop CRX.Standard.tablePrefix[0] ps_ CRX.Standard.syncKey[0] 0 Set the initial value of the sync key to 0. This imports all data from PrestaShop. After the initial sync only new and updated data is imported. You can force a full-import by setting sync key to 0. runAs must be a valid openCRX user for the segment. All operations are performed as this user. 4. Database =========== Amend the openCRX database configuration as follows: Create the following sequence. This makes the column alias_name an autonum column: CREATE SEQUENCE OOCKE1_alias_name_seq START WITH 1000000 INCREMENT BY 1; INSERT INTO prefs_Preference (object_rid, object_oid, object_idx, string_value) VALUES( 'preference/OOCKE1', 'PERSISTENCE:autonumColumn', 002, 'OOCKE1_ACCOUNT.alias_name AS CHAR(20)' ) ; Make sure that the columns OOCKE1_PRODUCT.description and detailed_description are of type text. Product descriptions in PrestaShop are also defined as text. 2. CHANGES 2.0. CHANGED FEATURES CR10009959 Import E-Mails. Import E-Mails in one UOW (legacy from v1 plug-ins). 2.1. FIXED BUGS none 2.2 REMOVED FEATURES none ============================================================================== Version 2.8.0 2010-12-27 ============================================================================== 1. NEW FEATURES CR10009668: WebDAV Support WebDAV Support. WebDAV servlet added. A user must created a DocumentProfile (e.g. Documents~{user}) with one or more DocumentFeed. The client connects with URLs of the form: ./opencrx-webdav-CRX/{provider.id} "/" {segment.id} "/user/" {user.id} "/profile/" {profile.name} "/" {feed.name} ["/" {folder.name} ]* "/" {document.name} E.g. webdav://guest@localhost:8080/opencrx-webdav-CRX/CRX/Standard/user/guest/profile/Documents~guest/ Files are mapped to documents, folders are mapped to document folders. CR10009687 partyStatus. Extend AbstractActivityParty by attribute partyStatus: * PARTY_STATUS_NEEDS_ACTION = 1; * PARTY_STATUS_ACCEPTED = 2; * PARTY_STATUS_DECLINED = 3; * PARTY_STATUS_TENTATIVE = 4; * PARTY_STATUS_DELEGATED = 5; * PARTY_STATUS_COMPLETED = 6; The partyStatus has the same semantics as ICalendar PARTSTAT. CR10009674 assignmentRole. Extend DocumentFolderAssignment by assignmentRole. CR10009667 CardDAV Support. CardDAV servlet added. A user must created a CardProfile (e.g. AddressBook~{user}) with one or more ContactsFeed. The client connects with URLs * ./opencrx-caldav-CRX/user/{user}/profile/{profile name} or * ./opencrx-caldav-CRX/user/{user}/profile id} CR10009623 SalesVolumeBudget. Subclass of budget which allows to define sales volume budgets and targets and to collect sales volume contributions. SalesVolumeBudget allows to define a sales volume target for a set of accounts in different roles. Supported roles are: customer, sales rep and broker. The operation assignBudgets() on contracts and contract positions allows to automatically identify and assign the matching budgets to contract positions. The operation SalesVolumeBudget.recalcBudget() iterates all contract positions with an assignment to the invoked budget. The contract positions are then matched to budget positions (product and currency / uom must match). In case of a match the contract position acts as contribution to the budget position which results in the creation of a simple booking on the assigned depot position. The contribution type allows to define how the contribution is calculated: either based on the contract position's quantity or one of the base amount, amount, discount amount or price per unit values. CR10009611 Activities source for ActivityFilterGlobal. Allow to specify the activities source for global activity filters. Possible sources are * Activity segment * User home * Activity group * Account The default source is the activity segment. CR10009592 PortalExtension: grid coloring. Extend portal extension by method getGridRowColors(RefObject). Deprecate at the same time the method hasGridColors(). /** * Returns colors which is used as foreground and background colors when an * object is rendered in a grid. * @return foreground (at index 0) and background color (at index 1) or null. */ @Override public String[] getGridRowColors( RefObject_1_0 obj ) { if(obj instanceof Activity) { Activity activity = (Activity)obj; if(activity.getDueBy() != null) { String dueByDate = DateTimeFormat.BASIC_UTC_FORMAT.format(activity.getDueBy()).substring(0, 8); String todayDate = DateTimeFormat.BASIC_UTC_FORMAT.format(new Date()).substring(0, 8); return dueByDate.compareTo(todayDate) > 0 ? new String[]{null, "red"} : dueByDate.compareTo(todayDate) == 0 ? new String[]{null, "green"} : null; } } return super.getGridRowColors(obj); } CR10009578 Tiny URLs. Use tiny URLs for access URLs generated by AirSync, CalDAV, ICS and VCARD adapters. CR10009533 Support for Twitter. Twitter support is added as follows: * OAuth: Support to configure consumer key and consumer secret. Wizard to create access token and access key. * Wizards to send direct messages and update statuses. * Workflow to send alert notifications via Twitter. The implementation is based on the library twitter4j. For more information see http://twitter4j.org. Register with Twitter --------------------- * Before openCRX can invoke the Twitter API, you need to register your instance of openCRX at http://twitter.com/oauth_clients/new to acquire a consumer key and a consumer secret. Register your openCRX instance as follows: o Application Name: the name of your openCRX instance, e.g. 'openCRX of MyCompany' o Application Website: the URL users can access the openCRX instance, e.g. https://crm.mycompany.com/opencrx-core-CRX o Application Type: Client o Default Access type: Read/Write o Use Twitter for login: false If registration is successful you should get a 'Consumer Key' and a 'Consumer Secret' for your application. * Now login as admin-Root and navigate to the tab Administration > Configuration. o Create a new component configuration with - Name: Twitter - Qualifier: Twitter o Navigate to the newly created component configuration and add the following string properties: - CRX.OAuth.ConsumerKey: Twitter consumer key. - CRX.OAuth.ConsumerSecret: Twitter consumer secret. NOTE: segment-specific tokens are configured using the pattern - ..OAuth.ConsumerKey - ..OAuth.ConsumerSecret * Logout Users are now able to setup Twitter accounts. Create Twitter Account ---------------------- * Login as user, e.g. guest * Twitter accounts are configured on a user's home in the tab 'Service Account'. A Twitter account is created as follows: o Name: Twitter user display name o Active: true o Default: true * Invoke the wizard 'Twitter - Create access token'. The wizard shows an URL and a field to enter a PIN code. Open the URL in a new browser window. This redirects you to Twitter asking to grant access for the openCRX instance. If you grant access a PIN code will be displayed. Enter the PIN code and click OK. If all goes well, the fields 'Access token key' and 'Access token secret' are set now. Using the Wizards ----------------- Almost on all objects the following two wizards are available: * Twitter - Send Message. This wizard allows to send a message to a list of Twitter users. In addition the message text is attached as note and if you are invoking the wizard on an activity a follow up is created. Note that the message is only visible to the recipients. * Twitter - Update Status. This wizard allows to update the status for one of the configured Twitter accounts. Status updates are visible to all followers of the selected Twitter account. Using the SendDirectMessageWorkflow ----------------------------------- The SendDirectMessageWorkflow works the same way as the SendMailNotificationWorkflow. Instead of sending an EMail to the user in case of alert updates, the alert title including a tiny url pointing to the underlying openCRX object is sent as direct message to the default Twitter account of the subscribing user. The SegmentSetupWizard creates the required entries for the workflow and topic. Users simply need to subscribe to the topic 'Alert Modifications (Twitter)'. CR10009558 Portal: LookupObjectEventHandler. Action EVENT_FIND_OBJECT takes as parameter PARAMETER_REFERENCE which defines the type of the lookup object. In addition to modeled reference names, user-defined structural feature definitions are also supported. CR10009396 IMAP IDLE. IMAPAdapter supports IMAP IDLE. See http://en.wikipedia.org/wiki/IMAP_IDLE. CR10009494 Portal: Show-always option for search forms. Option allows the user to show search form automatically when a grid is displayed. CR10009530 CopyDb: replace provider name. Support to replace provider name when copying db. Added options: * -Dprovider.name.source * -Dprovider.name.target See ant CopyDb for more info. CR10009491 ICAL TRANSP: TRANSPARENT | OPAQUE. The attribute TRANSP is mapped to the activity's assigned resources. If the requesting user has at least one resource assignment with workingUnitPercentage > 0 then TRANSP=OPAQUE, else TRANSPARENT. TRANSP is managed by the CalDAV, ICS and FREEBUSY servlets. CR10009511 Root objects per perspective. User settings should allow to configure the state (show|hide) of root objects per perspective. CR10009515 linkToAndFollowUp(). The operation Activity.linkToAndFollowUp(linkTo, transition) performs a doFollowUp() where * followUp.title is set to linkTo name * followUp.text is set to linkTo detailed description * followUp.activity is set to linkTo * activity is linked to linkTo CR20019321 Title tag for labels. Create a title tag for labels if a tooltip for a field is customized. 2. CHANGES 2.0. CHANGED FEATURES CR10009726 ProductClassification and ActivityProcessState are DescriptionContainer. CR10009614 Contact.ouMembership(). The calculation of the derived attribute ouMembership is expensive. E.g. reading all accounts with REST results in account and membership queries for each account. Replace derived reference ContactIsMemberOf by shared association. CR10009542 AccessControl: optimize applyBrowseFilter in case of multiple invocations. CR10009512 IMAP: auto-assign. The method Activities.importMimeMessage() now supports two import modes: * If the subject line starts with "> " the message is treated as wrapper message. All attachments are treated mime messages which are imported instead of the message itself. The subject line of the wrapper message has the following form: > @ [#] The allows the user to specifiy the email creator and an optional activity creator. If specified, an activity is created (name = subject, detailedDescription=body) and the imported emails are linked with this activity using linkToAndFollowUp(). * In any other case the message is imported as is. The subject line of all imported messages is scanned for activity numbers. Activity numbers have the form #. If a matching activity is found the imported email is linked with this activity using linkToAndFollowUp(). 2.1. FIXED BUGS CR10009581 updateInventory() throws NullPointer. 2.2 REMOVED FEATURES none ---