Centeria Architecture
Centeria is a Restaurant Order Management System that I developed between 2014-2019, and it is currently used in restaurants in Turin, Italy.
The core of the system is a C#/.NET/WPF desktop application running on a Windows PC on-premises. Surrounding this are Android applications running on Palm devices, which waiters use to take orders at the table. When an order is created, the application dispatches the ordered items to the appropriate kitchens (Japanese restaurants have even five kitchens, each specializing in a certain type of product, and a single dish may be a combination of items from different kitchens).
An Azure application allows restaurant guests to view the menu on their phones (by scanning a QR code) and even place orders before a waiter arrives at their table.
The diagram below shows the context in which the system operates:

The waiters are the primary users of the system. They use either the desktop application (running on a Windows touch-screen-tablet-mode-PC) or the Palm devices (running Android). They create orders for customers at different tables, add products to the orders, and eventually issue the bill.
Once products are ordered, the system prints the relevant items on thermal printers in the kitchen(s), so the chefs know what to prepare.
The restaurant owner has an overview of the system: they can view daily, monthly, or yearly reports to see revenue, popular dishes, and more. They can also receive email notifications if something unusual happens (for example, if a waiter gives a very large discount to a customer).
QR codes are placed on the tables, which guests can scan with their smartphones to access an Azure-hosted web application displaying the current menu. The desktop application synchronizes its menu with the Azure web app. Guests can select the items they wish to order, and when the waiter arrives, the waiter simply scans a QR code on the guest’s phone with their Palm device to identify the selected products.

Looking deeper into the Centeria Central System, there is a more traditional layered architecture:

At the bottom are domain models for the menu, orders, products, and fiscal documents. Above that is an Application layer that orchestrates all the workflows in the restaurant. On top is a presentation layer, built in WPF using the typical MVVM pattern.
While this architecture was well-suited for 2014 when I started - being decoupled and layered, with all dependencies pointing downward, I later realized, as the application grew and with the advent of more modern approaches in the 2020s, that a vertical slice architecture would have made more sense. However, this wasn’t yet a thing when I began.

Within the Application layer, the Main Menu component ties together all the major parts of the application. While some components are fairly independent, the Order Screen and Rooms components are playing together - a trade-off that helped better mimic the workflow that waiters were accustomed to from similar systems.
Enjoy Reading This Article?
Here are some more articles you might like to read next: