Commit Graph
1993 Commits
Author SHA1 Message Date
Darko Gjorgjijoski 4e69f8d3a6 feat(receivables): fresh payment pdf controller 2026-08-21 09:39:20 +02:00
Darko Gjorgjijoski 19c391f9fa chore(receivables): remove the payment pdf controller retaining legacy attribution 2026-08-21 09:39:20 +02:00
Darko Gjorgjijoski e0bd029e54 refactor(receivables): restate the legacy-era pdf-share and gate definitions 2026-08-21 09:39:20 +02:00
Darko Gjorgjijoski 95984bd39c feat(receivables): fresh receivables implementation 2026-08-21 09:38:43 +02:00
Darko Gjorgjijoski d593cccccf chore(receivables): remove legacy-era receivables sources 2026-08-21 09:38:43 +02:00
Darko Gjorgjijoski c7130e1e17 refactor(receivables): rewrite legacy-era regions of the allocation model, requests, pdf controller and routes in place 2026-08-21 09:38:43 +02:00
Darko Gjorgjijoski c4c816b0ed feat(sales): fresh support services and provider 2026-08-21 01:38:55 +02:00
Darko Gjorgjijoski 096d34248e chore(sales): remove the support services and provider retaining legacy attribution 2026-08-21 01:38:55 +02:00
Darko Gjorgjijoski ba09d78f9c refactor(sales): rewrite legacy-era regions of the credit-note, item and balance services and the provider in place 2026-08-21 01:38:55 +02:00
Darko Gjorgjijoski 56d12c204d feat(sales): fresh document services and invoices controller 2026-08-21 01:27:48 +02:00
Darko Gjorgjijoski 7c48bead58 chore(sales): remove the document services and invoices controller retaining legacy attribution 2026-08-21 01:27:48 +02:00
Darko Gjorgjijoski 5269344458 feat(sales): fresh sales implementation 2026-08-21 01:26:48 +02:00
Darko Gjorgjijoski e5dc314b68 chore(sales): remove legacy-era sales sources 2026-08-21 01:26:48 +02:00
Darko Gjorgjijoski 7170ba8241 refactor(sales): rewrite legacy-era regions of the document services, controllers, credit-note request and routes in place 2026-08-21 01:26:47 +02:00
Darko Gjorgjijoski 28ce4ed264 feat(accounts): fresh admin companies and profile controllers 2026-08-20 23:48:38 +02:00
Darko Gjorgjijoski b4b25ee5d2 chore(accounts): remove the admin companies and profile controllers retaining legacy attribution 2026-08-20 23:48:38 +02:00
Darko Gjorgjijoski d5dc446b24 feat(accounts): fresh accounts implementation 2026-08-20 23:48:22 +02:00
Darko Gjorgjijoski 973fda1df6 chore(accounts): remove legacy-era accounts sources 2026-08-20 23:48:22 +02:00
Darko Gjorgjijoski bc213966ff refactor(accounts): rewrite legacy-era regions of the provider, admin companies, profile controller and routes in place 2026-08-20 23:48:22 +02:00
Darko Gjorgjijoski 3f5238bc43 feat(contacts): fresh portal dashboard and profile controllers 2026-08-20 21:51:21 +02:00
Darko Gjorgjijoski f220185a40 chore(contacts): remove the portal controllers retaining legacy attribution 2026-08-20 21:51:21 +02:00
Darko Gjorgjijoski a4460b585b refactor(catalog,contacts): restate the legacy-era bulk-delete gate definitions 2026-08-20 21:51:12 +02:00
Darko Gjorgjijoski a93d13a188 feat(catalog,contacts): fresh catalog and contacts implementation 2026-08-20 21:50:34 +02:00
Darko Gjorgjijoski b5b4e2c978 chore(catalog,contacts): remove legacy-era catalog and contacts sources 2026-08-20 21:50:34 +02:00
Darko Gjorgjijoski 2b4de6bd09 refactor(catalog,contacts): rewrite legacy-era regions of the domain routes and portal controllers in place 2026-08-20 21:50:27 +02:00
Darko Gjorgjijoski dd8cb9f274 feat(taxation): fresh tax-type request implementation 2026-08-20 21:00:15 +02:00
Darko Gjorgjijoski 00bcc940af chore(taxation): remove the tax-type request retaining legacy attribution 2026-08-20 21:00:15 +02:00
Darko Gjorgjijoski c7389865c7 refactor(money): restate the legacy-era fetch lines in the open-exchange driver 2026-08-20 21:00:03 +02:00
Darko Gjorgjijoski 1b61328e31 feat(money,taxation): fresh money and taxation implementation 2026-08-20 20:54:20 +02:00
Darko Gjorgjijoski 398863e437 chore(money,taxation): remove legacy-era money and taxation sources 2026-08-20 20:54:20 +02:00
Darko Gjorgjijoski d8a96a3fb8 refactor(money,taxation): rewrite legacy-era regions of the domain routes and tax-type request in place 2026-08-20 20:45:07 +02:00
Darko Gjorgjijoski 04af1e5c73 feat(schema): consolidate the 2.x migration chain into one guarded base migration
A single consolidation migration replaces the 150 removed historical files.
It decides — from reads alone — whether to build the boundary schema fresh,
skip on a fully-migrated 2.x database, or refuse a partial or inconsistent
history untouched. Fresh installs run it first and the live v3 chain after;
pre-2.x installs are directed through the latest 2.x release. The same
verdict backs a self-updater preflight so an unsafe upgrade is refused
before any file is copied. Schema verified identical to the boundary
fixtures on SQLite, MariaDB and PostgreSQL.
2026-08-20 19:17:28 +02:00
Darko Gjorgjijoski 721e21beef chore(schema): remove the migration chain shared with the 2.x line
First half of a split: the replacement consolidation migration lands in the
adjacent follow-up commit. Fresh installs are broken at exactly this commit.
2026-08-20 19:17:28 +02:00
Darko Gjorgjijoski 7db2a8d094 feat(operations): fresh platform-operations implementation
Full rewrite of the installer (incl. the finish step), self-update pipeline,
settings store, cron webhook, dashboard/bootstrap surface, environment
manager, wizard login, config endpoint and shared helpers. Byte-compatible
public interfaces and observable behavior, including documented legacy
quirks; verified by the pilot behavioral suite and the full test suite.
2026-08-20 18:30:12 +02:00
Darko Gjorgjijoski a1828fac52 chore(operations): remove legacy-era platform-operations sources
First half of a delete/re-add pair so authorship attributes cleanly to the
fresh implementation. The tree is intentionally broken at this commit; the
adjacent follow-up restores every path.
2026-08-20 18:30:12 +02:00
Darko Gjorgjijoski 1f45b3a8d0 refactor(operations): rewrite legacy-era regions of the operations routes and format endpoints in place 2026-08-20 18:30:12 +02:00
Darko Gjorgjijoski 5194552338 test: isolate the DB-refusal pilot test from single-process runs
It swaps the live connection; the isolated group is excluded by default and
run standalone in verification passes.
2026-08-20 17:19:26 +02:00
Darko Gjorgjijoski 605d700f75 test: add the behavioral spec suites (pilot + ten domains)
98 tests pinning observable behavior ahead of the authorship rewrite.
2026-08-20 17:19:26 +02:00
Darko Gjorgjijoski 068f70f7f9 chore(release): prepare 3.0.0-alpha.2 (#755) 3.0.0-alpha.2 2026-08-14 00:50:09 +02:00
Darko Gjorgjijoski 93dd7df48a fix(taxes): correct compound tax document flows (#754) 2026-08-14 00:42:01 +02:00
Darko Gjorgjijoski 13aa087faf Add compound tax support (#753)
* test(taxes): cover compound_tax API semantics and validate it as boolean

* feat(taxes): restore the compound tax toggle in tax type settings

* feat(taxes): compute document-level compound tax amounts

Two-pass recalculation: simple taxes on the discounted subtotal, compound
taxes on the subtotal plus all simple taxes (v2 parity; branch order
fixed -> compound -> inclusive back-out -> simple). Amounts now also
recalculate on tax add/remove and on the tax-inclusive toggle, which
previously never triggered recalculation.

* feat(taxes): support compound taxes in per-item mode

Per-item tax rows now carry the compound flag and charge compound taxes
on the item's discounted base plus its simple taxes, through the same
calcTaxAmount branch order as document-level taxes. The item row splits
its tax sums into simple and compound so a compound row can never widen
its own base.

Also fixes two pre-existing bugs: the per-item tax dropdown read
window.__taxTypes, which nothing ever assigned, so it always rendered
empty (tax types are now fetched by the items table and passed down);
and removing a tax row hard-zeroed the item's totals instead of
re-syncing them.

* fix(invoices): skip placeholder tax rows when persisting item taxes

The document form keeps one empty placeholder tax row per item in
per-item tax mode. Its empty name is nullified by the framework's
empty-string middleware, so inserting it violated the NOT NULL
constraint and turned every per-item save into a 500. The equivalent
v2 guard keyed on a null amount, which the v3 stub (amount: 0) evades;
keying on the missing tax_type_id catches it.
2026-08-14 00:17:52 +02:00
Darko Gjorgjijoski 844d2c82ed Update Discord link text in README 2026-08-11 20:59:21 +02:00
Darko Gjorgjijoski eac06de046 docs: rewrite InvoiceShelf 3 onboarding (#750)
* docs: rewrite InvoiceShelf 3 onboarding

* fix(installer): align minimum PHP requirement

* docs: keep README screenshot in release packages
2026-08-05 23:45:32 +02:00
Darko Gjorgjijoski 0b9ae9ea00 refactor(ai): extract assistant into an official module (#749)
* feat(modules): expose host data boundaries

* feat(modules): add frontend extension surfaces

* refactor(ai): remove assistant from core

* chore(ai): prepare the module extraction

* fix(modules): load extension styles after the host bundle

* chore(modules): lock SDK 3.3.0
2026-08-05 22:10:21 +02:00
Darko Gjorgjijoski 99ae7def75 chore: remove obsolete root artifacts (#748) 2026-08-05 18:19:35 +02:00
Darko Gjorgjijoski 5ef7804e60 refactor: adopt modular domain architecture (#747)
* refactor: stabilize model identities for domain migration

* refactor: extract module platform context

* refactor: assign models to domain contexts

* refactor: extract ai platform context

* refactor: extract storage platform context

* refactor: extract mail platform context

* refactor: extract pdf platform context

* refactor: extract operations platform context

* refactor: move installation into operations platform

* refactor: extract money domain context

* refactor: extract taxation domain context

* refactor: extract catalog domain context

* refactor: extract metadata domain context

* refactor: extract reporting domain context

* refactor: extract purchases domain context

* refactor: extract receivables domain context

* refactor: extract accounts domain context

* refactor: complete reporting statement boundary

* refactor: extract contacts domain context

* refactor: extract sales domain context

* refactor: remove legacy application layers

* fix: migrate legacy bouncer role identities
2026-08-05 17:40:03 +02:00
Darko Gjorgjijoski a34bf0909f feat(modules): add safe module uninstall lifecycle (#746)
* fix(modules): recover from missing runtime files

* feat(modules): add safe uninstall lifecycle

* build(deps): lock module SDK 3.2.0

* test(modules): expect SDK 3.2 scaffold constraint
2026-08-05 12:15:29 +02:00
Darko Gjorgjijoski 8579e4f85f feat: add secure module marketplace runtime (#745) 2026-08-05 03:49:42 +02:00
Darko Gjorgjijoski f322c2b74d feat(payments): add customer ledgers and allocations (#744) 2026-08-05 03:28:35 +02:00
Darko Gjorgjijoski 8ae82ae91e fix(documents): correct demo sequences and save errors (#740) 2026-08-02 17:31:03 +02:00