Showing posts with label enterprise systems. Show all posts
Showing posts with label enterprise systems. Show all posts

Tuesday, March 8, 2022

Managing "Counters" in Boomi process

Managing "Counters" in Boomi processBoomi is very powerful and good at what it does, but sometimes it isn't clear on how to achieve certain goals. Counting a string or an element is probably one of them.

I encountered a new business requirement, that in my Salesforce-NetSuite integration pipe, I had to distinguish single-line orders from multi-line orders, then tag single-line orders with a special flag.

After digging around the web, I was able to add a counter using:
1) Dynamic Process Property
2) Data Process Shape
3) Custom Scripting within Data Process Shape

Step 1. Configure Dynamic Process Property

First, you will need to add Set Properties shape to the canvas. Add a Dynamic Process Property and give it a name. I named it 'myCounter'.

There are two methods to start your counter - by setting the value to 0, or using the updated output of the variable with the default value of 0. In the latter case, do not forget to loop your data process shape back to Set Properties shape.



Step 2. Add Data Process Shape

Now, we will need to add a Data Process shape to the canvas. The shape itself should be fairly simple, but my use case made it more complicated, because my goal is to count the number of repeating elements within a single document. And thus, I had to add Split Documents processing step to break out documents first.

Step 3. Custom Scripting

The document is finally broken down into multiple documents using Split Documents method, so now it's time for me to get the document count. You can achieve this by using Custom Scripting processing step within Data Process shape.

The original code that Boomi provides with this configuration should not be erased or modified, but we should add our counter property to this script. The tricky part is that a Dynamic Process Property's value is a string while the counter is an integer, so we need some data conversion.

Below is the final output of the code where black is the default, and red is what I have added.


import java.util.Properties;
import java.io.InputStream;
import com.boomi.execution.ExecutionUtil; // import Boomi execution library

for(int i = 0; i < dataContext.getDataCount(); i++ ) {
    InputStream is = dataContext.getStream(i);
    Properties props = dataContext.getProperties(i);
 
    // Retrieve the current myCounter value
    myCounterValue = ExecutionUtil.getDynamicProcessProperty("myCounter");
    
    // Convert myCounterValue to an integer
    int myCounterInt = Integer.parseInt(myCounterValue);
    boolean_variable = true;
    
    // Increment value by 1
    myCounterInt = myCounterInt + 1;
    
    // Convert int value back to string
    myCounterValue = Integer.toString(myCounterInt);
    
    // Set Counter
    ExecutionUtil.setDynamicProcessProperty("myCounter", myCounterValue,boolean_variable);

    dataContext.storeStream(is, props);
}

Please let me know how this worked out. If you have a better method of using counters in Boomi, please share with us!








Inventory Level Search

As I deal with users from outside of accounting & finance teams, I heard many complaints around inventory reports. For accounting & finance people whose main focus may be on the valuation of the inventory and reconciliation, inventory reports that NetSuite provides out of box may be well sufficient.

However, people who are in charge of business units that rely on the inventory throughout multiple locations, they find NetSuite's report not friendly at all, and I personally find this issue especially for operations management or hardware repair environments with large inventory (the specific organization I am referring to held more than $2MM+ worth of inventory in only one of the warehouses).



Also, one interesting issue is that if you are a long-time NetSuite customer, if you inactivated items that had inventory on hand, then it is almost impossible to reconcile quantity on hands to the inventory valuation report (although I believe NetSuite had filed defect and changed behavior maybe around 2015 or 2016, so that when you inactivate an item, all the inventory information is wiped out, instead of preventing users from inactivating items with inventory on hand - what a great workaround).

I am adding a few SQL formulas you can use on your item saved search, which can help you to generate the report you may need. If you are interested in some more examples, please let me know - I will be more than glad to investigate and share the information with you!

But frankly speaking, NetSuite's SuiteAnalytics came along such a long way that you probably don't need to use SQL but use enhanced search fields such as Inventory Details Fields...

I find this usually helpful, because if the inventory was never touching a location, then the quantity is NULL, not 0, so you can easily exclude items that you will never see at a certain location by using below formula as criteria and results:

Formula (Numeric) > not equal to 0 > Formula: NVL(DECODE({inventorylocation},'location name',NVL({location.quantityonhand},0)), 0)

Also, you can use the formula below to see any item that currently has a PO issued:

