Steinfort Glas·customer portal and automation
Intern, then paid developer, at a flat-glass processor: I built most of the front end of the portal its business customers use for prices, orders and complaints, and tools around its order data.
| Company | Steinfort Glas, Franeker, the Netherlands (flat glass processed to order, and the consumer brand Glazz) |
| Internship | September 2023 to February 2024, on site |
| Paid developer | February to August 2024, part-time, mostly remote, next to full-time study |
| Portal | ASP.NET Core MVC on .NET 8, C#, Razor views, Bootstrap, jQuery |
| Connected systems | FeneVision (ERP), Lime CRM (complaints), Elfsquad and DynaMaker (configurator), Smart Glazier (web ordering) |
| Automation | Python (Flask, ezdxf, PyQt5, pandas, matplotlib), SQL Server, Robocorp, UiPath |
Steinfort Glas cuts, toughens, laminates, grinds and drills flat glass to order for other businesses, and sells to consumers under the name Glazz. I joined as an intern in September 2023 and stayed on as a paid developer until August 2024. The internship produced automation around the company’s orders: a service that turns an on-site measurement into a shower configuration, a revenue analysis app and a prototype ordering robot. Most of 2024 went into Mijn Steinfort, the portal its business customers use for price lists, quotations, orders and complaints. In September 2026 its public pages still carry the markup and styles from my commits.
From a measured wall opening to a shower configuration, autumn 2023
Glazz sold shower enclosures through an online configurator built on Elfsquad, with a DynaMaker 3D model. Openings are measured on site with Solaflex, a digital measuring kit that exports a DXF drawing. The internship’s first project, from September to the start of November 2023, took that file straight into a configuration instead of having the dimensions typed in.
The service is a Flask app. It reads the drawing’s line entities with ezdxf, splits the points into an upper and a lower set at mid-height, and derives the top width, the bottom width and the height. It then authenticates with Elfsquad’s API (OAuth2 client credentials), opens a new corner-shower configuration and writes into it: the bottom width as the width, the height, the second wall switched off, and the side panel switched off when the opening is 900 mm or narrower. When the top and bottom widths differ, the difference goes into the model’s top-width correction, added or removed. The user then lands in the configurator with all of it filled in. I presented it at the end of October 2023, and after that meeting the internship moved on to order data.
Order data: a revenue app and file extractors, November and December 2023
I wrote SQL against the order records from 2015 to 2023 and built a PyQt5 desktop app on the export. It sums revenue for any selection of customers by month, by year, by quarter across the selected years, or by each year’s quarters. A percentage view instead scales every customer’s months between that customer’s own lowest and highest, so customers of very different size can be compared on one axis. The app has a customer search, hover labels on the plot, an English and Dutch tutorial, a theme switch and a font-size control, and I packaged it with PyInstaller as a single Windows executable. I demonstrated it to the company and handed it over with documentation and tutorials.
In the same weeks I wrote extractors for Smart Glazier, the web ordering software from Smart Builder: a PyQt5 tool reads an order file’s customer, delivery and item data and saves each pane’s embedded drawing as a DXF file.
RPA for Steinfort: an introduction, a robot and an order-intake proposal, January 2024
In January 2024 I made and presented a Dutch introduction to RPA for Steinfort: what it is, where it fits in glass production, how it works, and which companies already use it.
I then prototyped a Robocorp robot in Python for Smart Glazier. It reads an order’s purchase and sales data from FeneVision’s order tables in SQL Server, logs into Smart Glazier in a browser and starts a new shower order. The design was to take the previous week’s orders and skip any already entered. I tested UiPath on the same kind of task and presented the comparison to the company’s staff in Dutch: features, licence prices, and Python’s libraries against UiPath’s built-in OCR and document tools. For robots that repeat a similar task often I recommended Robocorp.
At the end of January I tested text extraction (PyMuPDF and pdfplumber) and OCR (Asprise) on sample order PDFs and drew a proposal for order intake: customers who send PDFs go through OCR, customers who send UBL go in directly, and both end up as structured data that a robot enters into FeneVision.
The customer portal, January to June 2024
Mijn Steinfort is an ASP.NET Core MVC application on .NET 8 that the company’s developer had built since December 2021. Orders and quotations come from FeneVision; complaints are stored in Lime CRM. The company’s designer drew the new pages, and I turned them into Razor views, CSS and the controller code behind them.
It started before the internship ended: in January 2024 I put the first version of the new design on the glass price lists. The paid contract from mid-February was part-time, and I worked mostly from home, at first with the tasks and my code going back and forth by email. I rebuilt the login page to the new design, then the header with its search field and a language menu with flags; the developer committed both from what I sent. From mid-March, with my own access to the repository, I worked through GitHub issues the developer opened, on a feature branch: the search bar, the orange mark on the current menu item, the forgotten-password form, the welcome page and account creation, then an upgrade of the header, footer and layout, and the price-list styles.
From April to June came the privacy page, the order overview and the order detail page, and a footer that the layout inserts once instead of every page carrying its own. Every page had to work from a 2560-pixel monitor down to a phone.
Two research briefs, May and June 2024
Next to the portal I answered two questions in writing. For the TV in the hall, I proposed a Raspberry Pi running Anthias to loop videos and show the weather, with the hardware priced from Dutch shops. For tracking where employees are during working hours, I compared React Native and Flutter for an in-house app, set that against off-the-shelf trackers priced per seat (Hubstaff’s tiers), and recommended building: features could be added later without a per-employee fee.
Account, product pages and complaints, July and August 2024
From July I committed straight to the development branch. I added a banner view model with a shared partial that renders a page’s hero image from it, and rebuilt the account page and the contact page.
In August I built the product pages (figured glass, installation glass, toughening, laminated and toughened clear glass), the payment and delivery terms, and a popup component for the trade vocabulary a buyer meets in the price lists: afscherpen, PP, RP, RPP, verstek. It is a partial view that takes a topic name and renders that definitions panel, implemented for eight topics from edge grinding and drilling to heat-soak testing and packaging. Later that month the developer extended it to several popups per page and added it to the price lists.
The complaints section ran from July to my last commits on 31 August. Its back end already existed; I rebuilt the pages a customer uses. On the form, every position of the order is a checkbox, so a customer claims the panes that arrived wrong and not the whole order. For each position they give the number of panels, a reason (damage, dissatisfied, wrong product, other), a description, the remedy they want (redelivery or a full or partial refund) and a photo, which they can drag onto the form and see previewed before sending. The detail page shows each claimed position with the claim’s status as Lime CRM reports it, next to the order confirmation to download.
After I left
In December 2024 the developer added example images of the grinding profiles to my popup. In September 2026, two years after my last commit, the public pages of mijnsteinfort.nl (login, registration, privacy and contact) still carry the markup and class names from my commits.