Struxen Docs

WIP and accounting exports

Work in progress and job cost for one project or the whole company, and the reviewed CSV file that hands a month to accounting

Two things close a month: the WIP schedule, which says where the job stands, and the accounting export, which hands the month's records to whatever system keeps the books.

The WIP schedule

WIP Schedule in the Period Reports group reports one project: what it is worth, what it will cost, how far through it is on cost, and whether billing is ahead of or behind the revenue earned.

It renders as a statement in four groups rather than as a thirteen-column table, because a single row under thirteen headers is a lot of horizontal scrolling to read one job. The horizontal table is the portfolio.

Reading it needs Invoicing READ_ONLY. Individual figures also need READ_ONLY on Contracts, Budget or Direct Costs depending on where they come from.

Contract

LineWhat it is
Contract valueOriginal value plus executed owner change orders, across executed and complete prime contracts
Billed to dateCertified, on the figures the owner agreed rather than the ones applied for
Billed this period
Retention held by the ownerFrom the latest certified application

Contracts that are not counted, because they are unsigned or terminated, are counted back and named beside the figure.

Cost

LineWhat it is
Estimated cost at completionThe current budget's revised budget total, plus the certified adjustment
Costs incurred to dateApproved subcontract billing plus approved direct costs
Cost to completeEstimated cost at completion less costs incurred to date

Costs incurred is composed from two LEDGER registers, not from a general ledger. There is no payroll feed, no accounts-payable feed and no ERP import behind it. It is what your approved subcontractor invoices and approved direct costs say.

Earnings

Percent complete is on a cost basis: costs incurred divided by the estimate at completion. Earned revenue is the contract value at exactly that percent, so the printed percent is the operand and a controller checking by hand finds contract value times percent equals earned revenue.

LineWhat it is
Percent completeCosts incurred divided by estimate at completion
Earned revenueContract value at that percent
Estimated gross profitContract value less estimate at completion
Estimated fee remainingEstimated gross profit less the profit already earned

Percent complete is not clamped: a job whose costs have run past its estimate reads above 100%. If the estimate at completion is zero or negative, the percent is Not stated rather than 0%.

Position

The billing position is one of two lines, whichever applies:

  • Billings in excess of costs and estimated earnings, when billed to date exceeds earned revenue.
  • Costs and estimated earnings in excess of billings, when earned revenue exceeds billed to date.

Backlog is contract value not yet earned.

Nothing on this page is coloured as good or bad, and no ratio is compared to a threshold. An overbilling is a financing position, not a finding.

The estimate adjustment

Exactly one figure on the WIP schedule is entered by hand: the estimate at completion adjustment. It rides on top of the live budget rather than replacing it, it is signed, and a written basis is required. Recording one needs Invoicing STANDARD plus the administer-invoicing permission.

The schedule warns when the estimate predates the period being reported, and when it has never been certified at all.

When a figure cannot be shown

Every figure resolves to a value or to one of three refusals, and they stay visually distinct because they send you three different places:

LabelCauseWhere to go
Not shownYou lack the tool permission behind itAn administrator
Could not be readThe read failedSupport
Not statedAn input has not been enteredWhichever input is missing

A refusal cascades: any figure computed from an unavailable one is unavailable too. No figure is ever rendered as $0.00 because something could not be read.

Snapshots

Snapshot this period freezes what the schedule said, as a record. Snapshots are immutable, and a snapshot is re-masked when you read it, so a reader only sees the figures their own permissions allow.

A project can hold up to 500 snapshots.

The WIP portfolio

Settings → WIP portfolio under Account management reports the same schedule for every project in the company, on one table. It is the surety schedule.

This surface is gated on organization OWNER or ADMIN, not on project permissions, and that is a deliberate decision with a consequence worth stating plainly: an organization owner or admin reads contract values, cost plans and margins on projects whose per-project permission set would refuse them. A plain organization member is refused, and so is a project administrator with no organization role.

No project is filtered out. An archived or completed job is still under contract until it is closed out, so every project appears with its status.

