| 2026-08-04 |
The company funding account is derived, never stored (Option A): an Airwallex-originated payout can only draw from the org's wallet in the transfer currency (the API names no source account), and a manually-paid payout's account is captured at match time from bankTx.bankAccountId β the channel decides, so a stored "intended source" field would duplicate a derivable fact |
T-199 |
| 2026-08-04 |
A 2110 reimbursement payout and its WOPC point at each other with references only: the tx carries gl['2110'].wopcRef (the ONLY field β the T-193 references-not-copies contract) and the WOPC carries transaction.id β the same pair the 5050 pipeline stores. The payout links the pre-created WOPC, never creates one (updateWOPCMatched, not createWOPC); the T-192 auto-match guard is lifted |
T-193 |
| 2026-08-01 |
A WOPC's whole state collapses into one honest status enum β draft Β· standBy Β· awaitingSignature Β· processing Β· paid Β· error Β· voided Β· deleted β retiring the misleading active/pending_transaction and the separate signed/void/deleted side-fields; a reimbursement can finally read paid (design signed off, build phased) |
T-199 |
| 2026-08-01 |
The reimbursement payout transaction.id moves onto the WOPC (one payout per WOPC β a WOPC is never split; receipts keep their wopc.ref backlink), so WOPC status reflects the receipts β refines the 2026-07-28 "option 2" receipt-only link (build Phase 2, rewires the derived 2110 journals) |
T-199 |
| 2026-08-01 |
No paidAt/paidVia marker β the linked transaction.id already carries the paid date and the payment kind; the owner rejected redundant fields in favour of the honest status |
T-199 |
| 2026-08-01 |
A paid WOPC is terminal β it can never be voided; there is no clawback, a refund would be a new transaction/document, never a void of the paid WOPC |
T-199 |
| 2026-08-01 |
Signing a WOPC auto-fires its payout (no confirm beat) β safe only behind an idempotency interlock (a WOPC-derived key + the processing lock), which is why T-185's can't-pay-twice becomes mandatory rather than optional |
T-199 |
| 2026-07-31 |
WOPC signing authority is not limited to directors β a director, or any person the directors authorise, may sign; granting it gets its own permission (wopc_signers:manage) and the signer picker offers {directors + authorised signers} β payee. The mark is system.authorizedSignature {authorized, grantedBy, grantedAt}. (Claimed as T-195, renumbered T-196 on merge.) |
T-196 |
| 2026-07-30 |
A reimbursement WOPC line prints its category's documentation label ("F&B", "Out-Job Consumables") via the shared categoryLabelFor map, not the stored slug β the snapshot carries the words the document prints |
T-194 |
| 2026-07-30 |
A reimbursement's recipient block sits at the paginated height on every page (one-pager or multi-pager) so the address lands in the same No.5 window-envelope window regardless of page count β the measured single-page position sat too high |
T-194 |
| 2026-07-30 |
A paginated reimbursement's first page drops its receipt table two lines and centres the opening between the recipient and the intro |
T-194 |
| 2026-07-30 |
A reimbursement one-pager shifts everything below the recipient down two lines (the salutation was cramped against the lowered recipient), which lowers its capacity from nine rows to eight; the one-pager measures capacity directly against the footer (maxReimbursementSingleRows) since its closing follows the payment block, not the anchored position |
T-194 |
| 2026-07-30 |
A reimbursement's closing follows the payment block β a line below the bank block on an unsigned one-pager, pulled tight to the bank block on a SIGNED one-pager (the taller signed closing would else hit the footer after the two-line shift), and three lines below on a busy paginated last page β instead of the template's bottom anchor; contractor fees keep the anchor |
T-194 |
| 2026-07-30 |
Reimbursement WOPC document polish (post-deploy): a middle page holds 20 one-line rows (whole page, no recipient/total/closing β REIMBURSEMENT_CAP_MIDDLE = 20 vs contractor 15) and centres that list between the page-number line and the footer; the amount column pins the "$" to a fixed left column with figures right-aligned; and the total-row "(HKD)" no longer wraps |
T-194 |
| 2026-07-29 |
Reimbursement issuance gains a bank-account picker β the operator confirms which account (pre-selected when one on file, an explicit pick required when several); the client only ever sees masked accounts + an identifier, and the server re-resolves the full number |
T-194 |
| 2026-07-29 |
The reimbursement preview shows a real peeked reference number (non-reserving, minted only at issue β the 5050 mechanism), retiring the β’β’β’ placeholder; no gap risk |
T-194 |
| 2026-07-29 |
WOPC recipient line spacing loosened 1.0 β 1.2 (ADDR_PITCH 11 β 13.2) β an owner-directed departure from the measured template, applies to every WOPC |
T-194 |
| 2026-07-27 |
The abbreviation stays bookkeeper-owned β users can self-serve their legal name and bank accounts but never their reference code, which must be unique across everyone the company pays |
T-183 |
| 2026-07-27 |
One definition of how a bank account is stored: the Contacts editor's inline normalisation was extracted so self-service and bookkeeper writes produce identical documents |
T-183 |
| 2026-07-27 |
A Payment Confirmation is refused when the payee's abbreviation is still the sign-up placeholder, not merely when it is blank β it keys payees/{abbr}, the directory and cross-issuance (corrected: since #664 the reference number is ERL-WOPC/{YYYY}-{NNN} and never prints it β T-188 finding) |
T-183 |
| 2026-07-27 |
Payment readiness is derived from the Contacts record on every read, never stored β no paymentReady flag to go stale or backfill |
T-183 |
| 2026-07-25 |
The transaction's GL code is the discriminator β 6xxx means the company paid the merchant, 2110 means it repaid an employee β so no settled-payout marker field is needed |
T-178 |
| 2026-07-25 |
Receipt and transaction each answer their own question: the receipt owns "was I repaid, by which payment", the transaction owns "what kind of payment am I" β no duplicated fact, so nothing can disagree |
T-178 |
| 2026-07-25 |
Document-link information moves under gl; flat document-root fields are avoided, and unmatching a transaction must wipe GL information with it |
T-178 |
| 2026-07-25 |
The WOPC table keeps its original single rule under the header row, not the full grid the measured template draws β a deliberate departure from the template |
T-178 |
| 2026-07-25 |
Contractor tables render at full type size wherever the page allows, stepping down only for a crowded one-pager |
T-178 |
| 2026-07-25 |
WOPC pagination is a fixed-count rule β 9 / 10Β·10 / 10Β·15Β·10 β not a content-height engine (corrected 2026-07-30: the reimbursement one-pager is now 8, not 9 β the single-page body shift for the window envelope cost a row; the 10Β·10 / 10Β·15Β·10 multi-page shape is unchanged β T-194) |
T-178 |
| 2026-07-25 |
Non-related-party WOPCs close unsigned with the company-level "For and on behalf of Establish Records Limited"; only related parties are signed and sealed |
T-178 |
| 2026-07-25 |
The closing's job title comes from Individual.system.position β no new field on the RBAC user profile, which stays an access record |
T-178 |
| 2026-07-25 |
Reimbursement WOPCs are sequenced in the shared ERL-WOPC series, resolved via email β Individual β abbreviation using the directory's existing payee write-through |
T-178 |
| 2026-07-28 |
Receipts settle automatically at the moment the co-director signs β the sign-completion hook settles every backlinked receipt through the same core the manual settle uses; the payment queued behind the signature releases at the same moment (existing purpose-agnostic queue) |
T-178 |
| 2026-07-28 |
The backlink is the reimbursement discriminator β a WOPC with receipts naming it is a reimbursement document; the proposed stored WOPC.purpose field is withdrawn as unnecessary |
T-178 |
| 2026-07-28 |
When a released payment syncs back, auto-match assigns GL 2110 (not contractor fees) to a reimbursement WOPC's payout β confirmed automatic by the owner over manual or propose-only ("2=A"), mirroring how fee payouts have matched since T-168 |
T-178 |
| 2026-07-28 |
A reimbursement payout transaction records nothing about the receipts it repaid β the link lives only on the receipt (settlement.bankTxId); the transaction owns only its GL code (2110). The payout unassign reopens its receipts by query. Owner chose "option 2" over storing gl.receiptIds (Refined 2026-08-04: the payout tx now also carries the DOCUMENT reference β gl['2110'].wopcRef, T-193 β still nothing about receipts) |
T-178 |
| 2026-07-28 |
A transaction stores its own facts and a reference, not a copy of detail the attached document owns β a WOPC-matched tx reads payee/contractor/bank/project detail from the WOPC, not from denormalised gl[code] copies that go stale and are lossy for multi-project WOPCs (owner: "if it's stored elsewhere and can be referenced elsewhere, drop it from the tx") |
T-191 |
| 2026-07-28 |
A 2110 reimbursement transaction's gl['2110'] node stores only wopcRef β no denormalised payee/contractor/bank/project copies; the WOPC is the single source (the T-191 references-not-copies contract, applied to T-178's new 2110 write path) |
T-192 |
| 2026-07-28 |
Receipt metadata's twelve loose scalars regroup into review / accounting / settlement / matching / wopc maps β fields that answer the same question live in the same map; the document ROOT stays untouched (shared document-store shape) |
T-178 |
| 2026-07-28 |
Processed receipts are read-only: once confirmed, no editing, AI re-run or deletion β server-refused and buttons hidden; a receipt that entered the books cannot drift from what was posted |
T-178 |
| 2026-07-28 |
A reimbursement WOPC to a director goes through the same another-director signing pipeline as fee WOPCs β the payee decides the procedure, the document type only decides the content; non-director reimbursements stay unsigned |
T-178 |
| 2026-07-28 |
For a director's reimbursement the signature gates the settlement β receipts cannot settle until the co-director signs; the books deliberately wait for the control (chosen over settle-now-sign-later) |
T-178 |
| 2026-07-28 |
The 2110 settle leg (DR 2110 / CR bank) is owned by the payout transaction when one is linked β settling assigns GL 2110 to that transaction; the receipt owns the leg only for unlinked settles. Exactly one owner per settle, in every data state |
T-178 |
| 2026-07-28 |
Unassigning a reimbursement payout resets its receipts β removing GL 2110 from a transaction wipes its document links and reopens the receipts it settled, so the books and the receipts can never disagree |
T-178 |
| ~~2026-07-24~~ |
~~GL 2110 is excluded from the Match-Transaction dropdown β the payable is derived from receipt data and a direct match would double-post~~ Superseded 2026-07-28: with transaction ownership a direct 2110 match posts once, so the dropdown allows it again |
T-178 |