Monday, March 28, 2011

OpenERP Support Helpdesk for Functional and Technical Help

OpenERP Support Helpdesk for Functional and Technical Help


Pragmatic has launched a telephonic and Email Helpdesk support for OpenERP for 
both Technical and Functional/User areas. Please note that this is not an alternative to 
OPW Publishers warranty provided by OpenERP. It is meant to solve practical issues
 faced by companies while configuring and using OpenERP. This support involves
 helping potentially companies who are using OpenERP and need someone whom they 
can call and get help with their running systems.

Pragmatic Advantage

  • OpenERP Experts with in-depth understanding of technical and functional aspects of OpenERP
  • Experience staff involved in large OpenERP implementations spanning over 6-10 months
  • In depth understanding of OpenERP server Setup, Configuration, Customization, Module migration, Data Migration ETL and advanced reporting Business Intelligence tools
Our Helpdesk support is based on Ticket basis. Each ticket is an issue which could be solved in 1 hour of time or less.
Currently we are supporting Europe, Africa, Moddle-East and Asia Pacific You can reach us at E-mail or skype us: pragtech

Our plans are as follows:

    Features Premium
    Support limit
    • 8 tickets every month

    • 5 tickets every month
    • 5X8

    • 5X8
    Contact Means
    • Voice
    • Email

    • Email
    Turnaround time
    • Reaction time: 4 hours
    • Issue Resolution time: 3 day

    • Reaction time: 1 day
    • Issue Resolution time: 5 days
    Pricing Skype us: pragtech
    Email: e-mail address is being protected from spambots. You need JavaScript enabled to view it
    Skype us: pragtech
    Email: e-mail address is being protected from spambots. You need JavaScript enabled to view it

Friday, March 18, 2011

Application Integration and Synchronization using Talend Web and Data Integration suite for OpenERP

Application Integration is generally a complex process as it involves connecting two different pieces of software. These software could be written in different programming languages with different databases. Also they may or may not have an API or web services layer using SOAP/REST API's. Integrating and synchronizing data between the applications is tedious process as it involves writing custom connectors for the integration. Also these connectors are brittle as any minor changes in the API or code can break them.

Web and Data Integration using tools usch as Talend presents a better way to connect and synchronize two application wanting to share and synchronize data between them. The process involves mapping the database files between applications, witing transformations  or a Web services layer could be created to do the synchronization. We have created a simple connector for demonstration purpose between OpenERP and Joomla using Talend. The same approach could be used for connecting OpenERP with Magento, SugarCRM, VTigerCRM and other

Joomla ! and OpenERP Integration Screencast

Monday, March 14, 2011

Things to note while migrating OpenERP 5 modules to OpenERP 6 (OpenERP 5 to OpenERP 6 Module Migration)

