ruumica documentation

Get the bill of quantities

Get the built lengths and counts of a project as of a freeze instant, exact to the millimetre.

The bill of quantities (BoQ) adds up what was built: lengths of spans and cables, slack, and counts of nodes, splices, photos and traces. It is computed from the frozen package in whole millimetres, so totals are exact, and it is also printed in the closeout book.

Before you start

  • DATABASE_URL and ASBUILT_BLOB_DIR are set, and you know the project and the freeze instant.

Steps

  1. Print the BoQ:

    $ asbuilt package boq --project ee-demo --frozen-at 2026-01-01T00:00:00Z
    {
      "lines": [
        {
          "category": "CABLE_ROUTE_LENGTH_3D",
          "item": "FO-12-002",
          "quantity": 129619,
          "unit": "mm"
        },
    …
    
  2. Read each line by its category:

    Category Item Quantity
    SPAN_LENGTH_3D span type, such as TRENCH Total length of spans of that type, along the slope, in mm.
    CABLE_ROUTE_LENGTH_3D cable label Length of the cable’s route through its spans, in mm.
    CABLE_SLACK cable label Total length of the cable’s slack loops, in mm.
    NODE_COUNT node type Number of nodes of that type.
    SPLICE_COUNT closure label Number of splices in that closure.
    EVIDENCE_COUNT evidence kind Number of photos, videos or sketches of that kind.
    TRACE_COUNT verdict Number of OTDR traces with that verdict.

    unit is mm for lengths and pcs for counts. The closeout book prints lengths in metres with three decimals.

  3. To get the BoQ of a delivered package without the database, use its package.json: asbuilt package boq --from-package closeout/package.json.

Check

A cable’s route length is the sum of its spans’ lengths; the BoQ never estimates. Cable length to order is route length plus slack plus the cable’s own excess, which ruumica records as the cable’s length factor.

What can go wrong

You see Meaning Do
A length is missing for a cable The cable has no route recorded at the freeze instant. Record its route, then run again.
Counts are lower than expected Records captured after the freeze instant are not counted. Use a later freeze instant.

Last changed 2026-11-15