Groovy Scripting

Sometime while importing large data, it’s required to process the data and transform it according to our needs. Doing this manually on all the CSV files is time-consuming and error-prone. However, Axelor Open Platform provides embed groovy scripting support to process/transform the data during the import process.

You can specify inline groovy expressions to process individual field value, provide default field value or can process the newly constructed data object. This should be specified in the mapping file like this:

<?xml version="1.0"?>
<csv-inputs xmlns="http://axelor.com/xml/ns/data-import"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://axelor.com/xml/ns/data-import
  https://axelor.com/xml/ns/data-import/data-import_6.0.xsd">

  ...
  ...

  <input file="sale-orders.csv" type="com.axelor.sale.db.Order"
    call="com.axelor.data.tests.Validators:validateSaleOrder">

    <!-- transform boolean value into 'true' or 'false' -->
    <bind column="confirmed" to="confirmed"
      eval="confirmed ==~ /^(T|Y|1)$/ ? 'true' : 'false'"/>

    ...
  </input>

</csv-inputs>

First, we can provide any method with call attribute to input tag to post-process the data object once it’s populated but before persisting to the database.

Here is an example groovy script:

import com.google.inject.Inject
import com.google.inject.Injector

import com.axelor.db.JpaSupport
import com.axelor.contact.db.Contact
import com.axelor.sale.service.SaleOrderService
import com.axelor.sale.db.Order

class Validators extends JpaSupport {

  @Inject
  SaleOrderService soService

  def validateSaleOrder(Object bean) {
    assert bean instanceof Order
    Order so = (Order) bean

    soService.validate(so)

    println("Date: $so.orderDate")
    println("Customer: $so.customer.firstName $so.customer.lastName")
    println("Items: $so.items.size")

    int count = all(Contact).count()
    assert count > 1

    return bean
  }
}

Second, you can specify simple groovy expression via eval attribute. This expression will be evaluated with the context of current CSV record’s (column name → value) map.

You can see that,

  • the values of column confirmed is processed to convert in valid boolean value.

  • default value for confirmDate is provided with groovy expression.