Pragmatic Techsoft Pvt Ltd. ( has put forward a list of technical changes which need to be taken care while migrating modules from OpenERP 5 to OpenERP 6. This list is no way comprehensive and comments and feedback are welcome.


OpenERP V5
1. Both normal and memory wizards are used.
2. Normal Wizard created by single .py file, which is created in wizard folder of our module.
3. To call normal wizard we need following code in .xml file which is outside the wizard folder.
            string="Student Detail"/>

4. To call memory wizard we need following code in .xml file which is outside the wizard folder. If we call wizard on button.
<button name="%(act_student_memory_wizard)d" string="Memory Wizard" type="action"/>
OpenERP V6
1. Only memory wizards are used.
2. Wizard in V6 is similar to memory wizard in V5.
3. To call wizard we need following code in .xml file which is outside the wizard folder. If we call wizard on button.
<button name="%(student.act_student_memory_wizard)d" string="Memory Wizard" type="action"/>
4. if we call the wizard through Action menu then we need following code to call given wizard
<act_window name="Student Detail"

Search views

OpenERP V5:
1. The only facility of search is there in list view(treeview).
OpenERP V6:
1. Improves over built-in search features in v5
2. Always associated with other view: list, calendar, ...
New view type: <search>
    Two main building blocks:
        • <field name='...'>
        • <filter domain='...' context='...'>
    Structured with:
        • <group>
        • <separator>
        • <newline>
No need of select=”1” or select=”2”,just need select=”True”

<record id="view_sales_order_filter" model="ir.ui.view">
            <field name="name"></field>
            <field name="model">sale.order</field>
            <field name="type">search</field>
            <field name="arch" type="xml">
                <search string="Search Sales Order">
                    <filter icon="terp-document-new" string="Quotations" domain="[('state','=','draft')]" help="Sales Order that haven't yet been confirmed"/>
                    <filter icon="terp-check" string="Sales" domain="[('state','in',('manual','progress'))]"/>
                    <separator orientation="vertical"/>
                    <filter icon="terp-dolar_ok!" string="To Invoice" domain="[('state','=','manual')]" help="Sales Order ready to be invoiced"/>
                    <separator orientation="vertical"/>
                    <field name="name" select="1"/>
                    <field name="date_order" select="1" string="Order date" />
                    <field name="partner_id" select="1"/>
                    <field name="user_id" select="1">
                        <filter domain="[('user_id','=',uid)]" help="My Sale Orders" icon="terp-personal"/>
                    <group expand="0" string="Group By..." colspan="11" col="11" groups="base.group_extended">
                        <filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
                        <filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
                        <separator orientation="vertical"/>
                        <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                        <separator orientation="vertical"/>
                        <filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>

<record id="action_order_form" model="ir.actions.act_window">
            <field name="name">Sales Orders</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">sale.order</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form,calendar,graph</field>
            <field name="search_view_id" ref="view_sales_order_filter"/>
            <field name="help">Sales Orders helps you manage quotations and orders done with your customers. OpenERP suggests that you to start by creating a quotation. Once the order is confirmed, the quotation is converted into a Sale Order. OpenERP can handle several types of products so that a sales order can trigger tasks, delivery orders, manufacturing orders, purchases and so on. Based on the configuration of the sale order, a draft invoice will be generated so that you just have to confirm it when you want to bill your customer.</field>
        <menuitem action="action_order_form" id="menu_sale_order" parent="base.menu_sales" sequence="3" groups="base.group_sale_salesman,base.group_sale_manager"/>

<fields> with embedded <filters>
    Advanced attributes for <field>:
    • context=”{'country_visible':True}”
    • domain=”[('country_id', '=', 'Belgium')]”
    • filter_domain=”['|', ('location_to', '=', self),
                        ('location_src', '=', self)]”
    Default values for filters and fields, via action context:
    • context=”{'search_default_filter1': True}”
    • context=”{'search_default_field1': 'test'}”
    • context=”{'search_default_field1': lang}”
    Specific search view can be forced in caller action:

<field name="search_view_id" ref="view_sales_order_filter"/>
context attribute of elements can toggle aggregation of associated list views
<filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
Multiple group-by levels are supported
    • <filter string="Salesman,State"
    Order of group-by entries matters!

Tree Views

Openerp V5:
1. Normal Tree view is there.
2. We can edit data in columns in tree view, but no buttons are theire to process on selected row.

Openerp V6:
1. List views can now display buttons
        Regular <button> elements as in form views
            Action/Method/Workflow called on single record

    2. Columns can be toggled via context
        • context = {'section_mode': True}
    • <field name=”country_id”

Diagram views

OpenERP V5:
1. No diagram view is theire.
2. But we can see similar to it in customized workflow

OpenERP V6:
New <diagram> view type
Constructed with
    • <node object=”node.model”
    • <arrow object=”transition.model”
                destination=”dest_field” >
    • <field> (included in quick view)
Objects must form a coherent graph
<node> model must have a many2one to its container

<record id="view_marketing_campaign_diagram" model="ir.ui.view">
        <field name="name">marketing.campaign.diagram</field>
        <field name="model">marketing.campaign</field>
        <field name="type">diagram</field>
        <field name="arch" type="xml">
            <diagram string="Campaign Editor">
                <node object="marketing.campaign.activity" shape="rectangle:type=='subcampaign'" bgcolor="gray:start==True">
                    <field name="name"/>
                    <field name="type"/>
                    <field name="start" invisible="1"/>
                    <field name="condition" widget="char"/>
                <arrow object="marketing.campaign.transition" source="activity_from_id" destination="activity_to_id" label="['name']">
                    <field name="activity_from_id"/>
                    <field name="activity_to_id"/>
                    <field name="interval_nbr"/>
                    <field name="interval_type"/>

Testing framework: YAML

OpenERP V5:
1. No such Testing framework(.YAML) file used in it.
OpenERP V6:
1. New YAML data serialization supported in v6
2. Data-oriented syntax “YAML Ain't a Markup Language”
3. Whitespace delimiters, Python-like
        no quotes, brackets, braces, ... by default
    Supports everything supported by XML and more
        Calling internal service such as workflows
            Arbitrary python code
4. When added to the test section of the module descriptor, tests are rolled back by default
    New logging level test for showing test results

    OpenERP supports specific custom types:
    • !record {model: res_model, id: xml_id, context: {...} }
    • !python {model: res_model}
    • !workflow {model:res_model, action:signal, ref: xml_id}
    And equivalents for all XML supported elements
    • !act_window
    • !report
    • !function
    • !menuitem
    • !assert

In order to test Account Journal Select wizard I open journal entries using this wizard
    !record {model:, id: account_journal_select_0}:
    I clicked on Open Journal Button to open the entries

    !python {model:}: |
    self.action_open_window(cr, uid, [ref("account_journal_select_0")], {"lang":
     'en_US', "active_model": "account.journal.period", "active_ids": [ref("account.a_recv")],
     "tz": False, "active_id": ref("account.a_recv"), })
    I check that the entries open successfully

Other Improvements

OpenERP V5:
1.Simpler __terp__ structure: data, demo

2. Security:
        Private _methods() are callable via RPC
        def _foo(self):
        print “hi all “
3. class for res.partner.function object is present.

OpenERP V6:
1. Simpler __openerp__ structure: data, demo, test

2. API:
        _defaults may be literal
        _constraints, _sql_constraints may be callables
3. Security:
        safe_eval replaced built-in eval
        Private _methods() not callable via RPC
        def _foo(self):
        print “hi all “
        1. if you try to call this method on button ,it will not allow you
            2. so solution for this problem is that do not define function start with _(underscore).

4. Reporting engine more modular (e.g report_webkit)

5. Performance improvements in RML reports
    <blockTable rowHeights="2cm" colWidths="11.0,7.0">
    Smarter translations, cached
6. Actions have new properties:
    help="Business description for this action"
7. Simpler XML declaration for wizards actions
    res.roles => res.groups

8. base_report_designer includes OOo plugin

9. 'View logs' shows XML ID now

10. class for res.partner.function object is not not V6 replace by char field.

Action Help

Openerp V5:
1. There is no facility of help regarding action

Openerp V6:
1. you can specify help of action by following way
<record id="action_tax_code_tree" model="ir.actions.act_window">
            <field name="name">Chart of Taxes</field>
            <field name="res_model"></field>
            <field name="domain">[('parent_id','=',False)]</field>
            <field name="view_type">tree</field>
            <field name="view_id" ref="view_tax_code_tree"/>
            <field name="help">The chart of taxes is used to generate your periodic tax statement. You will see here the taxes with codes related to your legal statement according to your country.</field>