Formula (Numeric) > not equal to 0 > Formula: NVL(DECODE({inventorylocation},'location name',NVL({location.quantityonorder},0)), 0)

Of course, you will need to adjust results, and creating the results page may be more painful than it may sound. We will simply have to create each column for each location using Formula (Text) fields.

Formula (Numeric) > not equal to 0 > Formula: NVL(DECODE({inventorylocation},'location name',NVL({location.quantityonhand},0)), 0)

To make it more interesting, you can also add multiple formula fields to get results that you need:

Formula (Numeric) > Formula: NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantityonhand},0)),0) > Custom Label: Location 1 Quantity on Hand
Formula (Numeric) > Formula: NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantityonorder},0)),0) > Custom Label: Location 1 Quantity on Order
Formula (Numeric) > Formula: NVL(DECODE({inventorylocation},'Location 2 Name',NVL({locationquantityonhand},0)),0) > Custom Label: Location 2 Quantity on Hand
Formula (Numeric) > Formula: NVL(DECODE({inventorylocation},'Location 2 Name',NVL({locationquantityonorder},0)),0) > Custom Label: Location 2 Quantity on Order

Or, if you are a supply chain manager and would like to review the reorder points or preferred stock level, you may replace {locationquantityonorder} variable with {locationreorderpoint} or {locationpreferrestocklevel}.

So, here is my question back to you. If you are an operations director - or maybe a consultant or administrator helping out the operations director - how would you build the search so that your current stock and POs are enough to the orders outstanding?

I used to have a solution at my previous employer but not anymore due to the lack of test data to play with... but I will post my answer below. If this formula does not work, please let me know and I'll work in the sandbox get the test data generated and review the formula myself!







MY ANSWER:
Once you built the criteria you need, below is the formula I will use:

Formula (Numeric) > Formula: (NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantityonhand},0)),0) +  NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantityonhand},0)),0)) - (NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantitycommitted},0)),0) + NVL(DECODE({inventorylocation},'Location 1 Name',NVL({locationquantitybackordered},0)),0)) 

Then I will go to Highlighting tab, add the exact same formula to the condition to flag any items that may run into inventory issues!



I hope this post helps you with inventory reporting issues you may have at your organization. What are some of the other key challenges you encounter from day-to-day usage of NetSuite? I'm waiting to hear from you!

Thursday, October 11, 2018

NetSuite ODBC and JDBC via DBeaver

In a new data warehousing project that I'm involved with, I ran into some challenges connecting to and pulling data from NetSuite ODBC server using SuiteAnalytics Connect. It was quite a journey to finally find the right tool, as many SQL Clients - including the one from Oracle and Microsoft - were not as robust and flexible to connect to NetSuite's ODBC.

After digging around, I found an "Universal Database Tool" called "DBeaver" that is free for developers, SQL programmers, database administrators and analysts. It was very flexible that I could connect to any database if I had the JDBC available.

And I wanted to share these steps (as detailed as possible), hoping that no one else runs into the issues I had and waste so much time.

These steps are based on MacOS, but it's not very different on Windows either. If you need the guide to connect to NetSuite using DBeaver on Windows, please let me know.


1) Download and install DBeaver Community from https://dbeaver.io/

2) Download and install SuiteAnalytics Connect - refer to SuiteAnswers article 38965 and related topics. I downloaded and extracted JDBC for MacOS since ODBC isn't available.

3) Launch DBeaver Community. We need to add NetSuite driver. Go to Database > Driver Manager, and click New.

4) Give it a proper name and description. Set Class Name to com.netsuite.jdbc.openaccess.OpenAccessDriver and leave the URL Template and Default Port blank. Click "Add File" and choose the NQjc.jar file that was extracted from step 2). Click OK.



5) Once the driver is added, you can hit OK to exit from the driver manager window. Click on New Connection or go to Database > New Connection. Select the driver you created in step 4), and hit Next.

6) Enter below URL to JDBC URL field, and add your user name and password. Account Id and Role Id can be found on "Set Up SuiteAnalytics Connect" page.

jdbc:ns://odbcserver.na1.netsuite.com:1708;ServerDataSource=NetSuite.com;encrypted=1;Ciphersuites=TLS_RSA_WITH_AES_128_CBC_SHA;CustomProperties=(AccountID={accountId};RoleID={roleId})



