May 29, 2009

Using Openbravo Forge to develop an Openbravo ERP localization

by Jordi Mas
Hello there,

One of the earliest adopters of the Openbravo Forge since it was launched two months ago have been the localizers. They appreciate the freedom of been able to setup their project, forums and been able to publish news, files and modules in the Central Repository (before it was necessary our assistance).

In the last weeks of experience working with localization projects on the Forge we have crafted some best practices and polices to apply in Openbravo Forge to develop and organize a localization project.

Let me share them with you.

Introduction

Many countries and regions have similar requirements, like sharing the same language or functional requirement. To be able to reuse localization components, we provide the following types of projects to enable functionality delivery:
  • Module: provides an atomic functionality. Examples of modules are chart of accounts, translations, banking interfaces, etc.
  • Pack: group all the modules necessary to enable Openbravo ERP for a country or region. For example, the Spain Localization Pack that contains a full localization package for Spain.
We recommend that:
  • Each country or region should create one and only one pack that contains all the relevant modules. A pack should be created for consistency sake even if it contains only one module.
  • Each country or region could create zero or more modules (zero if it only reuses modules and does not create any geography specific modules)
Packs

When registering your localization pack project for your region, we recommend to enable the following services in Openbravo Forge:
  • Module: to publish the pack in the central repository
  • Forums: to discuss localization issues for the region that the pack targets
For localization packs, we suggest to discard the usage of the rest of the services that the Forge provides.

Additionally, we recommend:
  • Since a pack groups modules, they should not contain code, and as result, they should not require a source control system.
  • We recommend to report issues, using the bug tracking system, to each particular module instead of reporting to a pack.
  • We only recommend to publish files in the download area during the development cycle, you post your obx file in progress in the download area for early adopters to download and evaluate. We do not recommend to publish the files in the download service once they are released since you can already download files published in the central repository.
  • When registering the project, assign it to the 'Openbravo ERP -> Localization Packs category.
Modules

When registering your localization modules, we recommend to enable the following services:
  • Module: to publish the module in the central repository
  • Code: to develop the code of the module and be able to work in a collaborative manner with other developers
  • Bug Tracking: to allow users to report issues or functionality enhancements
  • Wiki:to publish documentation for the project and to coordinate work
For localization modules, we suggest to discard the usage of the rest of the services that the Forge provides.

Additionally, we recommend:
  • We only recommend to publish files in the download area during the development cycle, you post your obx file in progress in the download area for early adopters to download and evaluate. We do not recommend to publish the files in the download service once they are released since you can already download files published in the central repository.
  • When registering the project, assign it to the 'Openbravo ERP -> Localization Modules category.
Project naming conventions

For naming localization projects we recommend the format Name of the country + Description, except for language modules that we recommend Language name + for + country.

For example, for Spain we use the following names:

PackModules
Package name conventions

The following table contains a description of the best practices when naming packages.


Additional links



May 22, 2009

Openbravo POS 2.30 released

by Adrián Romero
After more than two months of the release of Openbravo POS 2.30 beta, finally Openbravo POS 2.30 is released. The changes from 2.30 beta to 2.30 has been only bug fixing and product stabilization. No new functionalities has been included. To show in numbers what we did since 2.30 beta. We fixed 66 bugs reported in the issues reporting tool and we did 90 change sets in the SCM repository. Now this release is published in production ready status. This means the following:
  • We recommend new implementation projects to start with this release.
  • We recommend existing production deployments to upgrade to this release.
  • An upgrade path is available from earlier releases to 2.30.
If you want to know about the new functionalities created from 2.20 and the most convenient package to download for your platform, I suggest you to read the Release notes of Openbravo POS 2.30, but I want to highlight the most important features introduced in 2.30:
  • The PDA restaurant module. This feature will allow users to take orders, browse products and manage tables using a mobile device. More information in the PDA module installation guide.
  • Product attributes. With this new feature products can have attributes like size, color, serial number, etc. More information in the Products attributes guide.
  • ERP-POS synchronization. A new architecture for the Openbravo ERP and POS synchronization. More information in the Openbravo POS and ERP integration guide.
