openCRX


The Professional Enterprise Class Open Source CRM Solution

New features in openCRX v4.2

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v4.1

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v4.0

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v3.1

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v3.0

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.13

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.12

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.11

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.10

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.9

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.8

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.7

See also RELEASE-NOTES for additional information on new/changed features.

New features in openCRX v2.6


Model enhancements in code1, contract1, home1. The more important are:

  • code1::ObjectValidator: generic pattern for validating objects.
  • code1::ValueRange: generic pattern which allows to manage value ranges for the attributes of a given object set.
  • contract1::PaymentRecord: Contracts have ISO 20022 compliant PaymentRecords.

^

Many bug fixes

Many bug fixed and performance improvements. For more information see the release notes.

^

Support for TomEE 7.0.5

Support for TomEE 1.7.4 and TomEE plus 7.0.5. Newer versions (7.1.x, 8.x) are currently not recommended because of JSF issues.

^

Enhanced database support

  • The DbCopyWizard now supports value replacements. E.g. with replacement patterns such as «TEST» → «MYCOMPANY», a database can be migrated from segment «TEST» to segment «MYCOMPANY».
  • Oracle: fixed issues for large objects (CLOBs, BLOBs).

^

Model enhancements in account1, activity1, address1, depot1, product1

  • PostalAddress: postalCodeAddOn, postalCodeId in order to support country-specific add-ons for postal codes. E.g. https://www.unitedstateszipcodes.org/
     
  • DepotAssignmentGroup. Add new class DepotAssignmentGroup to product1. This class allows group sales tax type group, transaction type, income account and cost center and assign to a product.
     
  • product1: extend SalesTaxType. A SalesTaxType is assigned to 0..n SalesTransactions (on premise, take way, standard, ...) and 0..1 SalesTaxTypeGroup (CH.standard, CH.reduced, ...). Also add SalesContract::salesContractGroup, SalesContractPosition::salesTrasactionType and Product::salesTaxTypeAssignment. This extension allows Contract::createPosition() to automatically set the sales tax on a sales contract position.
     
  • depot1: fxRate to manage fx rates for currencies.
     
  • account1: MemberGroup. Support grouping of Members per account.
     
  • activity1: ActivityPartyGroup. Support of grouping of ActivityParties per activity.

^

Support for documents with schema definitions

document1: DocumentSchema. Document::documentSchema is a reference to a DocumentSchema containing the schema definition of the document. It describes the data stored in Document::cmsMeta: Examples:

* Document::cmsMeta contains the document's meta-data in JSON notation. Then the schema definition is a JSON schema (http://json-schema.org)

* Document::cmsMeta contains the document's meta-data in XML notation. Then the schema-definition is an XML schema.

In order to support efficient storage and fast queries the column type OOCKE1_DOCUMENT.cms_meta can be set (manually) to a native database type. E.g. when using PostgreSQL, the column type of cms_meta can be changed to jsonb. As a consequence only JSON-compliant data can then be stored in Document::cmsMeta. JSON queries are then supported and have then the form: thereExistsCmsMeta().like("(?j){\"x\":2}").

^

Script-based importer- and exporter tasks

BPI: RunExportAction. The RunExportAction allows to invoke ExporterTask::runExport() with a GET request. The parameters param0..param9 are supplied as URL parameters. The request pattern is xri://@openmdx*org.opencrx.application.bpi1/provider/:*/segment/:*/exporter/:*/file/:* The last component is ignored by RunExportAction. However, it should denote a file name where the extension matches the mime type of the returned file, e.g. test.csv if the exporter returns as CSV formatted file.

The RunExportAction simplifies client programming. E.g. an R program can download and parse the file as follows:

> download.file("http://guest:guest@localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/exporter/Test/file/test.csv", destfile="/tmp/test.csv")
> read.csv("/tmp/test.csv")

OR

> read.csv(textConnection(getURL("http://guest:guest@localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/exporter/Test/file/test.csv")))

workflow1: ImporterTask / ExporterTask. The new classes allow to configure script-based importer and exporter tasks. ImporterTask:runImport() invokes the method runImport() of the configured script. runImport() has the following signature:

import org.opencrx.kernel.workflow1.jmi1.RunExportResult;
import org.opencrx.kernel.workflow1.jmi1.ExporterTask;
import  org.openmdx.base.exception.ServiceException;
import org.w3c.spi2.Structures;
import org.w3c.spi2.Datatypes;

public static RunExportResult runExport(
    ExporterTask exporterTask,
    String[] params
) throws ServiceException {
    try {
        String file =
            "top100_repository_name,month,monthly_increase,monthly_begin_at,monthly_end_with\n" +
            "Bukkit,2012-03,9,431,440\n" +
            "Bukkit,2012-04,19,438,457\n" +
            "Bukkit,2012-05,19,455,474\n" +
            "Bukkit,2012-06,18,475,493\n" +
            "Bukkit,2012-07,15,492,507\n" +
            "Bukkit,2012-08,50,506,556\n" +
            "Bukkit,2012-09,19,555,574\n" +
            "Bukkit,2012-10,26,573,599\n" +
            "Bukkit,2012-11,21,600,621\n" +
            "Bukkit,2012-12,21,621,642\n" +
            "CodeIgniter,2012-03,55,708,763\n" +
            "CodeIgniter,2012-04,75,763,838\n" +
            "CodeIgniter,2012-05,92,837,929";
        return (RunExportResult)Structures.create(
          RunExportResult.class, 
          Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.file, file.getBytes("UTF-8")),
          Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileMimeType, "text/csv"),
          Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileName, "test.csv"),
          Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.status, (short)0),
          Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.statusMessage, "")              
        );
    } catch(Exception e) {
        throw new ServiceException(e);
    }
}

The operation Import:importItem(importerTask, item, itemName, itemMimeType) delegates importerTask.runImport(params) with params[0] = 'xri of invoked object', params[1]=item, param[2]=itemName, param[3]=itemMimeType.

ExporterTask:runExport() invokes the method runImport() of the configured script. The methods runExport() has the following signature:

import org.opencrx.kernel.workflow1.jmi1.RunExportResult;
import org.opencrx.kernel.workflow1.jmi1.ExporterTask;
import  org.openmdx.base.exception.ServiceException;
import org.w3c.spi2.Structures;
import org.w3c.spi2.Datatypes;

public static RunExportResult runExport(
    ExporterTask exporterTask,
    String[] params
) throws ServiceException {
    return (RunExportResult)Structures.create(
        RunExportResult.class, 
        Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.file, null),
        Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileMimeType, null),
        Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.fileName, null),
        Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.status, (short)1),
        Datatypes.member(org.opencrx.kernel.workflow1.cci2.RunExportResult.Member.statusMessage, "no file")              
    );
}

The operation Export:exportItem(exporterTask) delegates exporterTask.runExport(params) with params[0] = 'xri of invoked object'.

^

Indexer supports custom-implementations

Indexer: configurable object set. Indexed_2 now delegates to org.opencrx.kernel.backend.Base. This allows custom-implementations for updateIndexEntry(), allowUpdateExistingIndexEntries(), getKeywords(), getIndexableTypes().

^