7) When you click on Test Connection... you will see a Success box if things went well!




Monday, April 28, 2014

NetSuite - Kit Items, Item Groups. Assembly Items (for Work Orders), and Configured Items?

My work is currently going through the scoping process of integrating a new business unit, and the bad thing is - everyone is lost.

The headache is caused by multiple systems that my company and the new business unit carry.

While we use NetSuite OneWorld as CRM (which is somewhat waste) and Infor Visual Manufacturing for backend ERP, the new business unit uses an Excel spreadsheet (if I heard correctly) with a home-grown validation tool, then uploads the spreadsheet into JDE for drop ship and/or manufacturing orders.

The challenge comes in because as manufacturing companies, both "configure" items to sell. And now, the operations team from my company started showing the configurator tool CSRs use, then the new BU people started explaining their configuration process.

Well, the business people may have had more discussion and probably understand the issue better than I do, but hold on, what the heck is a configured item, really? My one hour was almost completely wasted - lucky that I was able to wrap up my thoughts in my head.

The term configured item is used in various ways, but in manufacturing I believe a configured item is basically some sort of a finished good that can be built from multiple component and/or raw items. For example, a desktop can be a configured item with independent parts (but that can be different combination based on customer's needs).

So, with that in mind, the very basic task I am assigned is to 1) load the component items, then 2) have a way for the new BU sales people and order entry people to configure the finished good. Whole lot better to understand than the hour spent to explain what's really going on.

With above in mind, I immediately thought of supported item types in NetSuite - Kit/Package, Item Groups, Assembly Items and maybe Matrix Items. Matrix item, however, may be out of scope because the ultimate finished good will not be a single item. (NetSuite provides an example of selling T-Shirts with different color and size combinations). So, what are these item types?

1. Kit/Package Item
Kit items are sold together as one unit. You can have parts A, B, C, D, and E to form a kit item 1. The issue here is that if kit item 1 is added to the transaction, it lists parts A, B, C, D, and E that cannot be replaced (or kit items cannot be sold/fulfilled or purchased separately), while each individual part's expense account is respected, and each component is also displayed as line items in transactions.

2. Item Groups
Item groups are similar to kit items, except the component can be changed. This means that the specific group of items can be modified and/or removed during the order entry. Hmm... doesn't this sound like configuration? This is a manual order entry, but isn't configuration manual anyway? I'll probably have to bring this up to my meeting.

3. Assembly Items
I'm fairly new to NetSuite, and I can't tell whether assembly items ever existed or not. But, this is definitely an important item type that is needed in order to process a manufacturing work order. And what kind of ERP can NetSuite be, without providing the manufacturing work order module? Assembly items are actually the finished goods which need component to be added to item. However, if I remember correctly, each assembly item always carried the exact same quantity and exact same parts in order to create one. However, this will allow the company to track the inventory at component part too.

Just to get the new users up and rolling, I will definitely start with the Item Group, as Item Group is probably the easiest way to pull the standard list of parts then to configure, while I still believe entering the line items one by one without any kit, group or assembly, can be a perfect configurator to meet the new BU's needs.

Sunday, September 8, 2013

'What the heck is Case Iron?'

At my current job, we use IBM's Cast Iron as the integration middleware, and we do encounter many exchange/integration issues (not from Cast Iron's fault though).

And, to say a bit about my career, after college graduation, I've been in a software company's support environment, where we had a "case" for each 'incident'.

For my first job/1-tier, I've probably processed 30 cases a day, and doing a rough math, that's about 7,200 cases a year. Yup, that's a lot.

When I moved on, I still processed (includes closing and escalating) 400+ cases a year. And I stayed at this company for 4.5 years, so imagine how many times I've typed the word "case".

Now, whenever I type an 's', I have a habit of typing 'se' automatically, such as gas -> gase.... and it gets worse when I try to inform people of "cast iron" issues/updates at work. Often times I deal with end users and my peers, but very regularly I interact with managers and directors as well, and the problem comes that I still type "Case Iron" instead of "Cast Iron".

People (they know the mistake already) often asks me with the smile in their face:
"What the heck is Case Iron?"

My response:
"You know...."

Monday, August 12, 2013

BA vs. SA, and BSA?

It seems that the title "Business Systems Analyst" is getting more popular these days.  And many people could be curious about differences between Business Analyst, Systems Analyst and Business Analyst.