Another improvement done from the engineering point of view, has been the movement of the source code management system (SCM) from Subversion to Mercurial. Mercurial is a distributed SCM designed for efficient handling of very large projects. Mercurial gives Openbravo POS developers several benefits based on its distributed nature like to allow to work productively even when not connected to a network, and make it easier to do merges between different Mercurial repositories. You can view a summary of the repositories in the Openbravo POS repositories list.

And last but not least, there is now a Professional Subscription for Openbravo POS 2.30. This is the recommended option for commercial deployment of Openbravo POS, and includes professional support from the development team, access to certified automated updates and upgrades, lifecycle guarantee, bug fixing guarantee, and IP indemnification.



May 21, 2009

Try a Clickable Prototype

by Rob Goris
The design concepts for OB ERP´s new user interface are getting more mature by the day and we continue using feedback at any stage, whether it be through the forums, peer reviews or usability tests. This time I have built a clickable prototype that shows a number of tasks around expense reports. It intends to verify how well our master-detail concept (Kompressor) works in real-life scenarios.

Download the zip file, unpack and run Expense Reports Scenario.htm. I will use this for a couple of usability tests with end users but I am also really interested in your thoughts while running it.

Normally I ask users to speak out loud while performing a task but that won´t work remotely (and your colleagues/wife/husband/house mates will look funny at you) so better write down your thoughts when running the scenario and post them here. If you are a colleague of mine and want to do the usability test, just let me know and we will do the test together in the office.

Remember that we are testing our software, not you, so don´t feel stupid when you did not click the right spot at first. It just means that the design is not right yet. The user is always right!

Running the scenario more than once can be interesting too, to see if there is a learning curve.



May 19, 2009

Extend, don’t customize

by Paolo Juvara
Introduction
Every business is different and every company adopts different business practices. As a consequence, every ERP implementation is different and being able to adapt the software to the customer's specificities is a key characteristic of a good ERP package.

In this area, open source has a clear advantage compared to proprietary solutions thanks not only to the access to source code but also to the free availability of knowledge about the inner logic of the product.

Openbravo ERP, in particular, has been designed and managed considering the need for adaptation as a key requirement:
  • Its model driven architecture enables users to change standard functionality in a very easy manner.
  • The free flow of information available on the project wiki and forums have empowered the community to make changes to even the innermost core part of the product.
This openness and flexibility provides great power to implementor and allows them to customize the product to meet practically any business requirement.

However, as Ben Parker said, "with great power comes great responsibility" and in this case the great responsibility is to your own implementation as it is very easy to abuse this great customization power and change the product to the point where you can no longer afford to upgrade it nor benefit from the improvements made by the rest of the community.
If you are not very careful, it is very easy to find yourself in a position where you are either stuck on a product version that will eventually age and become obsolete or you have to bear the burden of maintaining and evolving the full solution instead of only your code. In both cases, you started with a packaged off the shelf application and you ended up with a bespoke piece of software.

It is important to notice that this danger exists both in open and closed source software. Countless literature has been published on the topic of customizations and upgrade nightmares and the prevailing wisdom is that, for mature ERP packages, customizations should be avoided at all costs. Many experienced implementors also recommend that a vanilla solution should be adopted for the first few months of production usage as many users discover that customizations initially thought essential are in fact not needed.

The problem of excessive customization, however, is much more pervasive in open source software because:
  • Often the open source solutions are more recent and innovative than their proprietary counter parts but not as mature; therefore, the pressure to customize is stronger.
  • Most importantly, the "hacking ethos" of the open source movement makes open source implementors culturally more disposed to implement invasive customizations.
Openbravo to the rescue!
Openbravo ERP 2.50 introduces a set of very powerful adaptation techniques that will allow you to personalize the software to meet your unique needs without the need to customize it.

