Wednesday, 26 October 2016

Alter GL Transaction during Inventory Release

Hi All

Today I want to share with you one of possible ways how you can catch the process how Inventory release created a GL Batch and GL Transactions.

Lets assume that we want to change description or Sub-Account during inventory receipt release, than i need to do following things:

  1. Create extension of INReleaseProcess, that is responsible for release operation.
  2. Override ReleaseDocProc, that is doing main release job.
  3. In this method we have links to JournalEntry and INRegister, where we can check what is going on and add some additional logic
  4. Add RowInserting event to JournalEntry that will handle creation of batch or tran
  5. Change description or sub-account where it is required

In the end you have exactly required batch.

Code snippet:

Have a nice Development!

Thursday, 20 October 2016

Encrypted batch payment file (ACH, GIRO)

Hi All,

In Acumatica you can easily generate electronic payment files (such as ACH, GIRO and others). By using this process you will have a file that will have payment amounts and other required information.
But what about data protection? Bu default payment file will have clear text amounts.
Today i want to share with you how you can easily encrypt this file.
electronic payment files acumatica

Payment file will be generated by Acumatica Integration Services Export Scenario. The main class that is responsible for generation file is Integration Services Data Provider. In Acumatica out of the box we have only 2 providers : ACH and GIRO.

In my Example i will show you standard .NET encryption using Triple DES encryption.

  1. Using customization module create a new provider and inherit it from from base provider (ACHProvider or GIROPaymentProvider).
  2. Override SetFile method.
  3. Put your encryption logic there.
  4. Publish customization.
  5. create a new provider in  acumatica
  6. Use new provider type in the export provider. Do not forget to update provider object and fields when you changing type. Also will be good to save previous object name, as Export Scenario is linked to provider object by name.
  7. export a new provider in  acumatica

That is all you need to do. Now you can generate a file and it will be encrypted.
create a new provider in  acumatica

Full code snippet:

Have a nice decryption!

Monday, 17 October 2016

Acumatica Test Framework

Hi All,

Acumatica has a strong focus on the Platform and Development tools, that can help all our clients and partners to provide better product faster and with lower cost.

One of the nice and free tool that Acumatica provides as part of platform is Acumatica Test Framework. Acumatica test Framework is a set of tools and libraries that can be used for unattended black-box testing of any product or customization that is based on Acumatica Platform right in your favorite browser. For interacting with UI controls and components Acumatica Test Framework uses Selenium Web Driver. You can read more about Selenium here.

The diagram of Test Framework components is described here.
Test Framework diagram acumatica

The usage flow is like this:
  1. You have Acumatica ERP instance with required module or customization that you want to test.
  2. Using Page Wrapper Generation Tool you create a set of classes that will represents Acumatica page structure including controls, buttons, grids, columns, panels and so on. This tool is related on Acumatica platform and can dynamically analyse all standard and custom pages including customization. You need to create wrappers for each page that you want to test.
  3. Test Framework contains all required classes and methods that you can use to work with browser pages and controls. For example you can open selectors, search values, type or past values, click buttons, wait for long run operations and so on.
  4. Based on Wrappers and Framework classes you write your own Tests (that is classes) that will contains test logic.
  5. Using Test Runner you can lunch required tests. Test runner will load all test libraries and using interaction with Selenium Web Driver will open browser and execute all required steps.
  6. Selenium Web Driver is intermediate layer between test and browser. This tool knows browser API and can simulate user clicks with mouse and keyboards on each control separately. Also it can get values back to validate result. 
  7. Browser is embedded in test SDK, as it requires specific version of browser to run smoothly. When you run test you will see browser window and can check how your test is running.

Wednesday, 12 October 2016

Replacing Cache with custom class

Hi All,

Today i want to share with you a good trick how you can override original PXCache object.
Why you may need it?

  • To replace base cache logic, that should not be executed in some cases.
  • Forbid cache to read data for database in case of virtual DAC
  • Inject required logic to the standard workflow
  • Do not clear cache data on graph clearing
  • Access protected method
And many other things.

As you may know, that when you (or system) create a new instance of a graph, it will automatically instantiate all caches for each data views that are declared. Unfortunately, because this is unattended process it is almost impossible to adjust it for our own purposes.

But luckily Acumatica is very flexible system and there are several easy ways to do it lately after base initialization. So the reccomended solution will be:

  1. Create an graph extension for required Graph. Or also you may use constructor of the graph, if you develop new functionality.
  2. Override Initialize method to add your logic
  3. Create a new class for cache that should be inherited form PXCache<DAC> type.
  4. Instantiate a new cache object a new cache of the same DAC type.
  5. Replace original cache in the PXGraph.Caches collection with a new one.
On now it is done. You may use your new cache type and put logic there.

Code example:
public class InventoryItemFilterCache : PXCache<InventoryItemFilter>
       public InventoryItemFilterCache(PXGraph graph)
              : base(graph)

       public override void Clear()

       public override int Persist(PXDBOperation operation)
              return 0;

public class NonStockItemMaintExt : PXGraphExtension<NonStockItemMaint>
       public override void Initialize()
Base.Caches[typeof(InventoryItemFilter)] = new InventoryItemFilterCache(Base);


Have a nice Development!

Thursday, 6 October 2016

Provide Default Value for Report Parameter from Branch

Hi All,

Really often you may want to have some default values for report parameters, that may depend on environment. For example different default warehouse depend on branch where are you working now. Or different warehouse depend on current employee.
But unfortunately it is not out of the box functionality in Acumatica.

Luckily, using powerful Acumatica Customization engine it is quite easy to do. Let me share with you a way to archive it.

Scenario: lets assume that we want to have different default warehouse on Inventory Valuation report based on different branch that is selected as current.

We will do this task in 3 steps:
  1. Adding custom field to link branch and warehouse
  2. Create a class that can evaluate required warehouse by currently selected branch
  3. Provide default parameter in report 

Monday, 3 October 2016

Generate Grid Columns Dynamically

Hi All,

Today I want to show you an example how you can generate grid columns dynamically.
Sometime it is really important for dynamic inquiry report, where you want to show data that may be changed due to some other configurations.
generate grid columns dynamically in acumatica

To add columns dynamically you should follow this plan:
  1. Create a separate method that will generate columns.
  2. Call method create above from the graph constructor. Please not that if you put method into any event you need to make sure that you generation columns only once. Also you logic assume that columns may be changes if user select some other values on the same screen you need to make sure that you delete previously generated columns.
  3. On the columns go throught all new columns and do following:
    1. Add new Field to the PXCached
    2. Subscribe 2 events for FieldSeleting and FieldUpdating. These are most important events that are interacting with user interface. On the FieldSeleting you need to provide value and the configuration how this value should be displayed. On FieldUpdating you need to check, how system updated the value back to cache.
Here you can see a code snippet for columns generation:
protected void GenerateColumns(PXCache sender, List<String> columns)
       foreach (String column in columns)
              String key = column;
              String name = column;

              if (!sender.Fields.Contains(key))
                      this.FieldSelecting.AddHandler("Partners", key,
(PXCache cache, PXFieldSelectingEventArgs args) =>
                      this.FieldUpdating.AddHandler("Partners", key,
                             (PXCache cache, PXFieldUpdatingEventArgs args) =>