Case Study

Ticketing systems renewal

Person inserting a ticket on a vending machine

  • Transport & Logistics
  • Operator in charge of the management and commercial operation of a transport line in Portugal
  • Responsible for around 85,000 daily journeys


The transport company decided to start a project to modernise its management systems due to the evolution of the business and the obsolescence of some of its systems.


With this project, the company aims to achieve the following objectives:

  • Update the central system and the ticket vending machines to keep up with the evolving business over time and reduce future maintenance costs.
  • Maximize the previous investment in ticketing equipment, avoiding additional expenses.
  • Integrate the new systems with the existing systems/equipment to ensure continuous operation and minimise any impact on the company’s customers during the transition.
  • Keep the total investment within the budget initially set by the company.

Solution and architecture

The solution involves the implementation of an architecture that embodies the technologies, protocols, and information flows of the ticketing system.

In the image below, we can see the functional modules that were developed, along with their integration with existing interfaces/systems:




  • User Interface (UI): the machine’s UI was developed from scratch. Presentation and navigation are local, but navigation control and the rules underlying behaviour are managed by the central system via API calls.
  • Back-end: we set up a sub-module responsible for communicating the machine's peripherals with its integral parts (User Interface and User Interface Maintenance).

Good practices and methodologies

The project relied on an Agile approach with Scrum and XP techniques. In addition, the following practices were used:

  • Test-Driven Development (TDD): the implementation of TDD was fundamental to guaranteeing the quality of the code. Automated tests were written before implementation, ensuring that new features or changes did not jeopardise existing functionality.
    Example: Unit tests were implemented to check critical business logic, guaranteeing the stability of the system.

  • Design patterns: the use of design patterns contributed to a solid and flexible architecture. In particular, the Observer pattern was used to automatically update the UI in real time with changes to the central system, providing a continuous experience for end users.
    Example: the Factory Method pattern was used to create object instances, promoting code maintainability and extensibility.

  • Clean Code: the adoption of Clean Code was essential to make the code clear, concise and easily understandable. Through the use of meaningful nomenclature, modularised functions and clear comments, code maintenance was simplified.
    Example: duplication of code was avoided, promoting cohesion and readability of the source code.


  • Development of the central system: the core of the system responsible for coordinating and managing all operations was developed in Java. Choosing this language provided a robust and highly scalable platform, essential for dealing with the complexity of large-scale ticketing operations.
  • Ticket vending machine back-end: Java’s versatility and efficient performance enable smooth communication between the machine's peripherals and user interfaces.


  • Development of the vending machine UI: the choice of Angular to create the UI guarantees a modern and responsive user experience. Angular's component-orientated architecture aligns perfectly with the modular nature of the application, facilitating maintenance and continuous improvement.
  • Integration with the central system: Angular was adopted to ensure efficient integration between the local UI on the vending machines and the central system. API calls allow fluid communication while maintaining transaction consistency and security.


With the implementation of this project, the transport company is expected to effectively modernise its ticketing systems, promoting a more efficient operation that can adapt to business growth.

Additionally, by serving thousands of users of the transport system on a daily basis, the capitalisation of the previous investment and the smooth integration of the systems should result in significant economic and operational benefits for the company.


Therefore, the following outcomes are expected:

  • Renewal of the central system and sales equipment.
  • Capitalisation of previous investment.
  • Integration of new systems with previous systems/equipment.

Time and resources

The project is still in the development phase. The team involved includes:

  • 1 Tech Lead.
  • 1 Full-Stack developer (Java/Angular).
  • 1 Back-end developer.
  • 1 Front-end developer.
  • 1 Quality Assurance (QA) specialist.