This approach guarantees that you will be able to apply patches and maintenance packs without impacting your adaptations and minimizes the cost of upgrading from one major version to the next.

The core principle of these techniques is summarized in the title of this blog: as you design your adaptations, you should think of them as extensions and not customizations.

Openbravo ERP 2.50, in fact, introduces support for modularity, which allows you to define and package additional functionality and configurations as extension modules, independently from the core product.

One of the key features of modularity is that your configurations are also defined as extension modules. Because of that, they are kept separate from core and you can safely update the latter without touching you configuration.

Let's see how it works. To start your adaptation process you need to set the system in Configuration mode. You can do that by navigating, in System Administrator role, to General Setup / System Info and checking the box Customization Allowed (see picture below).


This will automatically create a template called "System Customization" and any configuration change or addition that you make will be added to this template.

In this template, you can safely modify the Openbravo core model (the meta-data that describes Openbravo ERP out of the box) and you can add your own model elements, such as new windows and processes. You can also add code-based artifacts such as new PL/SQL functions or Java classes and add or modify their corresponding calling points within the application.

What you can do is practically unlimited and, most imporantly, it is always update safe.

Examples
To illustrate this principle, I would like to consider a few concrete examples.

Let's start with something simple. Let's assume that your adaptation consists in modifying the default screen layout for the Sales Order screen, to change the order of the fields, hide some that are not needed in your business, and rename some labels. After having set the system in customization mode, you would proceed by performing your configuration changes in the same way you did in 2.35 and 2.40 by navigating to the Application Dictionary / Windows, Tabs and Fields, querying the definition of the Sales Order window and modifying its configuration there. Similar to previous releases, to see and test your changes you then need to rebuild the system.
What is new with 2.50 is that, once you are satisfied with your application, you can export your configuration script using the export.config.script ant task and that at this point your configuration is saved in the file system.
If at a later point in time you need to apply a core maintenance pack, you can do so safely because the pack will override the files for the core module but it will not touch your configuration file. Once the system is rebuilt, you configuration is considered once again and automatically applied to the updated core.

This is a much easier process compared to previous versions when your configuration changes were saved in the same files as core definitions and you therefore had to go through a very difficult and error prone merge process to apply the maintenance pack without loosing your adaptation.

Let's consider another example. In this case, we will assume that your adaptation consists in creating a new window. After having set your system in customization mode, you can define and declare the new tables that are needed to support your window and proceed by defining the window in the Application Dictionary. If you are not an experienced Openbravo developer, you can follow the tutorial in the Developer's Guide for step by step instructions.
The concept is very similar to the previous example and in this case as well your adaptation will be saved in a separate set of files and preserved when you apply maintenance.

A difference worth mentioning in this case is that you need to create your new window as a module separate from the "System Customization" template; this will give you more flexibility, including the option of reusing this window in another Openbravo instance without having to share the full configuration; you can even publishing it to the whole community leveraging the Central Repository.

This process can be extended directly to very similar examples, like adding a new report or a new background process. In both cases, you can adapt your system through extensions that are both easy to implement and maintenance safe.

At this point, you are probably thinking that this is quite good for configuration changes and additive extensions but you might be wondering how can you modify core. For example, does Openbravo let you add a column to a core table and a new field to the corresponding window?
Of course, it does. Just create a module and follow this tutorial. The concept is the same and, in this case as well, your changes will be preserved when you apply the next maintenance pack.

You want something very sophisticated? How about adapting the accounting logic to account asset depreciation in a different manner?
This is easy is easy to do. You need to define a module that contains a small Java class that implement your asset depreciation accounting logic and declares it in Openbravo as an accounting template

Impressive, isn't it?

So, what are some of the limitations? Well... they are not many, but the major limit is caused by the fact that the lowest level of modularization is the finest grained software artifact.
This is very fine grained in the case of Application Dictionary elements where you can adapt the software at the level of the individual property. However, it is less fine grained in the case of code, where you can adapt by logical file replacement: you add a module with the new file that substitutes the core one and you repoint the calling points as a configuration.

