Page 1 · Inventory Form Changes (v0.4)
v0.4: Super Structure now changes too (change 4) — earlier drafts wrongly marked it "leave alone". No new accordion section; three existing sections plus config.
← Brief 2. Impact 3. 2D Diagram 4. Pylon Types 5. Counting

Inventory form — what changes, and where

The bridge inventory form is a single page of 9 collapsible accordion sections (not a wizard). Here is every one of them, and whether it changes.

#Accordion sectionVerdictWhat happens
1Administrative DetailsUnchanged—
2Bridge and Location DetailsLeave aloneDo not add "Cable Stayed" to Type of Bridge — see below
3Construction and Agency DetailsUnchanged—
4Carriage Way DetailsChangesOne new value in bridge_pier_type + cascade branch
5Foundation DetailsMain workNew Support Type field + conditional Pylon Details fieldset
6Super StructureChangesPer-span span type, erection method and deck system + cable anchorage
7Approach DetailsUnchanged—
8Miscellaneous DetailsUnchanged—
9Drawings and CommentsUnchanged—

The problem this design solves

On Mindhola, P2–P5 have pylons; P1, P6, P7, P8 don't. BMS cannot express that today. bridge_component_plans is keyed (bridge_id, component_id) with no location column — a component is either present for the whole bridge or absent from it.

The solution: declare pylon-ness per support inside the existing pile_details JSON.

Foundation Details already generates one block per support and stores pile_details[2][pier_height]. We add pile_details[2][support_type]. The component plan then just says "Pylon, qty 4"; which four is read from pile_details — exactly as the 2D diagram already reads pier_height per support.

No migration. No change to the plan / progress / roll-up chain. Nothing that touches the other live girder bridges.

1

Carriage Way Details → one new dropdown value

In config/constant/dropdowns.php, the bridge_pier_type array (currently 4 items) gains a 5th.

'bridge_pier_type' => [
    'title' => 'Bridge Pier Type',
    'items' => [
        ['key' => 'single_pier',        'value' => 'Single Pier'],
        ['key' => 'portal_pier',        'value' => 'Portal Pier'],
        ['key' => 'double_pier',        'value' => 'Double Pier'],
        ['key' => 'double_portal_pier', 'value' => 'Double Portal Pier'],
        ['key' => 'cable_stayed',       'value' => 'Cable Stayed'],   // NEW
    ]
],

The cascade in carriage-way.blade.php that force-sets the other 7 Common/Separate selects needs a matching branch:

cable_stayed → carriage_way, abutment_cap, pier_cap, abutment, pier, foundation_abutment, foundation_pier = common

Mindhola is one deck with a median, not twin carriageways — same shape as single_pier.

Known modelling compromise: this conflates "pier arrangement" with "has pylons", which are really independent. A separate orthogonal flag would be cleaner — but it would multiply the four already-duplicated SVG partials into eight. Accepted as debt for phase 1. A double-carriageway cable-stayed bridge would need a 6th value.
⚠ Tell the client: every field in this section is set-once and locked on edit (greyed via pointer-events:none once a value exists). An existing bridge cannot be converted to cable-stayed. New bridges only.
2

Foundation Details → the real work

One new field drives everything. Toggle it below to see the fields swap.

Jump to support:
P2 (Pylon)
pile_details[2][...]
NEW FIELD
pile_details[{k}][support_type]
Only rendered when bridge_pier_type == 'cable_stayed'. Otherwise this field does not exist and nothing changes for existing bridges.
Pile Foundation Details (Pylon)
Unchanged — but note the GAD specifies Ø1500 at pylon supports vs Ø1200 at ordinary piers, so these values differ per support already.
Pylon Details NEW FIELDSET

Replaces Type of Pier / Height of Pier / Pier Dimensions / Pier Cap fields. Pile and Bearing fields stay — a pylon still sits on piles and still carries bearings.

[pylon_shape]
[pylon_lower_height] · pile cap → deck
[pylon_upper_height] · deck → top
[pylon_dimension]
[cable_arrangement]
[cable_count_a1]
[cable_count_a2]
Cable planes are derived, not asked. Single Mast → one central plane. Every other shape → two planes (U/S + D/S). One less field to get wrong, and it matches the GAD, which shows pile clusters on both deck edges at P2–P5.
This pylon → 2 planes · 38 cables at this support
Bearing Details (Pylon)
Unchanged — multi-select + count per bearing type, as today.
RESULTING JSON — what gets stored in bridge_inventory.pile_details

    
Also update the support legend. getSupportMeta() currently labels every interior support "Pn (Pier)". When support_type == 'pylon' it should read "P2 (Pylon)".
3

