• Purpose

    This snippet lets you automatically display only the relevant hotel details for the supplier listed on a Purchase Order.

    If your hotel_hub custom field contains details for multiple crew or suppliers, this code filters the output to show only the matching entry based on the supplier name in the PO header.

    How It Works

    • Reads the hotel_hub data from the linked opportunity.

    • Finds the section that starts with the supplier’s name (e.g. Andy Brown).

    • Displays only that section of text on the Purchase Order document.

    • Ignores all other entries automatically.

    ———————————————————

    {% assign opportunity = order.sources.first %}

    <!-- Hotel section -->

    <div class="section notes">

      {% assign supplier_name = order.supplier_address_name | strip %}

      {% assign hotel_lines = opportunity.hotel_hub | newline_to_br | split: '<br />' %}

      {% assign matched_block = "" %}

      {% assign current_block = "" %}

      {% assign include_block = false %}

      {% for line in hotel_lines %}

        {% assign clean_line = line | strip %}

        {% if clean_line == supplier_name %}

          {% assign include_block = true %}

          {% assign current_block = clean_line %}

        {% elsif clean_line == "" %}

          {% assign include_block = false %}

        {% endif %}

        {% if include_block %}

          {% assign matched_block = matched_block | append: clean_line | append: "<br />" %}

        {% endif %}

      {% endfor %}

      {% if matched_block != blank %}

        <h4>Hotel Details</h4>

        <p>{{ matched_block }}</p>

      {% endif %}

    </div>

  • Purpose

    This snippet allows you to automatically display the Transport Schedule from an Opportunity directly against an item on a Purchase Order.

    It’s ideal for courier bookings, haulage suppliers, or external transport providers who only need clear, readable transport instructions without accessing the full job.

    The data is pulled straight from the Transport Hub schedule stored on the Opportunity, ensuring the information is always up to date.

    How It Works

    • Reads the linked Opportunity from the Purchase Order.

    • Pulls the transport_schedule stored against the Opportunity Item.

    • Converts line breaks so the schedule formats correctly on documents.

    • Displays the transport schedule inline on the Purchase Order item.

    Example Use Case

    • Courier Purchase Orders

    • External haulage companies

    • Driver paperwork

    • Job-specific transport instructions per item

    ———————————————————

    {% assign opportunity = order.sources.first %}

    {{ item.opportunity_cost.asset.opportunity_item.transport_schedule | newline_to_br }}

  • Purpose

    This snippet allows you to automatically insert the Transport Hub schedule into a Discussion template on an Opportunity.

    It’s ideal for sharing transport details with internal teams and external suppliers, ensuring everyone is working from the same, up-to-date transport plan without copying and pasting.

    The data is pulled directly from the Transport Hub on the Opportunity, so any changes made to the schedule are instantly reflected in the discussion content.

    How It Works

    • Reads the Transport Hub data stored on the Opportunity

    • Pulls the current transport schedule

    • Converts line breaks so formatting is preserved in the discussion

    • Inserts the transport schedule directly into the discussion body

    Example Use Cases

    • Internal team communications

    • External suppliers and haulage partners

    • Courier and transport coordination

    • Ops and warehouse briefings

    • Sharing live transport plans without attachments

    ———————————————————

    {{ opportunity.transport_hub | newline_to_br }}

  • Purpose

    This snippet allows you to display all Transport Hub schedules directly on an Opportunity document.

    It’s ideal for internal paperwork, driver packs, warehouse prep sheets, and job documents where the full transport plan needs to be clearly visible in one place.

    The data is pulled directly from the Transport Hub on the Opportunity, ensuring the document always reflects the latest transport planning without manual updates.

    How It Works

    • Reads the Transport Hub data stored on the Opportunity

    • Pulls the combined transport schedules

    • Converts line breaks so formatting is preserved on documents

    • Displays the full transport schedule inline on the Opportunity document

    Example Use Cases

    • Driver packs

    • Warehouse preparation sheets

    • Internal job paperwork

    • Full transport overview per Opportunity

    ———————————————————

    {{ order.transport_hub | newline_to_br }}

  • Purpose

    This snippet allows you to display the Transport Schedule for an individual Opportunity Item directly on an Opportunity document.

    It’s ideal when different items on the same job have separate transport requirements, allowing clear, item-specific instructions to be shown without cluttering the document with irrelevant details.

    The data is pulled directly from the Transport Hub schedule stored against each Opportunity Item, ensuring transport instructions remain accurate and up to date.

    How It Works

    • Reads the Transport Hub schedule stored on the Opportunity Item

    • Pulls the item-specific transport_schedule

    • Converts line breaks so formatting is preserved on documents

    • Displays the schedule inline against each item

    Example Use Cases

    • Mixed courier and in-house transport on the same job

    • Item-specific delivery or collection instructions

    • Warehouse pick lists with transport notes per item

    • Driver paperwork for split or staged deliveries

    ———————————————————

    {% for item in order.services %}

    {{ item.transport_schedule | newline_to_br }} 

  • Purpose

    This allows you to hide individual Opportunity Items, groups, and related description rows from client-facing documents, including Quotes and Invoices.

    It is ideal for internal only lines such as backup gear, warehouse items, or anything you don’t want the client to see.

    Quote Template Setup

    Find this line in your quote document:

    {% for item in order.items %}

    Replace it with:

    {% for item in order.items %}
    {% if item.hide_from_quote == ‘Yes’ %}
    {% continue %}
    {% endif %}

    Invoice Template Setup

    Find this section in your invoice template:

    <tbody>

    {% for item in invoice.items %}

    Replace it with:

    {% assign opportunity = invoice.sources.first %}

    <tbody>

    {% for item in invoice.items %}

    {% if item.is_item? %}

    {% assign hide_invoice_item = false %}

    {% assign invoice_name_count = 0 %}

    {% for invoice_check_item in invoice.items %}

    {% if invoice_check_item.is_item? and invoice_check_item.name == item.name %}

    {% assign invoice_name_count = invoice_name_count | plus: 1 %}

    {% endif %}

    {% if invoice_check_item.id == item.id %}

    {% break %}

    {% endif %}

    {% endfor %}

    {% assign opportunity_name_count = 0 %}

    {% for opp_item in opportunity.items %}

    {% if opp_item.is_item? and opp_item.name == item.name %}

    {% assign opportunity_name_count = opportunity_name_count | plus: 1 %}

    {% if opportunity_name_count == invoice_name_count %}

    {% if opp_item.hide_from_quote == 'Yes' %}

    {% assign hide_invoice_item = true %}

    {% endif %}

    {% break %}

    {% endif %}

    {% endif %}

    {% endfor %}

    {% if hide_invoice_item == true %}

    {% continue %}

    {% endif %}

    {% endif %}

    Important Notes

    • This depends on invoice item order matching opportunity item order.

    • If item order differs, the item may still appear

    Why it’s useful

    Keeps quotes and invoices clean and client-friendly while still allowing full internal visibility inside the Opportunity.

  • Purpose

    This snippet allows you to display crew schedule information directly on Purchase Order documents using data from Team Hub.

    If your items include a crew_schedule custom field, this will format and display it in a clean, readable way on the document, broken down by date, time, and shifts.

    How it works

    • Reads the crew_schedule data stored against the opportunity item.

    • Splits the structured data into days and shifts.

    • Formats each entry into a clear, human-readable schedule.

    • Displays dates, start/end times, and any shifts.

    • Only shows if schedule data exists, otherwise stays hidden.

    How to use it

    This is important based on how your document is structured

    • Add the snippet inside your item loop ({% for item in order.items %})

    • Place it after the item description / transport schedule section

    • It should sit alongside other item-level details like:

    • Description

    • Transport schedule

    • Notes

    • Find this section in your PO template:

    {% for item in order.items %}

    • Then paste the snippet just before the item.description block

    Code Snippet

    {% assign crew_raw = item.opportunity_cost.asset.opportunity_item.crew_schedule %}

    {% if crew_raw != blank %}

    <tr>

    <td style="padding-left: {{ item.depth_padding | plus:30 }}px;" colspan="6">

    <strong>Crew Schedule</strong><br>

    {% assign day_parts = crew_raw | split:'{"date":"' %}

    {% for day_part in day_parts offset:1 %}

    {% assign day_date = day_part | split:'","shifts":[' | first %}

    {% assign pretty_date = day_date | date: "%A, %b %d" | replace: " 0", " " %}

    {% assign shifts_raw = day_part | split:'","shifts":[' | last %}

    {% assign shift_parts = shifts_raw | split:'{"start":"' %}

    {% for shift_part in shift_parts offset:1 %}

    {% assign shift_start = shift_part | split:'","end":"' | first %}

    {% assign after_end = shift_part | split:'","end":"' | last %}

    {% assign shift_end = after_end | split:'","tags":[' | first %}

    {% assign tags_blob = after_end | split:'","tags":[' | last | split:']' | first %}

    {% assign tags_line = tags_blob | replace:'"','' | replace:',',', ' %}

    {{ pretty_date }}, {{ shift_start }} - {{ shift_end }}<br>

    {% if tags_line != blank %}

    {{ tags_line }}<br>

    {% endif %}

    <br>

    {% endfor %}

    {% endfor %}

    </td>

    </tr>

    {% endif %}

  • Purpose

    This snippet allows you to display Team Hub crew schedules directly on an Opportunity document.

    It’s ideal for internal paperwork, crew call sheets, production packs, and service schedules where the full crew plan needs to be visible against each service item.

    How It Works

    • Reads the Team Hub schedule saved against each service item

    • Falls back to the service record if no item-level schedule is present

    • Parses the stored schedule data into dates, shift times, and shift tags

    • Displays the Team Hub schedule inline beneath each relevant service on the Opportunity document

    Example Use Cases

    • Crew call sheets

    • Internal operations paperwork

    • Project manager packs

    • Per-service crew planning on Opportunity documents

    Important Placement

    Add this inside your Opportunity services loop, usually inside:

    {% for item in order.services %}

    and within the service section, usually inside:

    {% elsif item.is_service? %}

    ———————————————————

    {% if item.service.service_type_name != "Transport" %}

    {% assign crew_raw = item.crew_schedule | strip %}

    {% if crew_raw == blank %}

    {% assign crew_raw = item.service.crew_schedule | strip %}

    {% endif %}

    {% if crew_raw != blank and crew_raw contains '{"date":"' and crew_raw contains '{"start":"' %}

    <tr>

    <td colspan="5" style="padding-left: {{ item.depth_padding | plus:64 }}px;">

    <strong>Crew Schedule</strong><br>

    {% assign day_parts = crew_raw | split:'{"date":"' %}

    {% for day_part in day_parts offset:1 %}

    {% assign day_date = day_part | split:'","shifts":[' | first %}

    {% assign pretty_date = day_date | date: "%A, %b %d" | replace: " 0", " " %}

    {% assign shifts_raw = day_part | split:'","shifts":[' | last %}

    {% assign shift_parts = shifts_raw | split:'{"start":"' %}

    {% for shift_part in shift_parts offset:1 %}

    {% assign shift_start = shift_part | split:'","end":"' | first %}

    {% assign after_end = shift_part | split:'","end":"' | last %}

    {% assign shift_end = after_end | split:'","tags":[' | first | split:'"}' | first %}

    {{ pretty_date }}, {{ shift_start }} - {{ shift_end }}<br>

    {% if after_end contains '","tags":[' %}

    {% assign tags_blob = after_end | split:'","tags":[' | last | split:']' | first %}

    {% assign tags_line = tags_blob | replace:'"','' | replace:',',', ' %}

    {% if tags_line != blank %}

    {{ tags_line }}<br>

    {% endif %}

    {% endif %}

    <br>

    {% endfor %}

    {% endfor %}

    </td>

    </tr>

    {% endif %}

    {% endif %}

DOCUMENT SUPPORT