For example if you need to modify a core report, the lowest level of granularity is the jrxml file and you will need to create a module that includes a copy of the original core report and make your changes there; you then need to change the report declaration in Application Dictionary to invoke your modified report in lieu of the core one.
The consequence of this is that you have now taken the ownership of the whole report and that maintenance changes to the core file will not impact your adapted one.
Depending on the extent of your changes, this might or might not be an undesirable effect.

Similarly, if you want to modify a selector to, for example, add a column in the results table, you will need to create a copy of the full selector and maintaining it from that moment onwards.

In most cases, this is a small limitation and does not cause any significant issue. In a few circumstances, however, it does result in adaptation modules that are too large compared to the desired change in functionality. A typical example is a small change required in a database procedure like C_INVOICE_POST that will require you to own and maintain the whole procedure.

We have been uncovering cases like this working with the early adopters of release 2.50 and our experience has been that we can easily refactor these components so that there is always a clean way of plugging-in your extended logic without the need to take over the full component.

Because of that, I encourage you to contact us if you find yourself in that situation; in most cases, we can work with you and make small changes to core that will make your extension much easier. If you are a partner or a professional subscriber, you can request our assistance through your Channel Business Manager or through the Openbravo Support portal respectively; if you are a community user, you can contact us using the Help forum.

Do you still want to customize?
We strongly believe, and our experience so far confirms it, that using the techniques that I illustrated above, you can meet any adaptation need through extensions rather than customizations.

That said, since Openbravo ERP is an open source solution, you continue to be free to change its code. You need, however, to be conscious that this freedom comes with a high price tag in terms of maintainability.

The only legitimate reason to customize core is when you find a defect and rather than relying on a fix provided by Openbravo, you decide to implement the change yourself. In that situation, we would strongly encourage you to report the defect in the issue tracker and - if possible - to contribute your fix as a patch attachment to the issue. By contributing your fix, you can be sure that it will be included in the subsequent maintenance pack as well as in the next release; this way, when you update or upgrade your system, you will not have to neither merge the code nor reimplement the fix.

In the unlikely event that your really cannot meet your requirements through an extension, first I would encourage you to contact us before considering a customization: we might be able to make a small core change that makes your extension possible.
You should also consider whether the benefits of the customization are really worth the maintenance problems that they are going to cause. Perhaps, you can trade off that functionality in favor of ease of maintenance.

In the end, if you decide that you still want to customize core, you can follow the same approach that was recommended with 2.35 and 2.40: manage your customizations as source code and merge your development stream with our maintenance stream using a source control tool like Mercurial. Even in this case, Openbravo ERP 2.50 will result in a better experience than previous releases and the effort of resolving conflicts will be much lower because:
  1. A good portion of the customizations should be done through modules anyway
  2. The only core customizations are likely to be for code and not for meta-data and merging code is a lot easier than merging the XML based meta-data.
Above all, remember: extend, don't customize!



May 13, 2009

Openbravo Wiki Archive namespace

by Jordi Mas
Openbravo Wiki has currently more than 2.000 articles. Many of these articles are legacy documents that belong to older versions of our projects: user manuals, design documents, old coordination documents, etc. A search in Openbravo Wiki returns as results many legacy documents that are no longer useful making more challenging for users to find the information that they are looking for. With the new categorization system, that was introduced some weeks back, the situation has improved since categories are more usable but there is still room for improvement.

To address this situation, we have created the Openbravo Wiki archive namespace. We have started to move all the articles that we consider legacy to this new namespace. The idea is to keep in the main namespace only documentation that is valid for the current stable version, Openbravo ERP R2.50 nowadays. Additionally, we have modified the search UI for Openbravo Wiki enhance the search user experience.

I think that these changes will improve greatly the experience of all users looking for information.

I want also mention that creation of new categories has been blocked. This has been done to prevent the proliferation of categories that ignored our current category system. Please, contact the Wiki administrators if you need a new category.