One new dropdown — pylon_shape

Added to config/constant/dropdowns.php.

'pylon_shape' => [
    'title' => 'Pylon Shape',
    'items' => [
        ['key' => 'h_frame',     'value' => 'H-Frame'],
        ['key' => 'a_frame',     'value' => 'A-Frame'],
        ['key' => 'inverted_y',  'value' => 'Inverted Y'],
        ['key' => 'single_mast', 'value' => 'Single Mast (I)'],
        ['key' => 'diamond',     'value' => 'Diamond'],
        ['key' => 'vase',        'value' => 'Vase'],
    ]
],
Geometry note that saves work: in a longitudinal elevation — which is what the BMS 2D diagram draws — an H-frame, an A-frame and an inverted-Y all look like the same single tower. The leg arrangement is only visible in plan view or a transverse section. So pylon shape drives the plan-view band, and the elevation renderer can stay shape-agnostic. See page 3.
Don't forget the PDF export. export/bridgeform.blade.php resolves labels via dropdownLabel() against the display-only config arrays. If pylon_shape isn't registered there too, the export prints raw keys like h_frame.
4

Super Structure → per-span fields

Not every span on this bridge is built the same way. That's the whole reason this section changes.

Why the existing fields aren't enough

The current form captures one girder configuration per span — a count, a depth, a strand count. That works when every span is a row of precast girders dropped onto pier caps. It breaks here for two reasons:

  • The GAD's legend lists "RCC Main Girder" and "PSC Edge Girder" on the same sheet — two girder systems in one deck. There's nowhere to put the second.
  • Approach spans are precast and launched; main spans are built outward from the pylons as cables are stressed. Same bridge, completely different construction sequence — and therefore different progress tracking.
Jump to span:
P2 - P3 - Super Structure
MAIN SPAN super_structure_details[2][...]
EXISTING FIELDS — UNCHANGED
Footpath, crash barrier and wearing coat fields are also unchanged. Length of Span finally gets used — the 2D diagram reads it for proportional span widths (page 3).
Span Classification NEW

Only rendered when bridge_pier_type == 'cable_stayed'.

[span_type] · auto-derived, editable
[cable_supported]
[erection_method]
Deck System & Cable Anchorage NEW

Shown when Cable Supported = Yes.

[deck_system]
[cable_anchor_spacing]
[anchorage_type]
[edge_girder_no]
[edge_girder_depth]
[edge_girder_material]
The GAD's "PSC Edge Girder" callout lives here; "RCC Main Girder" stays in the existing girder fields above. That's the second girder system the current form has no room for.
Deck Segments NEW

Shown when Erection Method is a cantilever or segment method — there are no discrete "girders" to count on such a span.

[no_of_segments]
[segment_length]
⚠ This is where the biggest open question bites. If any span uses a cantilever or segment method, the existing Girder cast → stress → launch model doesn't apply to it, and a new Deck Segment component is needed. If every span turns out to be precast-launched girders, no new component is required and the CR stays small. Making this a per-span field means the client answers it span by span rather than for the whole bridge.
Cross-check against Foundation Details

Cable counts are entered per pylon in Foundation Details; anchor spacing is entered per span here. They describe the same cables from two directions, so the form should validate them against each other — this catches a whole class of data-entry error before it reaches progress tracking.

RESULTING JSON — bridge_inventory.super_structure_details

    

Two things developers will be tempted to change — don't

✗ Don't add "Cable Stayed" to type_of_bridge

That dropdown is administrative classification — Major / Minor / ROB / Flyover / River Bridge. Mindhola is a River Bridge. Structure type belongs in Carriage Way Details, not here.

✗ Don't add a cable_stayed option to super_structure_details[type]

That dropdown describes the deck material and form — RCC / PSC / Composite, then solid slab / voided slab / girder slab / box girder. "Cable stayed" isn't a member of that set; it describes how the deck is supported, which is a different axis entirely. Adding it there would break the existing sub-type cascade for no gain.

The cable-stayed information belongs in the new per-span fields added in change 4 above — span_type, cable_supported, erection_method and deck_system. Keep the two axes separate.

Page 1 of 3 · Next: downstream impact map →