Introduction
Wholesale Energy markets in Europe are regulated by ACER (European Union Agency for the Cooperation of Energy Regulators). The agency has published Transaction Reporting User Manual (TRUM) to facilitate reporting. The TRUM is intended to provide market participants with guidance to make informed decisions about their transaction reporting obligations.
Please refer to the following link for details: https://www.acer.europa.eu/remit-documents/remit-reporting-guidance
Annex IV provides guidance on generation of UTI (Unique Transaction Identifier). Under this Annex, the Agency has developed and published an ACER algorithm which would enable market participants to generate an UTI from the economic terms of the bilateral trade.
This library (https://gitlab.com/saurabhjain1537/acer-uti-generator) is Java implementation of the ACER UTI Algo version 2.2
Deployment
Client applications need to include uti-generator jar and dependency jars in class path. Then invoke following method to get UTI based on Trade attributes.
reporting.utils.uti.UtiGenerator.generateUTI(TradeDetails)
Please refer to the project ReadMe for Installation and Usage example.

Class Design

ACER Algorithm vs ACER Generator Excel
ACER TRUM Annex IV v2.2 provides excel based implementation of the algorithm as well. However, there is a difference in handling of Price and Quantity columns between Algorithm and Excel implementation.
Price
It is mentioned in the ACER guide that Price should be denoted in Currency Per QuantityUnit. Please see this snapshot:

The ACER provided excel implementation doesn’t follow this and divides price by quantity.
In the following example, input Price is 53.5 GBP Per MWh/h.
Quantity Units MWh/h is same as MW.
Expected Price in the concatenated string is 53.5 GBP Per MW.
The excel divides the Price by 1000 (which is the Quantity) and uses the Price 0.05350 GBP Per MW.

Quantity
Quantity should be converted to a standard unit. Please see this snapshot:

The ACER provided excel implementation always calculates Quantity as 1.0
In the following example, input Quantity is 24.0 MTherm/d.
Equivalent to 24000000.0 Therm/d
Expect Quantity in the concatenated string is 24000000.0 Therm/d.
The excel divides the Quantity by Quantity and uses 1.0 Therm/d.

As per general understanding, Price and Volume values are same in all of the following rows.
Standard format should be S.No. # 3 as per the ACER guide.
Price = 12000 EUR per MW
Quantity = 0.02 MW
S.No | Price | Price Unit | Volume | Volume Unit | Monthly Amount | Amount Unit | Monthly Volume | Unit |
---|---|---|---|---|---|---|---|---|
1 | 12 | EUR per Kwh | 480 | Kwh/d | 172800 | EUR | 14400 | Kwh |
2 | 12 | EUR per Kwh | 20 | Kwh/h | 172800 | EUR | 14400 | Kwh |
3 | 12000 | EUR per Mwh | 0.02 | Mwh/h | 172800 | EUR | 14.4 | Mwh |
4 | 12000 | EUR per Mwh | 0.48 | Mwh/d | 172800 | EUR | 14.4 | Mwh |
Configuration
A properties file uti-generator.properties can be included in the client application classpath to configure a following properties:
- DBFilepath
- default value = acer-uti-gen.db
- The utility uses sqlite to keep track of generated UTIs.
- It is used to generate progressive number for equal trades on the same date.
- NormalizerType
- default value = Normalizer
- valid values = Normalizer, AcerNormalizer
- Normalizer means the implementation of ACER Annex IV – Guidance on the Unique Transaction ID (UTI) v2.2.
- AcerNormalizer means the that generated UTIs exactly match the Generator excel provided by ACER.
- Ideally ACER guide and generator should have same logic. But Generator Excel always has the quantity as 1.0 in the concatenated string (as explained above).
- UTI generated by Excel is different from the algo.
Automated Unit Tests
UTI Generator Lib has more than 100 jUnit tests providing more than 90% Line coverage.
jUnit 5 Nested annotation has been used to organize the unit tests which cover corner cases using ParameterizedTest annotation.

Support
Please contact via email: support.earlobe937@passmail.net