The totals strip is all or nothing. If any row failed or is partial, the totals are withheld and the projects responsible are named, split by cause: a read that failed goes to support, and a figure that was never stated is usually a job with no cost plan entered.

There is no portfolio percent complete. A ratio of ratios is not a ratio.

The portfolio also reports how many projects have a stale estimate at completion, a current one, one never compared, one never certified, and how many are unknown.

Up to 250 projects are reported.

Accounting exports

Accounting Exports is the seam through which financial records leave for an accounting system: a file, in one direction, reviewed and accepted by an accounting approver before it exists.

The scope note on the surface says it outright:

Exports leave this platform as a file, in one direction. Nothing here connects to an accounting system, reads one, or learns what happened to a file after it was downloaded.

There is no integration, no push, no sync, and no inbound path. No accounting product is named anywhere, because the file is a generic CSV rather than a vendor-specific format.

What can be exported

Three object types, in dependency order:

Object typeLabel
cost_codeCost Codes
vendorVendors
sub_invoiceSubcontractor Invoices

Commitments and commitment change orders are not in this version.

Vendor tax ids are not in the vendor file.

Batches

An export batch is an immutable staged snapshot of source records plus a review decision.

StatusLabelMeaning
draftDraftBeing assembled
readyReady to exportSubmitted for review
stagedStagedAccepted. Terminal
rejectedRejectedRefused. Terminal

Actions: Submit (Draft to Ready to export), Accept (Ready to Staged), Reject (Ready to Rejected). Neither terminal state has an edge out.

The word "staged" is load-bearing. A batch never reaches "posted", "synced" or "exported to", because the platform cannot know what the receiving system did with the file. Staged carries an information badge, never a success one.

Individual records within a batch carry their own verdict: Awaiting review, Staged or Rejected.

The file

Download the CSV from a batch. One file per object type, named for the object type and the batch.

  • UTF-8, no byte-order mark, CRLF line endings, RFC 4180 quoting.
  • One header row.
  • Booleans are Y and N. Dates are YYYY-MM-DD. An absent value is an empty field, never the word "null".
  • The rows of one bill sum to the amount due.

Text that would otherwise be read as a formula by a spreadsheet is prefixed with an apostrophe. Amount columns are excluded from that treatment, so no figure is ever mangled.

The bytes are not stored. The file is rebuilt deterministically each time it is downloaded, and every download is audited, including a fingerprint of the exact bytes, because bytes leaving the platform is the event worth recording.

Records that have not changed since a previous batch stay in the file, flagged as unchanged rather than being filtered out. What you send is a complete picture, with the disclosure attached.

External ids are up to 10 characters of uppercase letters, digits and hyphens, derived deterministically. An id collision refuses the whole batch and names both sources rather than quietly disambiguating with a suffix.

A truncated source read refuses the batch. An export is the one place in LEDGER that refuses rather than degrading, because a partial file that looks complete is worse than no file.

Who can export

Reading the register needs Invoicing READ_ONLY. Creating, accepting, rejecting or downloading a batch needs the accounting approver capability: Invoicing ADMIN, or the administer-invoicing permission.

Creating a batch also needs READ_ONLY on every tool the object type reads from:

Object typeAlso needs
Cost Codesnothing further
VendorsDirectory, Commitments
Subcontractor InvoicesCommitments, Directory

A missing tool produces a refusal that names it.

Limits

LimitValue
Contracts read per WIP row250
Snapshots per project500
Estimate-adjustment basis text2,000 characters
Projects in the WIP portfolio250
Records per export batch2,000
Export batches per project500
Rejections per batch200
Rejection reason500 characters

Troubleshooting

Percent complete says Not stated. The estimate at completion is zero or negative, usually because no budget has been entered. The product will not print 0% for an undefined ratio.

The WIP portfolio totals strip is missing. At least one project's row failed or is partial. The projects are named above the table, split by cause.

A figure says Not shown. You lack Contracts, Budget or Direct Costs READ_ONLY on that project. Ask an administrator.

Creating an export batch is refused with a list of tools. You need READ_ONLY on each of them for that object type.

An export batch is refused for an id collision. Two source records resolve to the same external id. The refusal names both. Rename one.

On this page