And of course, what we consider as Business Analysts these days are technically IT Business Analysts, and the old traditional Business Analysts are business and finance acumen.

What are differences between BA, SA and BSA? Bottom line - it really depends on the employer.

To briefly explain, one of my past employers has three teams that were competing on the same turf: Change Management team that acted as a PMO with a few IT Business Business Analysts, Enterprise Applications team that managed business applications and systems with a few "Information Systems Analysts" which are equivalent to BSA, and Development & Integration team that had a few developers.

If you simply say Systems Analyst, the duties and responsibilities are probably more suitable for traditional systems and infrastructure (such as networking, servers, etc.).

An IT Business Analyst is supposed to be the analysis expert - gathering translating business requirements into technical details and features, or extract the data from systems and transform it in a consumable format for the business. The truth is, I never liked worked with BAs. They usually don't carry any technical or technology knowledge, although some of them are really good at researching and understanding.

So, what is a Business Systems Analyst? In short, a BSA is a systems muscle with business brain. A BSA carries the mindset of a business analyst with the skillset of a systems analyst, but specifically for business applications.

A BSA is a get-your-hand-dirty job. S/he will perform the analysis of learning a business process or operations, gathering requirements for changes in the business applications or a new features (whether custom or add-on), make such changes on her/his own or with external help, develop test plans and guide the business to test them, and then finally implement - of course, on top of day-to-day operations support & troubleshooting.

Because a typical BSA job includes micro-project management, I personally find it very difficult for a team of BA and a team of BSA to work along well.

It is not rare that a BSA will work inside VMs that SEs and SAs may set up, and manage applications that reside on servers. But in today's environment, there are a lot of "cloud" business applications. In my personal work environment, managing a VM instance is very minimal.

If you are seeking advice whether to become a BSA or not, I can tell you that I enjoy working as a BSA.

Tuesday, May 28, 2013

Outlook Connector for NetSuite

Our NetSuite team has a notorious project that has been hanging for past 2.5 years or so, if I heard my predecessors correctly.

The project is enhance NetSuite so that it is easier for our operations and service force to easily communicate with customers and contacts on a specific case or a transaction. The company has spent $$$$ on a 3rd party consulting firm, and the project seemed to come to an end. Yet, NetSuite did not have the ability for us to finish it off :(

Unsure when it started, but NetSuite, partnering with Celigo, came up with an MS Outlook add-in, which will allow a NetSuite user to log into the server via this add-in, then load the information to Outlook.

This is still at a beta phase, and I have no idea when this thing will be fully live. I've tested the feature for about 2 weeks, then finally pushed out to the distribution environment last Friday.

Our company does have a lot of customization and custom lists/records as well as user events, etc., but this bundle did not interfere with any of our customization (luckily).

Once the bundle is pushed out, and the add-in is installed on the client, users can notice a little side-pane on the right side of the new message window.


When the user starts typing the recipient name/email address, and if the NetSuite contacts are in sync to Outlook, it starts looking for related records and transactions within NetSuite and automatically populates them in NS4Outlook pane.



For the administrators who are afraid of Outlook data messing up the server data:
This bundle is capable of defining the scope of sync: 2-way, NS2Outlook or Outlook2NS, so there would not be much issue, as long as NS2Outlook is selected, and client is frequently backed up.

To me, this is still a beta product that does what it was designed to do. However, there are much more that can be (or more like needed to me) added into in order to make it more powerful (or more like usable to me). Hopefully, this can become a piece of program that will fit into our needs.


Tuesday, April 2, 2013

alternative to the word "SLA"

If you are in some sort of IT and/or customer service related job function, I'm pretty sure that you are familiar with the term "SLA", or Service Level Agreements.

It basically means that one party (supplier/vendor) will guarantee certain response time to the other party (customer) when a support call is logged. There are some vendors who are stupid enough to guarantee a resolution time, even though general IT people would rather want to have an SLA based on resolution time, not response time.

Anyway, within my group, people like to use the term "SLA" to the business, but my new boss hates this word. I come from a technical support background, so SLA does not sound too negative.However, I agree with my boss that this term makes the IT team feel like a 3rd party consultants/vendors.

What really sucks is that there is no word to replace SLA..... and I just called it "IS Support Terms". if anyone knows a better term, please let me know?