The New RIO Inventory 3.2

Hello folks, thanks for your support with RIO Inventory all these years. We are pleased to present to you our latest release, version 3.2. You asked and we delivered, this release now has the following important features:

  • Inventory batching
  • Serialised inventory
  • Picking slips
  • Ability to transfer inventory between warehouses

These features allow you to manage your inventory better in Salesforce, especially when it comes to multiple warehouses inventory management. Feel free to take a look at this page for more details on how this can help with your daily inventory management.

If you are new, don’t worry. You can always install the app into your sandbox or developer instance via AppExchange and feel the zen.

For more other goodies in 3.2, please visit our release notes.  Want new features?  Please let us know, you can contact us at

Wedid:BCI Data Modelling in SF


Data intelligence and leads coming from BCI are the core sales opportunity in the business of our chemical construction site service customer.

These leads are externally provisioned through CSV files and it needs to be tracked in Salesforce so that it can blend into other business data. The convergence of these data will help the customer form a powerful source of report in the forecast and finance area.

The current challenge is these data are residing out of Salesforce system.


  1. Review through the files given by BCI and review the data that need to be in Salesforce
  2. Identified the core objects – Project, Firm, Contact, Contact Role
  3. Work through a model to connect these objects as part of Standard/Custom object and link with Opportunity to track any finance information
Related Objects Account, Contact, Project (CO), Opportunity, Opportunity Contact Role
Components Data modelling
Complexity Low

Salesforce: Check Null/Empty Value of A Field

In Salesforce, it is very common that we build formula field, validation rule or workflow rules to act on the data of a field and sometimes we would like to validate on an empty value. In Salesforce formula editor, there are two functions: ISBLANK() and ISNULL(). The question here is, which is the correct one that we should use?


This is an old function that works with most of the field types except Text, Text Area and Long Text. (reference)


This is a new function that Salesforce introduce to support the empty field validation on Text fields. It also works with other field types. According to Salesforce documentation, it is recommended to use this function instead. (reference)

Please note that if you are referencing a formula field with the option “Treat blank fields as zeroes”, the formula field will give value zero and won’t be considered as null.

Above is how you can validate an empty field in formula editor. How can we achieve the same in Apex?

Text Fields

There are a few options to validate empty text fields in Apex:

Use String.isBlank() method. This will return true if the text field is empty.
Compare the text field to an empty string, e.g, Account.Name == ”. You shouldn’t use NULL as text field in Salesforce is never considered NULL. Note that String variable can still be considered NULL.

Checkbox Fields

This can be compared by using TRUE or FALSE. This is because an unchecked checkbox field is considered as FALSE instead of NULL.

Other Fields

You should compare the field value to a NULL.

WDCi Is Hiring in Caloundra

Who are we?

  • We are an IT consulting firm that specialise in the platform.
  • We do Architecture, Implementation, Product Development and Support.
  • In addition to Salesforce we deliver Data Integration and Data Migration services using Dell’s Boomi platform.
  • We have offices in Sydney, Caloundra and Kuala Lumpur. We are hiring in Caloundra.

Who are we hiring?

  • Support Engineer (s) – 1 x graduate level, 1 x with some experience.
  • A graduate Developer – ideal for a new IT graduate looking for a development role.

How do I apply?


  • Send us an Email or visit our office upstairs in the Suncity Centre at 74 Bulcock St.

CASE STUDY: Sales and Asset Tracking

