1. The idea
In most business software, the things you see — a screen, a report, a chart, an approval route — are written in the programming language the product is built in. Changing one means a developer, a build, a test cycle and a release window. That is why "add a column" costs three weeks.
In ZakERP those things are declarations instead: short text files that describe what you want rather than how to fetch it. The engine reads them at runtime. Save the file, refresh the browser, and the change is live — nothing is compiled, nothing is restarted, and nobody using the system is logged out while it happens.
Why "nobody is logged out" is a real claim and not marketing. Changing the Java the engine itself is made of does require reloading the application, and that does end everyone's session. Definitions are different in kind: they are data the running engine reads. That is the whole point of the split — the things you change often were deliberately put on the side of the line that costs nothing to change.
2. Nine kinds of file
Together these cover almost everything a company asks for after go-live.
.screenA record screen — list, form, fields, validation rules, buttons and permissions.
.searchA report: columns, filters, a period bar, sorting, export and email.
.chartA chart with its own filters and date range.
.dashA dashboard composing charts and KPI tiles.
.workflowAn approval flow: states, levels, actions, notifications.
.calendarA calendar with layers drawn from different sources.
.modalA dialog, such as the leave application form.
.homeA role's home page: KPI tiles, columns and widgets.
.cardA printed ID card, laid out in millimetres.
A standard installation ships 88 screens, 77 reports, 24 charts, 5 dashboards, 8 approval workflows and 17 print templates — all written this way. The product is its own best evidence that the mechanism is enough to build a real ERP with.
3. A report
This is a complete, working report definition. Not an extract — the whole file.
search lateArrivals table zAttendance select "zactive = '1'" order xdate desc rows 31 search paginate export columns xstaff, xdate, xintime, xouttime, xstatus headers "Staff","Date","In","Out","Status" daterange xdate caption "Period" default month end daterange filter xstatus caption "Status" pick "Late,Late & Early Leave" end filter end search
- A period bar with Today, This Week, This Month, Last Month, This Year, All time and a custom range — opening on the current month.
- A keyword box and a status filter that combine with the period.
- Sortable headings and paging that survive as you move between pages.
- Export to CSV, Excel and PDF of exactly what is on screen.
- A place in the menu, visible only to the roles you allow.
Twenty lines. No SQL joins to hand-write for the paging, no export code, no email code, no permission check to remember. Those come from the engine, which is why they behave identically on all 77 reports.
4. A chart
The same idea, for a picture. This one is taken verbatim from the shipped product.
chart headcountByDept type column table zPdmst select "left(xstaff,4)='EID-' and xdeptname<>''" x "xdeptname" series "count(*)" "Employees" order "2 desc" rows 30 height 380 zoom export daterange xdatejoin "Joined" filter xempstatus caption "Status" pick "select distinct xempstatus from zPdmst order by 1" end filter end chart
Seventeen lines produce an interactive column chart with a zoom control, an export, a date
range on the joining date and a status filter whose options come from the data itself. Name it
in a .dash file and it becomes a panel on a dashboard; name it in a
.home file and it becomes a widget on somebody's home page. The
chart is defined once.
5. An ID card
This is the example that usually settles the argument, because it is the kind of thing people expect to need a designer and a developer for. It is a printed employee badge — double-sided, in millimetres, with bleed and safe margins for the print shop.
card employeeId caption "Employee ID Card" table zPdmst key xstaff size cr80 // 54 x 85.6 mm, ISO/IEC 7810 bleed 3mm // trim allowance for the printer margin 1.5mm // safe area corner 3mm front logo "logo_front.png" width 40mm photo xphoto size 26x30mm frame #A9861F 1.4pt line xstaff style code line xname style name line xdesignation style title footer "Holder's Signature" "HR Signature" end front back pair "Issue Date" xdatejoin format "dd-MMMM-yyyy" pair "Blood Group" xbloodgroup qr stored xqrCode size 36mm heading "If found please return to:" company phone, website, address end back end card
- Print-ready PDFs at the right physical size, with bleed, for a commercial printer.
- Batch printing for a whole department, from the employee list.
- A self-verifying QR code — scanning a badge opens a page that confirms whether it is genuine.
- Company details pulled from your own settings, so a change of phone number does not mean re-laying-out the card.
6. An approval chain
Approval routes are the thing companies change most often and the thing most systems make hardest to change. Here they are split in two, deliberately.
state review caption "Approval" lock levels notify "[Leave] "+xapp_no+" awaiting you" action Approve transition to approved action Return transition to returned note required action Cancel transition to cancelled note required end state
Edited on the Approval Matrix screen. Each level carries a condition, so a level that does not apply to a particular applicant is skipped — and the skip is written to the history. Four different routes through one ladder, as data.
The single word levels in that file is what says
"walk the configured ladder". Adding a fifth level, giving a level a stand-in for the holiday
season, or changing which manager signs are all data edits: no file changes,
no developer, no release.
7. Without typing anything
You do not have to write these files. The built-in Customisation Studio is a point-and-click builder that writes them for you: add a field to a screen, build a report, make a chart, compose a dashboard.
It also does the parts people forget — it shows you what a change will do before it does it, keeps versions so a change can be rolled back, and exports a set of changes as a bundle you can import on another server. That is what makes "test it first" practical rather than aspirational.
Who actually does this in practice. Not developers, and not everybody. It is typically one or two people — often the person who already builds the company's spreadsheets. Give them a day's training and most requests stop being requests.
8. Getting it live safely
Fast to change and safe to change are different problems. The recommended path:
-
Build it on a test installation
The same product, on any spare machine, restored from a copy of your database.
-
Confirm it does what you meant
Against real data, not three invented rows. This is where most surprises surface, and they are cheap there.
-
Export it as a bundle and import it on the live server
A copy, not a retype — which removes the class of mistake where the live version differs from the tested one by a typo.
-
Refresh the browser
That is the deployment. No restart, no maintenance window, nobody logged out.
9. Where it stops
Any vendor who tells you their configuration layer can do everything is describing a product they have not pushed hard. Here is the honest boundary.
Configuration — hours
- New reports, charts and dashboards
- New fields and new screens
- Validation rules and mandatory fields
- Approval routes, levels and stand-ins
- Document numbering, menus, roles and access
- Home pages, printed cards and PDF layouts
Development — quoted work
- A genuinely new module with its own logic
- Integration with an outside system's API
- A new kind of calculation the engine has no concept of
- Changes to the engine itself — which do need a restart
The useful question to ask any vendor is not "can it be customised" — everyone says yes. It is "show me the last change you made for a customer, and tell me how long it took." We will answer that on a call, with the file open.