Various bug fixes and stability enhancements

  • SQL Server: SEQUENCE support. The helper _SEQ tables are replace by SQL server sequences (for more information see https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql). The following database tables must be migrated to a corresponding database sequence:
    * OOCKE1_ACTIVITY_NUMBER_SEQ
    * OOCKE1_POSITION_NUMBER_SEQ
  • CardDAV Servlet Unrecoverable Exception (picture of account defined, but media missing). If an account's picture attribute is set, but the referenced media is not available (e.g. because it was deleted) the caldav servlet throws an exception that breaks/aborts the sync process - depending on the caldav client it's not possible to sync at all anymore until the account is either fixed or removed from the collection.
  • fixed/enhanced mapping of openCRX Activity ↔ ICAL status
    forward mapping:
    disabled → CANCELLED
    percentComplete = 0 → NEEDS-ACTION
    percentComplete >= 100 → CANCELLED, COMPLETED (depending on activity.getActivityState())
    percentComplete > 0 && perentComplete < 100 → IN-PROCESS
    the reverse mapping is implemented in the method importItem
    // STATUS
    s = ICalField.getFieldValue("STATUS", ical);
    if((s != null) && !s.isEmpty()) {
      if(!JDOHelper.isNew(activity)) {
        Short percentComplete = activity.getPercentComplete();
        if(percentComplete == null) {
          percentComplete = (short)0;
        }
        if(activity.getProcessState() != null) {
        ActivityProcessState processState = activity.getProcessState();
        ActivityProcess activityProcess = (ActivityProcess)pm.getObjectById(processState.refGetPath().getParent().getParent());
        ActivityProcessTransitionQuery processTransitionQuery = (ActivityProcessTransitionQuery)pm.newQuery(ActivityProcessTransition.class);
          if("CANCELLED".equalsIgnoreCase(s)) {
            if(!Boolean.TRUE.equals(activity.isDisabled())) {
              activity.setDisabled(true);
            }
            if(percentComplete < 100) {
              processTransitionQuery.orderByNewActivityState().ascending();
              processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)100);
            } else {
              processTransitionQuery = null;
            }
          } else if("NEEDS-ACTION".equalsIgnoreCase(s) || "TENTATIVE".equalsIgnoreCase(s)) {
            if(Boolean.TRUE.equals(activity.isDisabled())) {
              activity.setDisabled(false);
            }
            if(percentComplete != 0) {  
              processTransitionQuery.orderByNewActivityState().descending();
              processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)0);
            } else {
              processTransitionQuery = null;
            }
          } else if("COMPLETED".equalsIgnoreCase(s)) {
            if(Boolean.TRUE.equals(activity.isDisabled())) {
              activity.setDisabled(false);
            }
            if(percentComplete < 100) {
              processTransitionQuery.orderByNewActivityState().ascending();
              processTransitionQuery.thereExistsNewPercentComplete().equalTo((short)100);
            } else {
              processTransitionQuery = null;
            }
          } else if("IN-PROCESS".equalsIgnoreCase(s) || "CONFIRMED".equalsIgnoreCase(s)) {
            if(Boolean.TRUE.equals(activity.isDisabled())) {
              activity.setDisabled(false);
            }
            if(percentComplete <= 0) {
              processTransitionQuery.orderByNewActivityState().ascending();
              processTransitionQuery.thereExistsNewPercentComplete().greaterThan((short)0);
            } else if(percentComplete >= 100) {
              processTransitionQuery.orderByNewActivityState().descending();
              processTransitionQuery.thereExistsNewPercentComplete().lessThan((short)100);
            } else {
              processTransitionQuery = null;
            }
          }
          if(processTransitionQuery != null) {
            // If possible perform a transition. Also allow transitions not
            // supported by the activity process
          ActivityProcessTransition processTransition = null;                
            List processTransitions = activityProcess.getTransition(processTransitionQuery);
            for(ActivityProcessTransition candidate: processTransitions) {
              if(candidate.getPrevState().equals(activity.getProcessState())) {
                processTransition = candidate;
                break;
              }
            }
            if(processTransition == null && !processTransitions.isEmpty()) {
              processTransition = processTransitions.iterator().next();
            }
            if(processTransition != null) {
              Activities.getInstance().doFollowUp(
                activity,
                s + " @ " + new Date(),
                "Set STATUS:" + s,
                processTransition,
                null, // assignTo
                null, // parentProcessInstance
                false // validateStates
              );
            }
          }
        }
      }
    }

^

Depot: Improvements

The module depot1 comes with a set of new features which support use-cases for enterprise accounting and depot management:

  • Aggregated depot reports: they allow to aggregate depot reports at level depot groups. The transient class AggregatedDepotReportItem aggregates the DepotReportItems of all depots of a given depot group (recursively).
  • SingleBookingEntry. SingleBookingEntries allow custom-specific, performance-optimized queries on SingleBookings. SingleBookingEntries are accessible from the depot segment, depot entity, depot holder, depot and depot position.
  • New operation CompoundBooking::appendBookings(), ::appendBookings2(). The new operations allow to append SingleBookings to an existing CompoundBooking.
  • Many bug fixes and performance enhancements.
^

Web components: Replace JSP by web components

The standard GUI can easily extended wizards. Now, wizards can be implemented using the latest web technologies. The new directory layout allows a wizard to be implemented with a web framework of your choice. E.g. the typical layout of a Polymer wizard looks like:

{wizard-name}
    META-INF
        wizard.properties
    Api.jsp
    index.jsp
    {wizard-name}.html
    {wizard-name}.css

The CreateActivity and BulkActivityManager wizard is one of the first wizards using this feature.

^

Database: Improved database tools and schema management

DbSchemaUtils now support custom extensions of the database schema. All schema scripts META-INF/dbschema-add.sql are loaded and applied to the core schema. This allows to use the standard DbSchema wizard to manage and upgrade the database schema without additional administrative tasks.

^

Bulk activity management

A new (Polymer-based) wizard which simplifies the bulk-management of activities. The wizard is launched on any activity group.

Bulk activity manager

^

Many bug fixes

Many bug fixed and performance improvements. For more information see the release notes.

^

Web Contacts "CardDavMATE"

CardDavMATE is an open source CardDAV web client implementation. openCRX users who have configured a CardDAV sync profile can view/manage their contacts with any browser.

CardDavMATE

^

Ready for deployment on Jelastic

openCRX improves the cloud support by supporting the Jelastic hosting platform:

jelastic

^

Web Contacts "CardDavMATE"

CardDavMATE is an open source CardDAV web client implementation. openCRX users who have configured a CardDAV sync profile can view/manage their contacts with any browser.

CardDavMATE

^

New grid actions

New grid actions in all grids allow quick enabling / disabling of objects:

  • Enable objects
  • Disable objects
Grid actions enable / disable

New grid actions on price levels simplify the following use-cases:

  • MarkPriceLevelAsFinal –> setFinal(true)
  • MarkPriceLevelAsNonFinal –> setFinal(false)
  • PriceLevelCloneValidTo –> clone validTo from first selected price level
  • PriceLevelResetValidTo –> setValidTo(null)
Grid actions price level

^

Self-service password reset

Self-service password reset. The API is extended by the operation UserHome::requestPasswordReset() which

  • sends (by an alert) a reset and a cancel password reset URL to the user
  • resets the password to "{RESET}resetToken"

