What to create
Updated
ZuloOne is metadata plus C# scripts. You describe the object (json). You write
the behaviour (.cs). The platform generates the table, the entity, the REST
API, and the screen.
Note
You write the business layer. You do not write SQL, migrations, entity classes, controllers, or UI components. If it feels like you must "add something to the platform", that work belongs in the kernel repository, not in the workspace.
How to pick the object#
| You want | You create | You also need |
|---|---|---|
| A new application / module | A model | A menu root, dependencies, a modelVersion |
| A catalog of records (customer, item, warehouse) | A dictionary | A number sequence, an event handler (empty is fine), a menu item |
| A reusable field type | An EDT | Reference or scalar; Integer, not Int |
| A closed list of named integers | An enum | Enum object + Enum EDT; not a Reference. Longer: the kind |
| An M:N set of rows between records | A link table | ILinkTableManager / LT_ classes; not a table part. Longer: the kind |
| Seed JSON the model ships | A data package | Live sync skips it; apply through IDataPackageService. Longer: the kind |
| A document that moves through states | A document | Subtypes, a command per user transition, posting scripts if it writes totals |
| A number that accumulates (stock, debt, points) | A register | A posting script on the document that writes it |
| A slice of settings that changes over time | An information register | Set / SliceLast; not an accumulation register. Longer: the contract |
| A calculation that must follow every movement of a register | A totals driver | Hook on the register, not a posting on every document |
| Recurring work without a UI button | A job | Cron + Task script; import arrives disabled |
| An RPC the outside world calls | A web service | /api/rest/{Name}, not a data entity. Longer: the contract |
| A threshold, rate, or mode | A global constant | GlobalConstants.<Group>.<Name>, not a C# literal |
| A button the user presses | A command | Bound to the subtype it is allowed on |
| A question while that command runs | Ask from a command | Confirm / Choose / Ask before you write. Longer: the contract |
| Extra columns on a dictionary list that are not stored | Computed list columns | IListColumnProvider on a service. Longer: the contract |
| Shared logic used by more than one script | A service | Called with GetService<IName>() |
| A screen that is not a record card | A form | Form attributes, a module, a menu item |
| Excel / an external system reading the same rows | A data entity | One primary source; OData, not a web service |
| A field or handler on somebody else's object | An extension | A dependency, a higher layer, your version bumped |
| The user to find the object | A menu item | In the same change as the object |
| Text the user will read | A script resource | Not a C# string literal. Longer: the rule |
| A call to a tax office, a bank, an operator | An outbound call | Channel by name; never HttpClient. Longer: the seam |
| Proof it works | An integration test | Then verify |
How to code it#
| The code | Where it lives | What it must not do |
|---|---|---|
| Fill a field, refuse a value, spawn a related document | An event handler | Write register movements |
| Write stock, debt, GL | A posting script | Look up, calculate, or spawn documents — that is a service / event |
| Change the document's state from the UI | A command | Leave the subtype select unlocked; after Save it is frozen |
| Wrap somebody else's handler, service, command, or posting | Chain of Command | Skip next / skip [ExtensionOf]. Longer: the contract |
| Ship the change to tenants | Bump modelVersion |
Reuse the version the tenant already has |
Tip
A new dictionary, document, register, virtual total, report, or user command without a menu item is installed and invisible. The table exists. The user cannot open it.
What's not there yet#
There is no generator that writes a whole object from one command. The studio can create the files; you fill them. A print form has a short recipe — Print a form — and a longer page.