

Regulatory reports for a telecom operator
An application that takes CDR call records, automatically calculates minutes by category and fills the GIT7 and PPK1 forms for RATEL.
Context
Every telecom operator in Serbia must file periodic traffic reports with the Regulatory Agency for Electronic Communications and Postal Services (RATEL). The forms ask for minutes split by connection type — fixed to fixed, fixed to mobile, by domestic operators, by international destinations, by call direction.
The data exists, but not in a shape built for reporting: CDR records, one row per call, split into separate tables by month. For an annual report that is twelve tables with millions of rows.
The brief
Until then the client built the reports by hand — export from the database, then Excel, then summing by category. The job took days, one person was the only one who knew the exact classification rules, and every filter mistake meant a wrong number sent to the regulator.
They wanted that whole process turned into an application: open it in a browser, pick a form, and get the finished figures.
How we solved it
We built a web application where each form line is a named query over the database. Monthly tables are joined into one set, then rules that define the category are applied — call direction, destination type, the operator the connection was made with, the prefix of the called number.
The key decision was that classification rules live in code, not in one person’s head. Each form line has its own query with a name that says what it calculates, so the logic can be read, checked and fixed without guessing.
Results are shown in the app and also available through REST endpoints — so the figures can be pulled into other systems without calculating them again.
Technologies
- Spring MVC — controllers, REST endpoints and views
- Hibernate and MySQL — data access and aggregation over CDR tables
- JSP and Bootstrap — interface for choosing a form and reviewing results
- Maven, WAR deployed on an application server
What this means today
We still solve the same pattern, just on a more modern stack: a pile of raw records and an obligation to get an exact, repeatable number from them — whether it is a regulator, a tax office or a board that wants a report. Logic you can read and check is worth more than a spreadsheet only one person knows how to fill.