This way:

  • a base64 hash is stored of the token (and not the token itself)
  • The account is locked because a login is impossible (a base64 encoded password hash never generates the prefix {RESET}
  • changePassword() accepts the token with the {RESET} prefix as old password

The three wizards PasswordResetCancel.jsp, PasswordResetConfirm.jsp and RequestPasswordReset.jsp implement the logic on the GUI side:

  • The reset password process is started by calling the wizard RequestPasswordReset.jsp. If required, a link to the wizard can addded to login-note.html. The wizard presents an input field whereas the user has to enter its fully qualified ID, e.g. guest@CRX/Standard. Custom-specific help and descriptions go to request-password-reset-note.html. The wizard invokes the operation UserHome::requestPasswordReset() which sends out the reset and cancel password URLs and locks the user account.
  • The reset password URL points to the wizard PasswordResetConfirm.jsp which allows to reset the password.
  • The cancel password URL points to the wizard PasswordResetCancel.jsp which invalidates the reset token. It resets the password to a 20 char random value. This way the user home stays locked until the reset password process is completed successfully.

Request password reset

Grid actions price level

^

Scripting support for portal extension

The portal extension can now prepared for scripted extension. Janino-compliant scripts located in /WEB-INF/config/scripts/{name}.script can be loaded with

getQueryMethod = this.getMethod(
    "getQuery", 
	new Class[]{
        org.opencrx.kernel.portal.PortalExtension.class,
        String.class, // qualifiedFeatureName
        String.class, // filterValue
        int.class, // queryFilterStringParamCount
        ApplicationContext.class
    }
);

For more information see the openCRX sample project

^

Support for Java 7

openCRX v3.0 finally runs on Java 7.

^

openCRX REST adapter supports JSON and Swagger

The openCRX REST adapter supports JSON and Swagger:

  • Support for mime type application/json in addition to text/xml
  • Swagger-compliant API at object-level with XRI-suffix :api and :api-ui. The API Explorer wizard allows to interactively explore the API of any object.

These improvements allow easy integration with state-of-the-art Javascript frameworks.

json

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language. Read on at http://www.json.org/.

swagger

Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability. Read on at http://swagger.io/.

CORS

Cross-Origin Resource Sharing (CORS) is a specification that enables truly open access across domain-boundaries. If you serve public content, please consider using CORS to open it up for universal JavaScript/browser access. Read on at http://enable-cors.org/ or have a look at the specification at http://www.w3.org/TR/cors/.

^

Ready for the cloud

openCRX is now ready for the cloud. openCRX v3.0 comes with a dockerfile which allows you to install and deploy openCRX in a few minutes on docker-compliant cloud services.

docker

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications. Consisting of Docker Engine, a portable, lightweight runtime and packaging tool, and Docker Hub, a cloud service for sharing applications and automating workflows, Docker enables apps to be quickly assembled from components and eliminates the friction between development, QA, and production environments. As a result, IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud.. Read on at https://www.docker.com/.

^

Web-based document management

openCRX now offers an easy-to-use UI for web-based document management. The UI (based on elFinder 2.0) is launched from the user's home page featuring:

  • Explore folders and documents
  • Create / rename / delete folders
  • Upload / download / delete documents
  • Search documents by keywords

Web Documents

Web Documents

Web Documents

^

Other

Many bug fixes and performance improvements. As a consequence, the interfaces of some backend plug-in classes have been changed. The upgrade to version v3.0 requires some adaption of your code in case you have implemented custom-specific backend logic.

^

Responsive HTML5/Ajax-GUI

A new generic and extremely powerful and feature-rich HTML5/Ajax-GUI (built with the Bootstrap framework) that works on any device. This AJAX-enabled HTML5-GUI supports a wide range of modern browsers, including Chrome, Firefox, Opera, Safari, IE, etc. and it supports any device including mobile devices (iPhone, iPad, Android-based devices, etc.).

Contact

product gris

Screen shots from a Nexus 5:
Nexus 5 Nexus 5 products

Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.

^

User-specific ordering of grid columns

Any user can change the ordering of grid columns by simply opening a grid's View menu and then selecting the entry of the grid column to be moved to the right:

gridorder0

gridorder2

gridorder2

Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.

^

Enhanced search form

The enhanced search form supports both searching withing the result set of a previous search and searching across all objects of a grid:

search form

Connect to our openCRX demo server and see the new GUI in action or get the updated openCRX GUI Guide.

^

Janino scripts as workflows

A new feature that allows you to define a workflow's execute() method as Janino script. This way segment-specific business-logic can be added without building and deploying a new EAR.

Here is an example:

public static void execute(
  org.opencrx.kernel.base.jmi1.WorkflowTarget wfTarget,
  org.openmdx.base.jmi1.ContextCapable targetObject,
  org.opencrx.kernel.home1.jmi1.WfProcessInstance wfProcessInstance
) throws org.openmdx.base.exception.ServiceException {
  java.util.logging.Logger logger = java.util.logging.Logger.getLogger("PrintConsole");
  logger.log(java.util.logging.Level.INFO, "executing workflow " + wfProcessInstance.getProcess().getName());
  logger.log(java.util.logging.Level.INFO, "target=" + targetObject);
  logger.log(java.util.logging.Level.INFO, "wfProcessInstance=" + wfProcessInstance);
  java.util.Map params = org.opencrx.kernel.utils.WorkflowHelper.getWorkflowParameters(wfProcessInstance);
  logger.log(java.util.logging.Level.INFO, "params=" + params);
}
^

MailWorkflow supports external sendmail command

In addition to the already supported JavaMail openCRX newly supports external sendmail commands. sendmail has several advantages over JavaMail in high-end environments. sendmail is used by the MailWorkflow if the system property -Dorg.opencrx.usesendmail.{provider.name} is set to true, e.g.

-Dorg.opencrx.usesendmail.CRX=true

In this case JavaMail resources must not be configured anymore in web.xml and the application.server. mail.jar must still be deployed as it is required to construct RFC822-compliant MimeMessages.

^

DocumentExporter workflow

The DocumentExporter workflow allows to export document folders to the file system. A document folder is exported if a DocumentFolderShare exists for this folder. DocumentFolderShares can be managed manually with the standard GUI.

createfolderhare

^

Store Media on the file system

It is now possible to store the content of objects of type org:opencrx:kernel:document1:Media on the file system. The option is activated with the system property

-Dorg.opencrx.mediadir.{provider.name}={mediadir.name}

The DbSchemaWizard supports the following new functions to manage and migrate existing media objects in case the option -Dorg.opencrx.mediadir is turned on:

  • Validate Media: lists all media objects which do not have a corresponding media file on the file system. These media objects are subject to migration.
  • Migrate Media to FS: migrate media objects from database to file system, i.e. media objects stored in OOCKE1_MEDIA.content are exported to the file system. The location of the media file corresponds to the media object's XRI. This operation is idempotent, i.e. can be run multiple times (typically in combination with Validate Media). After successful migration the column OOCKE1_MEDIA.content can be cleared with the SQL statement UPDATE OOCKE1_MEDIA set content = null;
  • Migrate Media to DB: Reads all media files on mediadir and stores the content in the corresponding media object (column OOCKE1_MEDIA.content).

This new feature can reduce the load on your DBMS in a major way (e.g. easy backup of media/blobs with rsync that does not generated any DB-load).

^

Auto-update of addresses

If authority is set, postal and e-mail addresses are updated automtically in case the matching authority's addresses changes. With this new feature it is easy to keep addresses of employees of an organization in sync with the organization's address, etc.

The operation checkForAutoUpdate() allows to check whether a given address qualifies for auto-update.

^

Activity Relationships

It is now possible to capture relationships between activities similar to how you capture relationships between accounts:

roller

^

Next/Prev Inspector

New Next/Prev buttons allow to iterate the content of a grid at inspector-level:

roller

^

Web Calendar "CalDavZAP"

CalDavZAP is an open source CalDAV web client implementationan. openCRX users who have configured a CalDAV sync profile can view/manage their calendards with any browser.

CalDavZAP

^

Unified Edit / New Object

Unifie edit and new object. The "New..." object form allows to lookup (with auto-completer) existing objects. If an object is selected, the form is pre-filled with the selected object values. After editing the form, the user can then choose either to "Create" (a new) or "Save" (the existing) object. If no existing object is selected, the user can only choose "Create".

UnifiedEditNew

^

Document Filters

The same "filter pattern" already available for accounts, activities and products is now also available for documents: it is now possible to create filters for documents (Saved Searches). Furthermore, such document filters can be used in SyncFeeds and exported to WebDAV clients.

^

Cascading Code Fields

Code fields are rendered as cascaded drop-downs for {main category} and {sub category} in case their long texts have the format {main category}|{sub category}

^

Custom Queries in Grids

The search form displays an additional search field in case PortalExtension.getQuery() returns a non-null query for the feature 'grid.getReferencedTypeName() + ":" + identity'. openCRX/core contains an implementation for activities:

search

^

BPI Adapter with New/Additional Methods

    
1. Get contacts
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact?query=...&position=...&size=...
   * Method: GET
   * Sample queries: 
       ?query=thereExistsFullName().like(".*Doe.*");orderByFullName().ascending();
       ?query=thereExistsPostalAddress().postalCountry().equalTo(756);
       ?query=thereExistsEMailAddress().thereExistsEmailAddress().equalTo("joe@opencrx.org");
       ?query=thereExistsPhoneNumber().thereExistsPhoneNumberFull().like(".*44.*");
       
2. Get organizations
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization?query=...&position=...&size=...
   * Method: GET
   * Sample queries: 
       ?query=thereExistsFullName().like(".*Suisse.*");orderByFullName().ascending();
       ?query=thereExistsPostalAddress().postalCountry().equalTo(756);       
       ?query=thereExistsEMailAddress().thereExistsEmailAddress().equalTo("joe@opencrx.org");
       ?query=thereExistsPhoneNumber().thereExistsPhoneNumberFull().like(".*44.*");

3. Get address groups
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup?query=...&position=...&size=...
   * Method: GET
   * Sample queries: 
       ?query=name().equalTo("test");                     

4. Get address group
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup/
   * Method: GET      

5. Get address group members
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/addressGroup/member?query=...&position=...&size=...
   * Method: GET
   * Sample queries: 
       ?queryType=org:opencrx:kernel:account1:PostalAddress&query=postalCountry().equalTo(:short:756);
       ?queryType=org:opencrx:kernel:account1:EMailAddress&query=thereExistsEmailAddress().like(".*sales.*");
       
6. Get assigned activities (with optional query)
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact//assignedActivity?query=...&position=...&size=...
   * Method: GET
   * Sample queries: 
       ?query=thereExistsAssignedGroup().thereExistsActivityGroup().name().like(".*Bugs.*");

7. Get account filter
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter/
   * Method: GET

8. Get filtered contacts (with optional query)
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter//contact?query=...&position=...&size=...
   * Method: GET
   
9. Get filtered organizations (with optional query)
   * URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/accountFilter//organization?query=...&position=...&size=...
   * Method: GET
^

LDAP Synchronizer

Workflow which exports contacts as LDIF:

Configuration
-------------
* For each segment create Saved Search for Accounts named "LDAPSynchronizer"
* The LDAPSynchronizer has the following configuration options (component
  configuration with name 'LDAPSynchronizer'). Option names are of the
  form 'provider name'.'segment name'.'option name'.  
  * syncDir. default is ldapdir. The LDIF entries are created in the following sub dirs:
    * people/Add: contacts changed since syncKey in Add format
    * people/Modify: contacts changed since syncKey in Modify format
    * people/Delete: contacts disabled since syncKey in Delete format
    * people/Error: people error entries
    * groups/Add: group entries in Add format
    * groups/Modify: group entries in Modify format
    * groups/Error: group error entries
    For each entry a separate LDIF file is created. The file name is of the 
    form 'syncKey'-'count'.ldif
  * runAs: run as user
  * baseDNPeople: base DN for people entries. Default is ou=people,dc=example,dc=com
  * baseDNGroups: base DN for group entries. Default is ou=groups,dc=example,dc=com

LDAP Server
-----------
Any LDAP server supporting the standard LDIF format can be used. E.g. on Linux use slapd. 
Installation notes see http://wiki.debian.org/LDAP/OpenLDAPSetup:
> apt-get install slapd
> dpkg-reconfigure -plow slapd
Domain name: examle.com
Organization: Test
		
Running LDAPSynchronizer
------------------------
The LDAPSynchronizer workflow is started with the Workflow Controller wizard as admin-Root.

The exported LDIF files can then be processed using the LDIF importer tool
provided by your LDAP server. E.g. ldapadd for OpenLDAP. Setup a cron job to
process the exported LDIF files:

Update people
-------------
In directory ldapdir/CRX/Standard/people run the following script:

#!/bin/sh
export ts=$(date +"%Y%m%d%H%M")
mv Modify ${ts}-Modify
mv Add ${ts}-Add
mv Delete ${ts}-Delete
cd ${ts}-Add
cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd'
cd ..
cd ${ts}-Modify
cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd'
cd ..
cd ${ts}-Delete
cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd'
cd ..

IMPORTANT:
* Add operations must be done before Modify

Update groups
-------------
In directory ldapdir/CRX/Standard/groups run the following script:

#!/bin/sh
export ts=$(date +"%Y%m%d%H%M")
mv Modify ${ts}-Modify
mv Add ${ts}-Add
cd ${ts}-Add
cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd'
cd ..
cd ${ts}-Modify
cat *.ldif | ldapadd -c -x -D cn=admin,dc=example,dc=com -w 'pwd'
cd ..
^

Enhanced Campaign Wizard

See Campaign Guide for information and examples.

^

Migrated from UML2Tools to Papyrus / GraphViz

Browse the new UML Models generated with GraphViz:

Additional information about UML modeling is available from https://sourceforge.net/p/opencrx/wiki/Sdk212.Modeling/ ^


GUI: Rework of operational dialogs and inline wizards

We upgraded openCRX to the latest version of the Prototype library and reworked all the operational dialogs. We also enhanced the look and feel of inline wizards.

Send Alert

Edit Contact

^

GUI: Support for IE8, IE9, IE10

If you still have issues with IE, try a browser for a change (Firefox, Chrome, Opera, Safari, ...)

^

Workflow Structuring and Monitoring

Workflows feature a new grid [Pending / Completed Workflows] showing their processes. The list of processes can be filtered and/or sorted by various attributes like execution stage, started at, last execution, etc.:
Workflow

The workflow handler creates near real-time progress reports. Furthermore, if a process has child processes, these child processes can be monitored as well:
Workflow Report

The throughput of the workflow handler has been increased dramatically with the introduction of concurrent execution of atomic workflows.

^

Bulk Activity and Follow-up Creation

New wizards and workflows support the creation of large numbers of activities and follow-ups. The creation is performed in the background without blocking the GUI. The monitoring of running processes is supported with new wizards and the new workflow structuring and monitoring feature.

For example, an e-mail campaign can be created with the following steps:

  • create a saved search for accounts (or e-mail addresses) or start with a group of accounts/addresses
  • create e-mail activities with the bulk wizard based on an e-mail template (placeholders are supported, it is also possible to create a few test activities only to verify layout/etc.
  • perform follow-ups "Assign" and "Send as mail" with the bulk wizard; optionally you can specify execution date/time in the futur

Sample screen shot of the bulk create activity wizard:
bulk create

Sample screen shot of the bulk follow-up wizard:
bulk followup

^

BPI Adapter (Business Process Integration Adapter)

Simple, extensible adapter for business process integration. The default implementation supports the actions listed below. Additional actions can be added in custom projects by extending org.opencrx.application.bpi.adapter.BpiAdapterServlet.

1. Get code table
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Root/codeTable/country
* Method: GET

2. Get contact
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/contact/10000
* Method: GET

3. Get organization
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization/0
* Method: GET

4: Get organization members
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/organization/0/member
* Method: GET

5. Get activity creator
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activityCreator/($t*ces*Bugs%20and%20Features)
* Method: GET

6. Create activity
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activityCreator/($t*ces*Bugs%20and%20Features)/createActivity
* Method: POST
* Body:
	{ 
		"name" : "name of activity",
		"description" : "description of activity",
		"detailedDescription" : "detailed description of activity",
		"priority" : "3",
		"reportingContact": "id of reporting contact",
		"scheduledStart": "Jan 01, 2013 4:47:13 PM",
		"scheduledEnd": "Jan 01, 2013 5:47:13 PM"
	}

7. Get activity
* URL: http://localhost:8080/opencrx-bpi-CRX/org.opencrx.application.bpi1/provider/CRX/segment/Standard/activity/1000000
* Method: GET
^

Support for openCRX remote clients with minimal set of JARs

more information to follow

^

Refactoring (Wizards, Business-Logic, Backend Optimization)

Wizards were cleaned up by extracting the business-logic and moving it to Java classes. In addition to cleaning up the code lots of optimizations and also bug fixes were done. The openCRX backend was also cleaned up and various optimizations were applied to the code.

^

openCRX Server Installer (TomEE 1.6, IzPack 5)

The openCRX installer is not based on IzPack 5 (fixes for example freeze issues during the installation process on Windows 7 64bit). Also, openCRX v2.11.0 runs in the latest snapshot of servlet container Apache TomEE 1.6.

^

CardDAV

openCRX features a new CardDAV servlet. Once a user has created a Card Profile he/she can connect to openCRX with any CardDAV client to manage contacts.

We have tested the following clients:

More information about CardDAV is available from http://en.wikipedia.org/wiki/CardDAV - the RFC is at http://tools.ietf.org/html/rfc6352

^

XMPP (Jabber) Notifier

Similar to the already existing e-mail and Twitter notifiers, the XMPP (Jabber) notifier can send your openCRX alerts to your personal Jabber account. Supported are all major servers like Google Talk, Jabber.org, etc.

roller

More Information about XMPP is available from http://xmpp.org/

^

Field Localization

openCRX supports the localization of any attribute of any CrxObject. With this new feature it is also very easy to implement recipient-driven and/or sender-driven salutations and closings:

openCRX_LocalizedField

Here is the relevant excerpt from the UML model:

openCRX_LocalizedField

^

File Browser

The openCRX File Browser comes in handy if you need to fetch log files from your server, e.g. in a hosted environment without easy access by other means. For security reasons the file browser is available to the admin-Root only.

openCRX File Browser

 

^

JSP Tag Library

openMDX/Portal offers the following tags:

  • portal:showobject
  • portal:query

The tags can be used in wizards and allow easy rendering of objects and grids.

Example:

 
...
				<%@ taglib uri="http://www.openmdx.org/tags/openmdx-portal" prefix="portal" %>
				...
				<div id="content-wrap">
				  <div id="content" style="padding:10px 0.5em 0px 0.5em;">
				    <portal:showobject id="AAA" object="<%= userHome %>" showAttributes="true" grids="alert,assignedActivity" navigationTarget="_none">
				      <portal:query name="assignedActivity" query="<%= activityQuery %>" />
				    </portal:showobject>
				    <portal:showobject id="BBB" object="<%= userHome.getContact() %>" showAttributes="true" grids="address" navigationTarget="_none" />
				  </div> <!-- content -->
				</div>
				...

^

Timers

Starting with openCRX v2.10.0 you can set timers on any openCRX object. The simplest timer works like an alarm that goes off at a certain time and (depending on your subscriptions) creates an alert, sends an e-mail message, posts a twitter message or takes any other action that is available. It is possible to define repeating timers with arbitrary intervals:

Timer

With Actions > Set Timer you can start a wizard that helps you create simple alarm-type timers:

Create Timer

^

Support for Outlook MSG-Format (including X.500 Addresses)

The Wizard Upload E-Mail now supports the Microsoft-specific MSG-format (including X.500 addresses). It is now possible to import e-mail messages that were saved as files from most e-mail clients (including Thunderbird and Outlook). Of course, it is still possible to import e-mails with IMAP.

Outlook MSG Format

^

New and Enhanced Wizards

openCRX v2.10 comes with many new or enhanced wizards:

Bulk Create Activity Wizard

This wizard can be started from any account group, address group, saved search for accounts or addresses. It facilitates the creation of bulk activities like sending out a newsletter to lots of recipients, setting up phone calls to a target group, etc. The wizard support the creation of test activities.
Bulk Create Activity

Bulk Activity Follow-Up Wizard

The wizard performs bulk follow ups on a set of activities. The wizard is launched on an existing activity which serves as template for selecting the activities to process by assigned activity groups and process state.

Business Process Manager Wizard

The enhanced wizard "Business Process Manager" assists users in managing instances of complex/nested activity processes. The wizard can be started from any activity and it will collect all other activities that belong to the same process instance and display them in a visualization of the activity process. It is possible to create new sub activities with a single click and adding follow-ups to existing activities can also be done right within the wizard:

Business Process Manager

Create Contact

This wizard makes it easy to create new contacts and link them to other accounts, etc.
Create Contact

Create Legal Entity

This wizard makes it easy to create new legal entity and link them to other accounts, etc.
Create Legal Entity

Upload Document

Wizard to assist in uploading documents to the openCRX document provider:
Upload Document

Upload E-Mail, Upload Media

Similarly, these wizards make it easy to upload e-mails, files, images, etc.
Upload E-mail

Fetch E-Mail

With this wizard you can connect to a mailbox (POP3, POP3S, IMAP, IMAPS) and
retrieve messages that are then imported into openCRX...
Fetch E-Mail

Connection Helper

This wizard calculates various access URLs for CalDAV, CardDAV, iCal, ActiveSync, WebDAV, ...
Connection Helper

^

Thunderbird Add-on to connect address book

More information available at Thunderbird_Contacts_Add-on.

^

Customer Care Wizard

A new wizard that supports the most important use cases for customer care:

  • Search account
  • Show activities overview
  • Create new activity
  • Perform activity follow up

Customer Care Wizard

Permissions must be granted by the segment admin for the users to show activities and activity creators:

  • Grant permission for creator on form 'Search Contact'
    name=CustomerCareWizard:SEARCH_CONTACT:activityCreator/id
    action=+show
  • Grant permission for creator on form 'Contact'
    name=CustomerCareWizard:CONTACT:activityCreator/id
    action=+show
  • Grant permission for process state:
    name=CustomerCareWizard:activityProcess/id/processState/[:* | id]
    action=+show

The wizard can be launched on:

  • Activity group: in this case 'Contact.Search' searches within the reporting contacts of the activities of the activity group.
  • Account: in this case 'Contact.Search' searches within the account members.
  • User home: in this case 'Contact.Search' searches within all contacts.
^

GUI Element-Level Security

GUI element-level security allows to set show and edit permissions for the following GUI elements:

  • Fields
  • Field groups
  • Menu items / operations
  • Grids

Permissions are defined per Role. One or more role can be assigned to a user's principal. Roles are created by the segment administrator in Security policies > Roles. Segment administrators (e.g. admin-Standard) can then easily view and manage permissions with the new wizard Manage GUI Permissions:

Wizard Manage GUI Permissions

^

Enhanced Business Processes

The openCRX business process engine has received a major boost with openCRX v2.9.0. The most important enhancements are the following ones:

  • Business Process Definition with SCXML (see Wikipeida or Apache Commons)
  • Business Processes Importer (imports SCXML)
  • Business Process Exporter (produces SCXML - see example process)
  • Nested Activity Processes - it is now possible to nest activity processes (no limitation) with the help of Sub Activity Transitions (see UML class diagram for details)

Activity Process
Activity Process

The new wizard "Business Process Manager" assists users in managing instances of complex/nested activity processes. The wizard can be started from any activity and it will collect all other activities that belong to the same process instance and display them in a visualization of the activity process. It is possible to create new sub activities with a single click and adding follow-ups to existing activities can also be done right within the wizard:

Business Process Manager

^

Wizards for BulkCreateActivity and BulkActivityFollowUp

These two new wizards enable users to create activities with a bulk operation (e.g. to create a campaign) and perform bulk follow ups:

  • BulkCreateActivity wizard:
    Wizard for bulk activity creation based on a "Saved search - Account". A typical use-case for this wizard is to create an activity for each account which is member of a campaign (defined by the "Saved search - Account").
  • BulkActivityFollowUp wizard:
    The wizard performs bulk follow ups on a set of activities. The wizard is launched on an existing activity which serves as template for selecting the activities to process by assigned activity groups and process state.
^

Contract Groups, Contract Creators, new Contract Types

The openCRX Model was enhanced in a major way to support generic types of contracts, sales volume contracts, etc. Also, similar to Actiivty Creators and Activity Groups, there are now Contract Creators (to create contracts) and Contract Groups (to group/classify contracts) available.

Here are the most important UML models (click on the thumbnails to see larger versions of the class diagrams):

Contract Creator Contract Creator
Contract Group Contract Group
Generic Contract Generic Contract
Sales Volume Contract Sales Volume Contract
Sales Contract Sales Contract
Sales Order Sales Order
^

Reporting and Output Management

Use the existing method exportItem() to export/render data. Overriding Exporter.exportItem() allows the implementation of custom-specific rendering. As an example you can look at the openCRX Sample project, where the method exportItem() is implemented in the class org.opencrx.sample.backend.Exporter.

^

Grid Actions

Default Grid Actions

It is now possible to add custom-specific actions to the grid menu 'Actions'. The following default actions are added for openCRX:

  • Export --> XML
  • Export --> XLS (Excel Sheet)

The above actions either export the current grid page or the selected object(s).

^

Move Address, Merge Address

The new operation move address allows users to move an existing address to a new target account and update the following address references:

  • E-Mail sender
  • E-Mail recipients
  • Address group members

The operation performs the following steps:

  • clone source address to target account if it does not already exist
  • update references
  • disable source address

Similarly, the new operation merge address allows users to udpate references pointing to a source address (to be disabled) and let them reference a new target address.

^

Address Authority

This new attribute enables you to assign addresses to "authority" accounts. Think of the authority of an address as an account that "manages" or "owns" the respective address, e.g. the employer assigning e-mail addresses out of a particular domain to individual employees, etc. Even though such an e-mail address "is assigned to" to the respective employee, the employee doesn't really own this e-mail address (e.g. if an employee moves on to a different employer the previous employer (the "authority") will disable the employee's e-mail address.

Similarly, there are plenty of use cases for telephone numbers, postal addresses, etc.

AddressAuthority

The new grid [Assigned Addresses] available on all accounts lists all addresses that reference the current account as authority. Hence, it is very easy for an authority to manage such addresses:

assignedAddresses

^

Reminders

Starting with openCRX v2.9.0 you can set reminders on any openCRX object. The simplest reminder works like an alarm that goes off at a certain time and (depending on your subscriptions) creates an alert, sends e-mail message, posts a twitter message or takes any other action that is available. It is possible to define repeating reminders with arbitrary intervals:

Reminder

With Actions > Set Reminder you can start a wizard that helps you create simple alarm-type reminders.

^

Search Criteria for Group Membership

It is now possible (without defining SQL queries) to create account and/or address filters that select accounts/addresses based on an existing account membership, e.g. in oder to select all employees of a company or all e-mail addresses of members of a particular account group, etc.:

Account Membership

^

Indexer Support for MS Office Open XML File Formats

The openCRX Indexer now supports MS Office Open XML File Formats, e.g.

... in addition to the many already supported file formats:

^

Wizard DB copy

This new wizard can be invoked as root administrator (admin-Root). It allows to copy data from a source database instance to a target database instance. It provides the same functionality as the command-line version.

With this wizard you can - for example - copy all your data from a MySQL database to a PostgreSQL database directly from the openCRX GUI:

DB copy wizard

^

Wizard DB schema validate/upgrade

The wizard can be invoked as root administrator (admin-Root). It allows to create, validate, upgrade and migrate an openCRX database. The database can either be specified by its JNDI name or by a JDBC connection URL.

DB  schema wizard
  ...

Validation performs the following checks:

  • Test existence of tables
  • Test columns of all tables (missing / extra columns)
  • Test existence of views
  • Test existence of indexes
  • Test existence of sequences
  • Test existence of preference entries (missing / extra entries)

Fix allows to fix the reported issues:

  • Creation of tables
  • Creation of missing columns
  • Creation/replacement of views
  • Creation of indexes
  • Creation of sequences
  • Creation/replacement of preference entries

Fix never never drops or removes any database objects or rows. So you never loose data. However, because fix may modify your schema it is recommended to backup before upgrading / fixing a database. It is possible to run fix on an empty database schema. In this case all tables, views, indexes and sequences are created.

Known issues:

  • In some cases the CREATE OR REPLACE VIEW statements may fail for several reasons (table with the same name exists, non-compatible column types, etc.). In this case it is recommended to remove all views and run fix. It recreates all views.
^

openCRX Server Installer with Apache TomEE

Apache TomEE, pronounced "Tommy", is an all-Apache stack aimed at Java EE 6 Web Profile certification where Tomcat is top dog (more information about Apache TomEE is available from http://openejb.apache.org/apache-tomee.html).

The new openCRX Server installer includes Apache TomEE so that the whole installation process can be completed in one go and there is no more need to deal with a installer.

^

RunAs Permissions

The AccessControl plug-in supports runAs permissions. runAs permissions allow to run object access operations (read, update, delete) under a different principal than the requesting principal. This feature allows users to define deputies for certain use cases, e.g. a user can allow an assistant to manage his/her calendar.

Two different formats are supported:

  • object:authority/object path@runAsPrincipal
    e.g. 'object:org.opencrx.kernel.activity1/activityTracker/{id}@user1'
    The meaning of this permission is: "run the object access operation for the specified object as user1'.
    An object permission defined for an activity creator implies runAs permissions for all activities created with this creator.
  • groupMembership:authority/group path@runAsPrincipal
    e.g. 'groupMembership:org.opencrx.kernel.activity1/activityTracker/{id}@user1'
    The meaning of this permission is: "in case the object is member of the specified group, run the object access operation as user1".

Permissions are created as follows:

  • Login as segment admin
  • Navigate to Security Policy > Privileges
  • Create a new privilege and set name to the permission name,
    e.g. 'object:org.opencrx.kernel.activity1/activityTracker/{id}@user1'
  • Create a new role or select an existing one
  • Create a new permission and set the name to the permission name,
    e.g. 'object:org.opencrx.kernel.activity1/activityTracker/{id}@user1'. Set action to 'runAs'.
  • Assign to role to a principal

The AccessControl plug-in handles runAs permissions as follows:

  • object: In case the XRI of the accessed object matches the permission's path pattern, the object access operation is run as the principal specified by the permission.
  • groupMembership: In case the accessed object is member of a group where the XRI of the group matches the permission's path pattern, the object access operation is run as the principal specified by the permission. groupMembership currently only works for activities / activity groups.
^

Extended OpenCRX Object

Many more objects than in previous openCRX versions are now full-blown openCRX objects:

  • ActivityEffortEstimate
  • ActivityGroupAssignment
  • ActivityParty
  • CalendarDay
  • PriceModifier
  • ProductConfiguration
  • ProductConfigurationTypeSet
  • ProductReference
  • ResourceAssignment
  • Vote

The advantages are manifold, including user-specified attributes (i.e. no need to extend the UML model and the database to beef up standard objects with your own attributes; "adding" a new attribute to an OpenCRX Object is a matter of customizing only).

^

Mapping of E-Mail Recipients / Attendees

Unknown e-mail recipients were mapped to the generic e-mail address "UNKNOWN" in previous versions of openCRX. Starting with openCRX v2.9, an e-mail address object is created for such recipients and then assigned to the segment administrator. The address can be moved with Move Address to the proper account at a later time.

Additionally, there is also an enhanced ICAL mapping of attendees. The new attribute emailHint was added to AbstractActivity party. The hint allows to have multiple activity parties pointing to the same account. The hint serves as e-mail address selector in case the account has multiple e-mail addresses. The ICAL import sets the hint field for each imported ATTENDEE, whereas the ICAL exporter/mapper uses the hint to generate the ATTENDEEs.

When importing an ICAL and the e-mail address of an ATTENDEE is unknown, an e-mail address object is created for such attendees and then assigned to the segment administrator.

^

Lightning's Meeting Attendee Status NON-PARTICIPANT

We newly map the status code NON-PARTICIPANT, which is used by Lightning (Mozilla Calendar Project) to indicate that a meeting participant was removed, to the openCRX status code "N/A". This ensures, that it is possible to "remove" attendees from an event directly in Lightning without actually "deleting" such attendees in openCRX..

^

Enhanced VCARD Importer

The openCRX VCARD importer was enhanced so that it accepts mime types and file extensions. It is also possible to import minimalistic VCARDs. Some of these enhancements were propagated to other importers as well.

^

Persistence Configuration

The openCRX persistence configuration was moved to

  • src/jar/opencrx-resources.jar/META-INF/Kernel.properties
  • src/jar/opencrx-resources.jar/Security.properties

The table prefs_preferences is not required anymore.

^

Code Reload on-the-fly

New codes can be reloaded on-the-fly, i.e. it is not required to restart openCRX anymore.

^

GridMoveUpObjectAction, GridMoveDownObjectAction

The new grid actions allow you to change the position of values for multi-valued, ordered reference features (e.g. you can now change the ordering of contracts referenced by an activity):

GridMoveUpDown

^

Support for OpenJDK

It is now possible to run openCRX with OpenJDK (required is at least v1.6.0_23).

OpenJDK is an open-source implementation of the Java Platform, Standard Edition.

^

New Language: xx_YY

openCRX is already available in many languages and more of them are in the pipeline. At this time we do not know yet which additional languages will be ready for inclusion in this openCRX release, but any news will be posted without delay. If you want to contribute and are ready to translate a bunch of strings into a new language, .

^

WebDAV

openCRX features a new WebDAV servlet. Once a user has created a Document Profile he/she can connect to openCRX with any WebDAV client to manage documents (including revisions, etc.).

Most Linux distributions support WebDAV out of the box (e.g. Dolphin is a great WebDAV client on Kubuntu, Nautilus works just fine with the Gnome desktop - you might have to install the davfs2 package...), on Windows you might want to use a third-party tool like BitKinex to avoid the quirky implementation of Microsoft's web folders. On the iPhone you might want to look at the Notebooks App.

^

CardDAV

openCRX features a new CardDAV servlet. Once a user has created a Card Profile he/she can connect to openCRX with any CardDAV client to manage contacts.

^

E-Mail Import with Auto Assign

We taught the openCRX E-Mail importer a few new tricks to facilitate the use of openCRX for E-Mail support. Details of how this new feature works will be available in the openCRX Admin guide once it is available.

^

Support for Party Status of ActivityParties

openCRXS newly supports a Party Status of ActivityParties. The Party Status has the same semantics as ICalendar PARTSTAT:
* PARTY_STATUS_NEEDS_ACTION
* PARTY_STATUS_ACCEPTED
* PARTY_STATUS_DECLINED
* PARTY_STATUS_TENTATIVE
* PARTY_STATUS_DELEGATED
* PARTY_STATUS_COMPLETED

CalDAV and ICS servlets support this new feature as well so that calendar clients like Mozilla Calendar can be used to manage attendees and the status of attendees.

^

Extension Sales Volume Budgets

SalesVolumeBudget is a 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.

^

Twitter

Configure twitter accounts and timelines on various openCRX objects such as user homes, accounts, activities, and products. The openCRX Admin Guide contains information about the implementation and configuration of the openCRX Twitter adapter.

More information about Twitter is available from www.twitter.com

^

IMAP IDLE

The openCRX IMAP servlet now also supports IMAP IDLE, an IMAP feature described in RFC 2177 that allows a client to indicate to the server that it is ready to accept real-time notifications. This comes in quite handy if you have an Android phone and want to receive real-time notifications of new openCRX alerts.

k9mail for Android, for example, supports IMAP IDLE:

k9mail

^

CopyDB with Provider change

The utility CopyDB now supports changes in provider name when copying a database with the new options
* -Dprovider.name.source
* -Dprovider.name.target

^

Workspaces (GUI Extension)

Workspaces enable you to organize your work any way you like, e.g. based on workflows or thematically. It is easy to create workspaces for contact management, bug tracking and support, etc. Workspaces are managed by the segment admin.

A new left-pane holds the workspace-level dashboard. The global 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

 

^

Activity Replication

Activity replication is supported as follows:
Activities linked with the link type 'is replica of' or 'is replica of (obfuscated)' are updated whenever the original activity is modified. The method Activities.replicateActivity() allows to control the replication at attribute-level. By default, 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.

^

Shop Front End

One candidate for a cool shop front end to openCRX is PrestaShop:

PrestaShopt

We implemented an adapter that can connect to PrestaShop instances and imports all the relevant data (customers, products, prices, orders, etc.) into openCRX - click on the following image below and give it a try (if you register and enter orders, you will be able to find the respective data on the openCRX demo server):

Username: guest@opencrx.org
Password: guest

Information on how to setup/configure everything is available in the openCRX v2.8.5 release notes.

^

openCRX Server Installer with Apache TomEE

Apache TomEE, pronounced "Tommy", is an all-Apache stack aimed at Java EE 6 Web Profile certification where Tomcat is top dog (more information about Apache TomEE is available from http://openejb.apache.org/3.0/apache-tomee.html).

The new openCRX Server installer includes Apache TomEE so that the whole installation process can be completed in one go and there is no more need to deal with a Tomcat installer.

^

AirSync Server - Enhancements like support for Android 2.2 (Froyo)

AirSync Server - OTA Synchronization openCRX ⇔ Mobile Phones / PDAs

You should consider the openCRX AirSync Server if you don't have an MS Exchange Server or if you intend to get rid of it. With the openCRX AirSync Server Mobile phones and PDAs featuring ActiveSync (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) can connect directly to openCRX (acting as an ActiveSync server) to synchronize E-Mails, Contacts and Calendars. If required, you can still synchronize MS Outlook with your mobile phone / PDA. On the other hand, you should probably have a look at the combo Mozilla Thunderbird / Lightning (runs on both Windows and Linux!) which is an excellent Open Source alternative to MS Outlook.

Read more about openCRX AirSync in the openCRX Admin Guide.

There is no need for an MS Exchange Server!

AirSync Server

 

In addition to full support for the iPhone (iOS3, iOS4) we also support Android 2.2 devices like the HTC Desire:

  • Setup/Config:
    sync add_account user
    server finish sync
  • Contacts:
    contacts-overview contacts-detail
  • Calendar:
    calendar-overview calendar-detail
  • E-mail:
    mail-overview mail-detail

More information is available in the openCRX Admin Guide.

^

AirSync Client - Backend Synchronization openCRX ⇔ MS Exchange

You should consider the openCRX AirSync Client if you already have an MS Exchange Server and all your mobile phones / PDAs / MS Outlook clients connect to that MS Exchange Server. The openCRX AirSync Client enables fully automated backend-synchronization of E-Mails, Contacts and Calendars between openCRX and MS Exchange. Thus, MS Outlook, Mobile Phones and PDAs connecting to MS Exchange (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) get easy access to E-mails, Contacts, and Calendars managed in openCRX. No need to reconfigure MS Outlook or any of your mobile phones / PDAs.

AirSync Client

If you don't have an MS Exchange Server or intend to get rid of it, see what openCRX AirSync Server can do for you - various clients (MS Outlook, Thunderbird, Mozilla Calendar, ...) and devices (iPhone, Android-based devices, Windows Mobile devices, ...) can connect directly to openCRX.

^

OpenSocial Gadgets

openCRX is basically OpenSocial-ready, i.e. it's a matter of programming a few useful gadgets:
Gadget

More information about OpenSocial is available here:

^

AirSync Server - OTA Synchronization openCRX ⇔ Mobile Phones / PDAs

You should consider the openCRX AirSync Server if you don't have an MS Exchange Server or if you intend to get rid of it. With the openCRX AirSync Server Mobile phones and PDAs featuring ActiveSync (i.e. all Windows Mobile devices, all Android devices, Apple's iPhone, RIM's BlackBerry, and most phones by Nokia, SonyEricsson, LG, Samsung, Motorola, etc.) can connect directly to openCRX (acting as an ActiveSync server) to synchronize E-Mails, Contacts and Calendars. If required, you can still synchronize MS Outlook with your mobile phone / PDA. On the other hand, you should probably have a look at the combo Mozilla Thunderbird / Lightning (runs on both Windows and Linux!) which is an excellent Open Source alternative to MS Outlook.

Read more about openCRX AirSync in the openCRX Admin Guide.

There is no need for an MS Exchange Server!

AirSync Server

We have thoroughly tested the openCRX AirSync Adapter with the iPhone:

Exchange Account  Push Mail
Push Calendars  Push Notification

Push Contacts
^

LDAP Server

We have added native LDAP Server functionality to openCRX (get more information about LDAP or read what Wikipedia is saying about LDAP ). In a nutshell this means that you can use any LDAP client to connect to openCRX and view openCRX Contacts. Mozilla's Thunderbird and MS Outlook both support LDAP and they work flawlessly with openCRX.

A simple sample query with ldapsearch:

ldapsearch -D "guest@Standard" -w guest -h localhost -p 1389 -b "ou=filter/All Accounts,ou=Persons" -l 100 -z 100 -P 3 ""

^

CalDAV Support for Mozilla Calendar

In addition to the already existing ICS support openCRX now also offers full CalDAV support for Mozilla Calendar, i.e. Thunderbird 3 with the Lightning 1 Add-on and Sunbird 1.

^

Thunderbird 3 Address Book Connector

The project page is at https://www.mozdev.org/projects/overview/opencrx/ - additional info and screen shots are available from here.

^

Shop Adapter

The openCRX Shop Adapter allows you to build shops (web stores, etc.) based on openCRX. The shop adapter provides service-oriented access to the relevant openCRX objects (customer, order, etc.).

openCRX Shop

^

Support for Eclipse Modeling Framework EMF

We migrated all the openMDX and openCRX UML Models from IBM Rational Software Modeler (a commercial tool) to the Eclipse Modeling Framework EMF.

Eclipse EMF

The EMF project is a modeling framework and code generation facility for building tools and other applications based on a structured data model. From a model specification described in XMI, EMF provides tools and runtime support to produce a set of Java classes for the model, along with a set of adapter classes that enable viewing and command-based editing of the model, and a basic editor (see http://www.eclipse.org/modeling/emf/ for more informationen).

XMI migration was trivial, but we also redrew all the class diagrams:

ActivityDetails

^

Support for Java 6

openCRX v2.6 runs on Java 6 (see http://java.sun.com/ for more information).

^

Support for HSQLDB v2.0

openCRX v2.6 supports HSQLDB v2.0 (see http://hsqldb.org/ for more information):

HSQLDB2

As far as openCRX is concerned, the performance of HSQLDB 2 is roughly on par with PostgreSQL for smaller data sets, i.e. more than sufficient for lots of use cases. Bitrock installers for openCRX v2.6 include HSQLDB v2.0 as the default database engine.

^

Upgrade Apache OpenEJB to version 3.1.2

This is a technical upgrade "under the hood". OpenEJB 3.1.2 was released on 14 October 2009 and openCRX v2.6.0 will use this latest stable version.

OpenEJB

Information about Apache OpenEJB is available from http://openejb.apache.org/.

^
http://www.crixp.com/ http://www.openmdx.org/