May 11, 2009

Openbravo ERP Localization IRC meeting: 18th of May

by Richard Morley
During the Openbravo World Conference I was lucky enough to meet many of the enthusiastic individuals involved in localizing Openbravo ERP.
These are individuals who contribute their time to either create, maintain or enhance the localization capability of Openbravo ERP around the world.
It really was great not only to discuss how they were doing as individuals, but also to help the networking process when I discovered that two or more people were interested in contributing to projects that had similar goals.
To support the many people involved in this process that were not able to participate in the event in Barcelona I have scheduled an IRC chat in which we will discuss the localization of Openbravo ERP.

The agenda we will address during the chat is:
* An update on our own progress and experience of building the Spanish Localization pack using modularity in Openbravo 2.50
* Other localization initiatives we are currently working on
* Using the Openbravo Forge for managing your localization projects...why it is a good idea to register your projects.
* Any questions you might have relating to localization
* Going forward; localization functionality and what is needed in core to support your efforts. Your suggestions....

I would really appreciate it if you can find the time to join the chat and contribute to the discussion on how to improve the localization experience, features and tools.

The details are of the chat are:

Date: Monday 18th of May at 14.00 GMT (16.00 Spanish local time) For an easy way to work out what time that is for you I would suggest http://www.timeanddate.com/worldclock/
Where: IRC Network FreeNode at the #openbravo channel (see http://wiki.openbravo.com/wiki/Communication_channels#Openbravo_chat_channels)
Language: English

Best Regards
Richard



May 10, 2009

Choose your Super Hero: Grid Splitter or Kompressor

by Rob Goris
Guys, I am torn between two concepts for master-detail: "Grid Splitter" and "Kompressor". They sound like the villains from The Running Man, I know, but other than in the film, this time we want one of them to become an actual winner. Sorry Arnold.

Grid Splitter is the concept that shows a header (parent) grid together with a lines (child) grid in one view. Kompressor only shows one grid at a time and compresses the top grid into a single summarized row when the bottom grid is activated. This way the user is not distracted by the header grid while working on the lines, which is in fact a variant of the progressive disclosure interaction design technique we already used to hide the lines grid while working in the header grid.

You can view an abstraction of their behavior in these diagrams (1 & 3 show Grid Splitter, 2 & 4 Kompressor) but perhaps it's easier to go through a scenario for the new concept (Kompressor). Use right-arrow key on your keyboard to flick through the scenario.

Choose your favorite super hero now!

If my doubt persists, I will have to take them to the streets, for some serious usability testing. There can only be one winner.



May 8, 2009

Status Update for April 2009

by Paolo Juvara
Starting from this month, I would like to introduce a practice of sending regular updates to the Community on the recent achievements and progress of the product development organization.
My goal is that, before the 10th of a month, I would publish a quick update of what was done in the previous month.

This is the first installment, which refers to the month of April 2009. I will also consolidate these updates on our wiki in a status update page. The idea is to provide a complementary page to the product road map, where the product road map gives a forward looking view of where the product is going and the Status Update a historical record of the road we traveled.
In this context, I also just updated the product road map to make sure it is current.

