- 7 minutes to read

Order Planned Stylesheet

This page provides the Liquid Stylesheet O2C - View Order Planned for the JSON Order Planned messages (Step 4) in the Order-to-Cash demo.

Production Schedule SCH-2025-10005 for order ORD-10005 and Tailspin Toys rendered by the O2C - View Order Planned Stylesheet, with priority HIGH, one production line, one material, and the order amount (7.12)
The JSON Order Scheduled message rendered as a production schedule: priority, ready-by date, the production lines with their shift and duration, and the materials.

Show planners the schedule, not the JSON. With Nodinite Stylesheets, the planning message reads as a production schedule with its lines and materials. On this page, you will:

  • ✅ Transform the JSON Order Scheduled message into a production schedule with Liquid
  • ✅ Loop over the production lines and the materials of the order
  • ✅ Open the schedule from Log Views and from BPM Log Search New 7.11

Understanding the Order Planned Stylesheet

A Stylesheet is tied to a Message Type. The business Log Event of Step 4, Production Scheduled in ERP, carries the Message Type O2C.Order.Scheduled/1.0, so Nodinite offers O2C - View Order Planned for it. With Message Body is Json checked, Nodinite parses the JSON body and hands its properties to the template as variables, such as scheduleId and productionLines.

graph LR A["fa:fa-inbox Order Planned
Log Event (JSON)"] --> B{"fa:fa-tags Message Type
O2C.Order.Scheduled/1.0"} B --> C["fa:fa-file-code O2C - View Order Planned
(Liquid, Message Body is Json)"] C --> D["fa:fa-file-alt Production schedule"] D --> E1["fa:fa-search Log Views"] D --> E2["fa:fa-sitemap BPM Log Search"] style A fill:#2678BD style B fill:#9E59BB style C fill:#3F827B style D fill:#93d16d style E1 fill:#2678BD style E2 fill:#2678BD

The Order Planned Log Event (blue) is matched to its Message Type (purple); the Liquid Stylesheet (teal) renders the schedule (green), which users open from a Log View or from BPM Log Search (blue).

Where Users Open the Production Schedule

Where How
Log Views Search the Log View, open Action on the Production Scheduled in ERP event, and choose View message formatted as 'O2C - View Order Planned'.
BPM Log Search New 7.11 Click Log Search on the Order-to-Cash BPM, search for the order number, and open Action on the Production Scheduled event in the BPM Viewer.

The dialog is titled View message body formatted as 'O2C - View Order Planned' and has the buttons Open in New Window, Print, and Close. The forwarding event of the step, Planning Request Received, logs O2C.Forwarding/1.0, so this Stylesheet isn't offered there.

Stylesheet Settings

Setting Value Why
Name O2C - View Order Planned The name users pick in the Action menu
Type Liquid The Order Scheduled body is JSON
Render as HTML Checked The template outputs HTML
Message Body is Json Checked Exposes scheduleId, productionLines, materials, and the other properties as Liquid variables
Message Types O2C.Order.Scheduled/1.0 Only the Step 4 business event gets the Stylesheet

Important

With Message Body is Json unchecked, the template still renders, but every field is empty: the JSON stays one string in data.

Input JSON

The Order Scheduled body of order 1 as logged by the demo data script, the same message as on the Step 4 page. Orders of 500 USD or more get the priority HIGH.

{
  "scheduleId": "SCH-2025-10001",
  "orderId": "ORD-10001",
  "customerId": "CUST-001",
  "customerName": "Contoso Corporation",
  "orderDate": "2025-10-14T09:15:00Z",
  "scheduleDate": "2025-10-14T09:37:45Z",
  "productionLines": [
    {
      "lineId": "LINE-01",
      "lineName": "Assembly Line A",
      "scheduledStart": "2025-10-16T06:00:00Z",
      "scheduledEnd": "2025-10-16T14:30:00Z",
      "expectedDuration": 510,
      "shift": "DAY",
      "capacity": 50
    }
  ],
  "materials": [
    {
      "materialId": "MAT-SKU-DEMO-001",
      "sku": "SKU-DEMO-001",
      "description": "Demo Widget",
      "quantityRequired": 1,
      "quantityAllocated": 1,
      "availableAtScheduleTime": true
    }
  ],
  "orderQuantity": 1,
  "orderAmount": 99.95,
  "currency": "USD",
  "priorityLevel": "NORMAL",
  "schedulingStatus": "CONFIRMED",
  "estimatedCompletionDate": "2025-10-16T14:30:00Z"
}

The property order varies between runs, because the script serializes a PowerShell hashtable; Liquid reads properties by name, so the order doesn't matter.

JSON to Schedule Mapping

JSON property Shown in the schedule as
scheduleId, orderId The title, Planned for order, and Order ID
customerName, customerId Customer
orderQuantity, priorityLevel Quantity, Priority
estimatedCompletionDate Ready by
schedulingStatus Status, as a badge
productionLines[] Production Lines table: Line, Name, Shift, Start, End, Minutes (expectedDuration)
materials[] Materials table: Material, SKU, Description, Required, Allocated, In stock (Yes when availableAtScheduleTime is true)
orderAmount, currency Order amount

The JSON parser normalizes dates and numbers before Liquid sees them: 2025-10-16T14:30:00Z shows as 2025-10-16 14:30:00, and 1245.0 shows as 1245. To print amounts with two decimals, see Amounts with two decimals.

Liquid Template

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<div class="container mt-4">
  <h1 class="mb-0">Production Schedule {{ scheduleId }}</h1>
  <span class="text-muted">Planned for order {{ orderId }}</span>
  <table class="table mt-3">
    <thead>
      <tr><th>Order ID</th><th>Customer</th><th>Quantity</th><th>Priority</th><th>Ready by</th><th>Status</th></tr>
    </thead>
    <tbody>
      <tr>
        <td><strong>{{ orderId }}</strong></td>
        <td><strong>{{ customerName }}</strong><br/><span class="text-muted">{{ customerId }}</span></td>
        <td>{{ orderQuantity }}</td>
        <td>{{ priorityLevel }}</td>
        <td>{{ estimatedCompletionDate }}</td>
        <td><span class="badge badge-success">{{ schedulingStatus }}</span></td>
      </tr>
    </tbody>
  </table>
  <h5 class="mt-4">Production Lines</h5>
  <table class="table table-sm">
    <thead>
      <tr><th>Line</th><th>Name</th><th>Shift</th><th>Start</th><th>End</th><th class="text-right">Minutes</th></tr>
    </thead>
    <tbody>
      {%- for line in productionLines -%}
      <tr><td>{{ line.lineId }}</td><td>{{ line.lineName }}</td><td>{{ line.shift }}</td><td>{{ line.scheduledStart }}</td><td>{{ line.scheduledEnd }}</td><td class="text-right">{{ line.expectedDuration }}</td></tr>
      {%- endfor -%}
    </tbody>
  </table>
  <h5 class="mt-4">Materials</h5>
  <table class="table table-sm">
    <thead>
      <tr><th>Material</th><th>SKU</th><th>Description</th><th class="text-center">Required</th><th class="text-center">Allocated</th><th class="text-center">In stock</th></tr>
    </thead>
    <tbody>
      {%- for m in materials -%}
      <tr><td>{{ m.materialId }}</td><td>{{ m.sku }}</td><td>{{ m.description }}</td><td class="text-center">{{ m.quantityRequired }}</td><td class="text-center">{{ m.quantityAllocated }}</td><td class="text-center">{% if m.availableAtScheduleTime %}Yes{% else %}No{% endif %}</td></tr>
      {%- endfor -%}
    </tbody>
  </table>
  <p class="text-right">Order amount: <strong>{{ orderAmount }} {{ currency }}</strong></p>
  <div class="mt-5 pt-3 border-top text-center text-muted"><small>Rendered by a Nodinite Stylesheet (Liquid) from the Order Scheduled message</small></div>
</div>

Next Steps