English עברית Українська Polski Русский

ERP Scheduling System for an Education Center

Product & Systems Architect — Alex Shevchuk
Summary: replaced a legacy Excel-based system with a modern web application.
Development started: February 2026.
Production: since September 1, 2026.
Status: production is stable and running without failures; development of new features and modules continues.

Context and Problem

After I started working with a science education center for physics and chemistry, I found the organization running on a legacy system built on Excel. It kept crashing, froze under load, and made daily operational changes painful and error-prone.

Scale of operations:
26 partner schools up to 50 lessons per day 105 student groups specialized laboratories frequent teacher substitutions, cancellations and reschedules equipment orders

That's exactly why I decided to build a system that would make schedule and resource management more reliable and predictable. In my free time outside my main job, I built my own Scheduling System, and in mid-August, just before the new school year, I deployed and configured a dedicated instance of it for the center, free of charge, to make my colleagues' daily work easier.

My experience with relational databases shaped the project's core architectural principle: schedule and resource changes should be handled as transactions, not as simple spreadsheet edits.

Data integrity was pushed down to the database level, the change history is immutable via an Audit Log, and the architecture allows safely restoring the schedule state for any given day.

My Role

System Overview

4
DB schemas (campus / laboratory / notifications / settings)
31
tables in the DB schema
43
PL/pgSQL functions — business logic in the DB
655
commits over 9 months of development
391
automated regression checks, run before every deploy
24/7
production availability

An ERP system for schedule and operations management:

Technology stack:

PostgreSQL 16 PL/pgSQL Node.js + Express Vue 3 + PrimeVue (RTL) Docker · AWS · Cloudflare Tunnel

Project structure:

Project structure
Repository structure — the system was designed from day one with a clean separation between the application, the database logic, and the infrastructure.

The system in real life:

Corridor display in the teachers' room
Corridor display in the teachers' room — live, on the wall of the education center.
Corridor display for students
Corridor display for students — live, on the wall of the education center.
Production monitoring
Production monitoring — the system is under continuous external uptime monitoring. 100% uptime over the last 30 days; 99.995% since September 1, 2026, with a single 5-minute incident during a planned version deployment (database migration and backend/frontend container restart). Continuously up ever since.
Email delivery infrastructure
Email delivery infrastructure — notifications are sent through a verified domain via a transactional email provider (Resend), ensuring reliable delivery and proper authentication (SPF/DKIM).

System Interface

Click any screenshot to view it full-size.

Daily Gantt
Daily Gantt chart — the day's live schedule by room. Subject color-coding, substitute highlighting, current-time indicator.
Basic schedule template
Annual template (Basic Schedule) — the source of truth. Changes propagate safely to the generated yearly schedule through a two-phase algorithm.
Teacher dashboard
Teacher dashboard — a personal workspace: upcoming lessons, equipment requests, substitution history, and work schedule.
Admin dashboard
Admin dashboard — the central "single window." Teachers only submit requests; admins review, adjust, and apply the changes.
Lab assistant dashboard
Lab assistant dashboard — an operational overview: equipment orders and notes for a selected day.
Audit log
Audit log — a fully immutable history of every significant action. Even a superadmin cannot edit or delete a record.
Email notification rules
Email notification rules — who gets notified about what. Every event type (new request, approval, equipment order, substitution, server maintenance...) can be routed independently to specific roles and to the people directly involved (request author, lesson teacher, substitute, acting teacher) — configured from the Control Panel, with a global kill switch to pause all email instantly.
Real system mailbox
Real system mailbox — incoming notifications sort themselves by event type (equipment order, lesson cancellation, room change, substitution...) into a dedicated folder per type, with its own sender address.
Equipment order confirmation email
Equipment order confirmation — with item codes and direct links to the Hemda material library.
Display board for students
Display board for students — a public screen with the live schedule.

Engineering Culture — Code and Documentation

One of the project's core principles: logic and decisions are explained directly in the code — not only what a function does, but why it exists and what breaks if the invariant is violated.

1. Clear separation of structure and business logic

Comments in schema.sql
schema.sql — an explicit rule: this file holds structure only. Business logic lives in the modular files.

2. Room assignment with explicit business rules

The _find_room function
campus._find_room() — room-priority rules for physics and chemistry are documented and encoded directly in the query.
year_schedule.sql header
year_schedule.sql — the file header explains the purpose of every key function and the freeze / unfreeze day flow.

3. Quality Assurance & Invariant Verification

391 automated regression checks (API + database layers) run before every deploy — verifying request approval workflows, teacher substitutions, day freeze/rollback mechanics, scheduling-conflict prevention (EXCLUDE USING GIST), equipment orders, and the notification-rules matrix.

4. Release & Operations Discipline

Each of the ~20 production releases over 9 months follows the same protocol: a migration rehearsal on a fresh copy of the production database, Docker images tagged :rollback before rebuilding, a backup taken right before applying changes, and a written deploy log on the server. The actual container-switch window runs 13 to 55 seconds.

The full-outage recovery plan isn't just theory: the entire cycle — wiping the volume, a clean init from scratch, restoring a real production dump into a temporary database — has been run end to end, with key tables (staff, lessons, requests, permissions) checked row by row against the live database.

5. User Adoption & Change Management

To ensure a smooth transition from legacy Excel, I built a gradual rollout strategy:

Results