Status Update for April 2009
  • Product releases
  • Openbravo ERP 2.50 Production was released on April 15, 2009. This is a significant new release with extensive new capabilities; please see the 2.50 Release Notes for details.
  • Modules
    • The following new 2.50 compatible modules have been released:
  • The following new 2.50 compatible packs have been released:
  • We also made progress in the development of the following extension modules:
  • Core enhancements:
    • Improved the Create Invoices from Orders window (feature requests 8173/8175)
    • Ability to apply price adjustments to a specific order line (feature request 8161)
    • Improvements in the Payment Report to show the sales representative (feature request 8164)
    • Ability to create lines from debt-payments in the Cash Journal window (feature request 8468)
    • Support for early payment discount (feature request 8176)
    • The above enhancements are available in main and will be released as part of 2.50 MP1)
  • Defects
    • A total of 338 defects have been resolved or rejected with the following breakdown by severity:
    • 14 critical
    • 184 major
    • 109 minor
    • 31 trivial
  • Infrastructure
  • Documentation


  • May 7, 2009

    Openbravo Forge chat meeting on Monday 11st of May 2009

    by Jordi Mas
    Since the launch of Openbravo Forge a little more than a month ago, we have received lots of questions and ideas. During the Openbravo World Conference lots of people had questions on how the Forge can help them to be more productive and get more exposure on what they do, something that I briefly explained a few days back.

    I would like to organize a chat with all of you to discuss about the Forge. Mainly to:
    • To solve doubts regarding the usage of the Openbravo Forge that you may have
    • Questions on how to develop verticals and extensions through the Forge
    • To answer questions regarding future plans of the Openbravo Forge
    • To get Feedback and ideas for future versions
    The details are of the chat are:

    Date: Monday 11st of May at 14.00 GMT + 1 (16.00 local time in Spain due to daylight savings). Check the World Clock if you want to check the time in your area.
    Where: IRC Network FreeNode at the #openbravo channel
    Language: English

    I will appreciate if you can participate in the meeting if you have ideas or questions about the Forge.



    May 5, 2009

    Reducing Risk By Continuous Integration – Part1

    by sree
    According to Martin Fowler,

    Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly...read more.


    Openbravo has adopted to CI aka Continuous Integration practices in the pursuit of developing usable software after every commit.

    The show begins:
    • We have people from all over the world write code (in Java)
    • We have to make sure no bad code get committed to our system
    • The new code written adheres to coding standard
    • The code does not break any major functionality
    • The database is intact
    • There is no broken link
    • and list goes on ...
  • The code gets committed in a central repository (code.openbravo.com)
    • We have to verify the license is correct
    • The file is not tampered or corrupted
  • We use Apache Ant scripts for code compilation (ant.apache.org)
    • Compile source to byte code
    • Import / Export Database
    • Run Unit/Sanity/Smoke Test before compilation
    In simple term a CI tools helps us automates things
    • that we do daily/weekly/monthly/yearly
    • that has to be done on a specific condition say on code commit, on creating a new branch, etc

      The workflow of a CI tool is like this:

      • First, a developer commits code to the version control repository.
      • CI server is polling this repository for changes (e.g., every few minutes/few commits).
      • Execute build scripts.
      • Feedback build results to members (e-mailing/feeds/irc).
      • Wait for next commit.
      A Word of Caution:
      We cannot assume that we are safe from integration problem, CI is a supporting tool in the development/release cycle to detect defects early. The participation of development / QA team plays a very important role. Educating the importance of commit early commit often and detect errors early is the key. CI is not just a technical implementation; it is also an organizational and cultural implementation.

      Lets talk about the benefit's:
      Developers: making software integration a nonevent, you can focus on what you love the most, which i assume is software development ;-)
      Release Management: Help create deploy able software multiple times in a day without waiting till the end of development sprint.
      Testers/QA: Enable testers / QA to do incremental testing.
      Managers: you can talk to customers with confidence and promise a working software.

      Continuous Compilation Vs Continuous Integration


      Image:continuous-ignorance.gif

      Lets do it right:

      The following questions will answer if we are doing our CI correctly:
      • All changes in code/db/conf pushed through SCM - cvs/subversion/mercurial/git
      • Is you project/module build automated - make/rake/ant + ivy/maven
      • Do you write/execute tests as part of build - junit/xunit/selenium
      • Do you have coding and design standards, if yes how are we enforcing it - checkstyle/pmd/jdepends in case of Java
      • Is the Integration machine separate from development machine - to ensure clean build(s)

      Question to be asked: Do we produce a usable software on every commit to code repository.


      More about Continuous Integration here

      This is part 1 from the series of discussion about continiuous integration. In the future article i will talk about tools that we use and how we automate !