Waringa Distribution ( and    imports, sells and distributes the Agri-Spread range of Spreaders and Elmer’s range of Chaser Bins and Transfer Tracks.

1600 Bushel HaulMaster Agrispreader256


There was a requirement to implement a solution that met the following criteria:

  1. Ability to retire the excel based and access based solution that was in place.
  2. A cloud solution accessible from anywhere.
  3. Ability to track Agri Spreaders and Chaser Bins that are sold by Distributors or sold directly – in multiple countries.
  4. Ability to track machine level detail, including location and warranty details.


Waringa Distribution chose to implement Salesforce.  WDCi was engaged to customise Salesforce to store the above information and provide reporting information on the data in Salesforce.

The recent upgrade to licensing for Professional Edition also allowed for the ability to use record types to segregate sales for AgriSpreaders and Chaser Bins.

The components of the solution were:

  • Salesforce Professional Edition.
  • Customisations to store detailed Machine and Distributor information.
  • The build of a configuration tool to configure the spreader to customer requirements.
  • Tracking of orders from manufacturer to consumer.
  • Asset information, including the tracking of  warranty status for the asset.  
  • Case management to track warranty issues.

Lyndon Crudeli, General Manager of Waringa Distribution noted that “Implementing Salesforce has enabled Waringa Distribution to continue to expand our business and provide a platform that will enable continuous growth to happen.”

We Did: WordPress WooCommerce and Netsuite


Customer is hosting a website where visitor are allow to register and login. Visitor and existing users are allow to make purchase through the website too but the transactions and payment would need to be tracked through Netsuite.


Purpose To sync product, website users and sales transaction between website (WordPress WooCommerce) and Netsuite
Applications WordPress (WooCommerce)
Versions WordPress
Tool Boomi
Information Netsuite Non-Inventory Sales Item > Woocommerce Product
Woocommerce User > Netsuite Customer
Netsuite Customer > Woocommerce User
Woocommerce Orders > Netsuite Sales Order
Netsuite Sales Order > Woocommerce Orders
Data Formats JSON and XML
Volumes ~100/day
Process When customer register a login through website, customer information needs to be stored in Netsuite as well. When a items are added and maintained in Netsuite, the product needs to be made available in the website for people to purchase. And when customer make a purchase through website, the transaction needs to be in returned tracked in Netsuite for shipping and reporting purposes.
Schedule Every 2 minutes
Complexity Medium

Salesforce: Visualforce CommandButton to Bypass Validation/Required Fields

In Visualforce apex:CommandButton component, there is an attribute called “immediate” that allows us to invoke the controller action bypassing the validation rules associated with the fields (especially those that mark with required=”true”) in a visualforce page. I have been using this attribute alongside with the cancel button which does not required any input from users. Until recently, I noticed that the attribute no longer working as expected in one of my visualforce page development. For example:

<apex:page standardController="Account" extensions="AccountExt" standardStylesheets="true" applyBodyTag="false" docType="html-5.0" title="My Wizard">
	<apex:form id="theform" >
		<apex:pageBlockButtons >
			<apex:commandButton value="Cancel" action="{!cancel}" immediate="true"/>
			<apex:commandButton value="Search" action="{!doSearch}" />
		</apex:pageBlockButtons >
		<apex:pageBlockSection title="Test">
			<apex:inputfield value="{!account.Type__c}" required="true"/>

After some research, I realised this is actually related to the behavior in HTML 5 (doctType=”html-5.0″) where it will automatically validate all the required fields that I have in a form. So, how can we overcome this?

Option 1 (Form level)

You can set an HTML 5 attribute called html-novalidate=”novalidate” at the form level. However, this will disable the validation for all buttons. You should only use this if you have your own validation logic implementation in the controller/extension class.

<apex:form id="theform" html-novalidate="novalidate" >

Option 2 (Button level)

You can have the similar attribute next to the command button to disable the validation on the button specifically.

<apex:commandButton value="Cancel" action="{!cancel}" immediate="true" html-formnovalidate="formnovalidate" />

This is a better option to go for as we do not need to worry about implementing the additional logic to validate the user input.

Triggering Salesforce Workflow/Process Builder when record is deleted

As of to date, Salesforce does not provide an object’s isDeleted flag as a filter criteria through workflow rule or process builder. This may lead to the option of utilising Apex Triggers if a requirement is to perform certain action when a record is deleted.

However, triggering a process builder/workflow is still possible when a record is deleted. Please consider the following criteria prior to designing your workflow or process builder in this case:-

  • the target object (to update field or to do something about it) is a parent to the deleted record
  • the target object and the deleted record is in master-detail relationship
  • the target object has capacity for additional roll-up summary field

Take Account-Opportunity for example. You may want to perform an action (i.e. update a field, send email alert, etc.) on the account where when one of its opportunity is deleted. As an alternative to utilise Apex Triggers, following are the steps that you may consider as a workaround to utilise Salesforce workflow/process builder instead:

  1. Create a roll-up summary field in account that counts the total opportunities which the account belongs to. In this example, we call it “Total_Opportunities__c”
  2. Define a workflow or process builder and utilise the evaluation criteria of “created, and every time it’s edited”
  3. Use the rule criteria of “Formula evaluates to true”
  4. Compile a formula which compares if the current “Total_Opportunities__c” is lower than the priorvalue. For example ${the_Roll_Up_Summary_Field} < PRIORVALUE(${the_Roll_Up_Summary_Field})
  5. Followed by the intended actions at the parent level

Wedid: Salesforce Skedulo Case Integration


This companies main revenue source is derived from the repair services and additional products they provide to the commercial and residential business.

The technicians are required to repair items, keep track of replacement products issued to the customers, collect signatures, take images of the issues found, advise the next technician to onsite of the job requirements and what they foresee the next technician will be required to complete.

The challenge for this solution was that there would be up to 3 job visits, each job visit containing data that would need to be passed from one technician to another, without any phone or email communication.


In the case, we used Apex trigger in conjunction with Skedulo and a custom Visualforce page to send the user to the Skedulo Web Browser for scheduling.

We used standard and custom fields created in Salesforce and Skedulo to capture some of the following data:

  • Products used
  • WHS issues identified or not
  • Signature Collected
  • Marketing Questions answered
  • Contact Details checked and updated
  • Images of site collected
  • Any expenses

There was a two-way sync with different trigger points between Skedulo and Salesforce allowing the data to flow back and forth.

Integrating the case with Skedulo enabled the client to automate communication between their field technicians and administration staff, reduce the paperwork created from each job, have a live status update running on each job/case for an enriched customer service and communication experience.

Related Objects Case, Skedulo Job, Product, Pricebook, Pricebook Entry
Components VisualForce, Trigger
Complexity Medium

Wedid: Custom CPQ


This company earns their revenues through providing services and lab products.

Currently, all the product details e.g selling prices, promo prices are stored in different external systems. These details are not available in Salesforce.

The sales team will need to manually check for product details – product prices from different systems before adding them into the Salesforce quote. This is causing a massive backlog in the quoting process and the company is looking for a solution to expedite the process.

For example:

  1. User is going to propose Product A.
  2. The user logs in to system A to check for the selling price for Product A.
  3. Then, the user logs in to system B to check for the promo price (if any) for Product A.
  4. Once confirmed, the user includes Product A as line item in the quote.


  1. Create a custom page in Salesforce that allows user to search for the products.
  2. Using integration and web service calls, allow user to search for the prices of the selected products from both systems through the same custom page in Salesforce.
  3. From the price search results, user can proceed by creating a quote and and quote line items.
Related Objects Product, Pricebook, Pricebook Entry, Opportunity, Opportunity Product, Quote, Quote Line Item
Components/App VisualForce, Trigger

Web Service Calls base code generated via WSDL2Apex then further modified to suit the need.

Complexity Difficult

Challenge encountered as the initial WSDL file was not compliant with WSDL2Apex requirement and necessitated adjustment before it can be parsed by WSDL2Apex.