Liquid mainīgo izmantošana lietotnē Shopify Flow

Liquid mainīgie ir valodā Liquid definēti vietturi, kas darbplūsmas izpildes laikā tiek aizstāti ar vērtībām no GraphQL Admin API. Mainīgie var aprakstīt darbplūsmās iesaistīto klientu, pasūtījumu un produktu atribūtus, piemēram, pasūtījuma numuru, pasūtījuma cenu vai klienta vārdu un uzvārdu. Mainīgos var izmantot nosacījumos, lai kontrolētu darbplūsmas loģiku, vai lai izvadītu datus no darbības.

Mainīgo pievienošana darbplūsmās, izmantojot Liquid

Tu vari pievienot mainīgos, izmantojot Liquid, jebkuram teksta laukam, kurā ir saite Pievienot mainīgo. Noklikšķini uz saites Pievienot mainīgo zem attiecīgā lauka un pēc tam izvēlies mainīgo no saraksta.

Darbības Nosūtīt iekšēju e-pasta vēstuli konfigurācijas paneļa attēls, kurā izcelta opcija 'Pievienot mainīgo' zem lauka Tēma.

Mainīgie sarakstā Pievienot mainīgo ir filtrēti, lai tu izmantotu tikai tos mainīgos, kurus atgriež pirms pašreizējā sola veiktie soļi, piemēram, trigeri. Piemēram, trigeris Pasūtījums izveidots (Order Created) nodrošina pasūtījuma un veikala resursus no Admin API, ko var ievietot kā mainīgos. Kad izvēlies mainīgo no saraksta, tas tiek pievienots tekstlodziņam kā atbilstoši formatēts Liquid kods.

Tu vari arī rakstīt Liquid kodu tieši teksta laukā. Piemēram, vari izmantot mainīgo {{ order.name }}, lai parādītu pasūtījuma virkni no Shopify administrēšanas paneļa, piemēram, order-123.

Tā kā Flow izmanto Admin API, lai izgūtu datus Liquid kodam, mainīgo sintaksē tiek izmantots kameļraksts (camel case). Kameļraksta mainīgajos pirmais vārds sākas ar mazo burtu, bet nākamie vārdi sākas ar lielo burtu, piemēram, firstName vai canMarkAsPaid. Piemēram, lai piekļūtu datumam, kad produkts tika izveidots, ievadi {{ product.createdAt }}. Ja izmanto Liquid sintaksi Shopify tēmā, kas neizmanto kameļrakstu, tad jāievada {{ product.created_at }}.

Nosacījuma un iterācijas Liquid tagi

Liquid tagus var izmantot kopā ar mainīgajiem, lai veiktu šādas funkcijas:

  • Rakstīt nosacījuma priekšrakstus, piemēram, lai noteiktu, vai pasūtījuma kopsumma ir lielāka par 100 $.
  • Iterēt cauri objektu sarakstam, piemēram, izvadot datus par katru rindas vienumu pasūtījumā.

Tu vari izmantot Liquid tagus, lai rakstītu šos priekšrakstus un iterētu cauri objektiem.

Piemēram, šis Liquid kods parāda pasūtījuma numuru, ja pasūtījuma kopsumma ir lielāka par 100 $:

{% if order.totalPriceSet.shopMoney.amount > 100 %}
  Order number: {{ order.name }}
{% endif %}

Tu vari izmantot arī for ciklu, lai iterētu cauri objektu sarakstam, piemēram, pasūtījuma rindas vienumiem. Piemēram, šis Liquid kods parāda katra pasūtījuma rindas vienuma nosaukumu:

{% for li in order.lineItems %}
  {{ li.title }}
{% endfor %}

Flow atbalsta šādus Liquid nosacījuma (jeb vadības plūsmas) tagus:

Flow atbalsta arī šādus Liquid iterācijas tagus:

Filtru lietošana mainīgajiem

Tu vari pārveidot mainīgo datus Liquid kodā, izmantojot filtrus. Flow atbalsta visus atvērtā pirmkoda Liquid filtrus.

Piemēram, šis Liquid kods noņem prefiksu no pasūtījuma nosaukuma un izvada to, kas paliek: {{ order.name | remove: "Order-" }}

Lietas, kas jāņem vērā, izmantojot Liquid mainīgos filtros

Pirms mainīgo pārveidošanas ar filtriem ņem vērā tālāk norādīto:

  • Flow neatbalsta punktu pierakstu, kas ir pieejams dažiem filtriem. Piemēram, Flow atbalsta {{ order.lineItems | size }}, bet neatbalsta {{ order.lineItems.size }}.
  • Flow neatbalsta punktu pierakstu metalaukiem. Piemēram, tu nevari izmantot {{ order.metafields.custom.hold_note }}. Tā vietā tev ir jāveido cikls pāri metalaukiem, kā norādīts piemēros.
  • Flow neatbalsta indeksu izmantošanu, lai piekļūtu saraksta vienumiem. Piemēram, tu nevari izmantot {{ order.lineItems[0].title }}. Tā vietā tev ir jāveido cikls pāri rindas vienumiem, kā norādīts piemēros.

Datumu filtri

Papildus standarta Liquid filtriem Flow nodrošina datumu filtrus, lai iegūtu datumu attiecībā pret citu datumu, atbalstot trigeri Ieplānotais laiks (Scheduled time) un funkcijas Iegūt datus (Get data). Šie filtri ir: date_minus un date_plus. Piemēram:

  • Lai atgrieztu datumu par vienu dienu nākotnē: {{ "now" | date_plus: "1 day" }}
  • Lai atgrieztu datumu par vienu dienu pagātnē: {{ "now" | date_minus: "1 day" }}

Šie filtri kā ilguma vienību pieņem second, minute, day, week, month un year gan vienskaitlī (piemēram, second), gan daudzskaitlī (piemēram, seconds). Tu vari norādīt arī šādu veidu pielāgojamās vienības:

  • Vesels skaitlis, kas atspoguļo sekunžu skaitu: {{ "now" | date_minus: 3600 }}, kur 3600 ir vienāds ar 1 stundu.
  • ISO8601 ilguma virkne: {{ "now" | date_minus: "P1Y2D" }}, kur P1Y2D nozīmē 1 gadu un 2 dienas.

Kriptogrāfijas filtri

Flow nodrošina kriptogrāfijas filtrus jaukšanai (hashing) un jaukšanā balstītu ziņojumu autentifikācijas kodu (HMAC) izveidei. Šie filtri ir noderīgi, lai izveidotu unikālus identifikatorus, kontrolsummas vai integrēšanai ar trešās puses sistēmām, kurām nepieciešami konkrēti jaucējkodu formāti.

Jaukšanas filtri

Shopify Flow atbalsta šādu veidu jaukšanas filtrus:

  • blake3 – izveido BLAKE3 jaucējkodu (ieteicams vispārējai lietošanai).
  • sha256 – izveido SHA-256 jaucējkodu.
  • sha1 – izveido SHA-1 jaucējkodu.
  • md5 – izveido MD5 jaucējkodu.

Vispārīgiem jaukšanas nolūkiem un jaunām ieviešanām ieteicams izmantot blake3, jo tas nodrošina labāku veiktspēju un drošību nekā vecāki algoritmi. Tomēr sha256, sha1 un md5 ir pieejami saderībai ar trešās puses sistēmām.

Lietošanas piemērs: {{ "hello world" | blake3 }} atgriež BLAKE3 jaucējkodu tekstam "hello world".

HMAC filtri

Lai izveidotu HMAC ar slepeno atslēgu, izmanto vienu no šiem atbalstītajiem filtriem:

Lietošanas piemērs:

  • Pamata: {{ "message" | hmac_sha256: "secret_key" }}
  • Ar noslēpumiem (ieteicams): {{ "message" | hmac_sha256: secrets.api_key }}

Mainīgo izmantošanas piemēri ar Liquid lietotnē Shopify Flow

Lai labāk izprastu, kā izmantot Liquid mainīgos, aplūko šos piemērus:

Resursu vietrāžu URL izvade

Tu vēlies izvadīt vietrāžus URL klientam, pasūtījumam un produktam, kas iesaistīti darbplūsmā.

# Output the base Admin URL for your store
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}

# Assign the base Admin url to a variable named base_url:
{%- capture base_url -%}https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}{%- endcapture -%}

# Customer from a Customer trigger:
{{ base_url }}/customers/{{ customer.legacyResourceId }}

# Customer without the base_url:
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}/customers/{{ customer.legacyResourceId }}

# Customer from an Order trigger:
{{ base_url }}/customers/{{ order.customer.legacyResourceId }}

# Order:
{{ base_url }}/orders/{{ order.legacyResourceId }}

# Product:
{{ base_url }}/products/{{ product.legacyResourceId }}

# Product Variant:
{{ base_url }}/products/{{ product.legacyResourceId }}/variants/{{ productVariant.legacyResourceId }}

# Example showing a clickable link in HTML, making use of the URL:
<a href="{{ base_url }}/products/{{ product.legacyResourceId }}">{{ product.title }}</a>

Tagu saraksta konvertēšana par metalauku

Tu vēlies konvertēt tagu kopu par metalauku, kas ir vienas rindas teksta lauku saraksts. Tu izveido darbplūsmu, izmantojot trigeri Product added to store (Produkts pievienots veikalam), un izmanto darbību Update product metafield (Atjaunināt produkta metalauku). Darbības Update product metafield sadaļā Value (Vērtība) tu pievieno šo Liquid kodu. Šajā piemērā ir pieņemts, ka vērtības jāiestata tikai vienreiz, kad produkts tiek izveidots, un ka produktam ir divi atbilstoši tagi: color:red un color:orange.

Liquid piemērs, lai iestatītu vienas rindas teksta lauka sarakstu.
IevadeIzvade
{% capture mf_value %}
{%- for tags_item in product.tags -%}
  {%- if tags_item contains "color:" -%}
    "{{- tags_item | remove_first: "color:" | strip -}}",
  {%- endif -%}
{%- endfor -%}
{% endcapture -%}
[{{mf_value | remove_last: ","}}]
      
["red","orange"]

Dinamiska e-pasta ziņojuma rakstīšana pasūtījumam

Tu vēlies izveidot darbplūsmu, lai nosūtītu e-pasta vēstuli darbiniekam, kad klients pasūtījumā iztērē vairāk nekā 500 $. Tu izveido darbplūsmu, izmantojot trigeri Order created (Pasūtījums izveidots), iestati nosacījumu, kas ir patiess, ja pasūtījuma kopsumma pārsniedz 500 $, un izmanto darbību Send internal email (Nosūtīt iekšēju e-pastu). Darbības Send internal email sadaļā Message (Ziņojums) tu izmanto šos mainīgos.

Mainīgo izmantošanas piemērs, lai norādītu klienta informāciju.
IevadeIzvade
Please send a personal thank you note to {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) for placing an order for $ {{ order.totalPriceSet.shopMoney.amount }}.
Lūdzu, nosūti personīgu pateicības vēstuli Jeanne Dupont (jeanne@example.com) par pasūtījuma veikšanu 763,42 $ vērtībā.

Dinamiska e-pasta ziņojuma rakstīšana produktam ar mazu krājumu daudzumu

Tu nolem, ka personāla loceklis jāinformē, kad produkta krājumi tuvojas beigām un ir jāveic pasūtījums krājumu papildināšanai. Tu izveido darbplūsmu, kas sākas ar trigeri Inventory quantity changed (Krājumu daudzums mainīts), un iestati nosacījumu, kas ir patiess, ja iepriekšējais krājumu daudzums ir mazāks vai vienāds ar 10. Darbības Send internal email (Nosūtīt iekšēju e-pastu) sadaļā Message (Ziņojums) tu izmanto šos mainīgos.

Mainīgo izmantošanas piemērs, lai norādītu vienuma informāciju.
IevadeIzvade
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Lūdzu, pasūti atkārtoti preci High Waist Leggings - Black. Sūti e-pastu uz owner@example.com, lai apstiprinātu, ka viņi ir saņēmuši pirkuma pasūtījumu.

Dinamiska e-pasta ziņojuma rakstīšana, lai informētu personālu par krāpniecisku pasūtījumu

Tu vēlies atcelt pasūtījumus, kuriem ir augsts riska līmenis, bet dod priekšroku tam, lai personāls atceltu pasūtījumu manuāli. Tu izveido darbplūsmu, kas sākas ar trigeri Order created (Pasūtījums izveidots), un iestati nosacījumu, kas ir patiess, ja pasūtījuma riska līmenis ir augsts. Darbības Send internal email (Nosūtīt iekšēju e-pastu) sadaļā Message (Ziņojums) tu izmanto šos mainīgos.

Mainīgo izmantošanas piemērs, lai sniegtu informāciju par krāpniecisku pasūtījumu.
IevadeIzvade
Our Shopify store has received an order with a high risk of fraud. We would like to cancel this order right away, before it is sent to production:
{{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }}
Please confirm the new order status. Thanks!
Mūsu Shopify veikals ir saņēmis pasūtījumu ar augstu krāpšanas risku. Mēs vēlamies nekavējoties atcelt šo pasūtījumu, pirms tas tiek nosūtīts ražošanai:

#1001
Dupont, Jeanne
jeanne@example.com

Lūdzu, apstipriniet jauno pasūtījuma statusu. Paldies!

Pasūtījuma rindas vienumu izvade, izmantojot ciklu for

Saņemot pasūtījumu, var būt noderīgi nosūtīt ziņojumu, kas satur pasūtītos produktus. To var izdarīt, izmantojot for loop (ciklu for), kas atkārtoti izpilda koda bloku. Teksta lauki, kas atbalsta mainīgos, atbalsta arī ciklus for un objektu forloop.

Piemēram, tu vēlies izveidot darbplūsmu, kas atgriež sarakstu ar visiem pasūtījuma SKU un daudzumiem. Darbības Send internal email (Nosūtīt iekšēju e-pastu) sadaļā Message (Ziņojums) tu izmanto šos mainīgos.

Cikla for izmantošanas piemērs, lai sniegtu informāciju par pasūtījumu.
IevadeIzvade
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Pasūtījuma kopsavilkums:
8987097979 (50)
8877778887 (3)
888998898B (1)

Pasūtījuma rindas vienumu izvade ar papildinformāciju, izmantojot ciklu for

Tu nolem pievienot e-pastam vairāk informācijas, tostarp produkta nosaukumu, SKU, cenu par vienumu un klienta piegādes informāciju. Darbības Send internal email (Nosūtīt iekšēju e-pastu) sadaļā Message (Ziņojums) tu izmanto šos mainīgos.

Piemērs par "for" cikla izmantošanu, lai sniegtu plašāku informāciju par pasūtījumu.
IevadeIzvade
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Pasūtījuma kopsavilkums:
Produkts: High Waist Leggings - Black
SKU: 8987097979
Cena (par vienību): $8.49
Daudzums: 5
Produkts: Athletic Socks - Blue
SKU: 888998898B
Cena (par vienību): $5.61
Daudzums: 2

Izvadi atsevišķus rindas vienumus, apvienojot "for" ciklu ar "if" priekšrakstu

Tev jāizseko pārdotie vienumi, kurus nodrošina konkrēts piegādātājs. Darbības Send internal email sadaļā Message izmanto šādus mainīgos un savā for ciklā iekļauj if priekšrakstu.

Piemērs par "for" cikla un "if" priekšraksta izmantošanu, lai sniegtu informāciju par pasūtījumu konkrētiem piegādātājiem.
IevadeIzvade
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Pārdots Acme produkts:
Produkta nosaukums: High Waist Leggings - Black
SKU: 8987097979

Kompleksi datu objekti platformā Shopify Flow

Flow ļauj piekļūt gandrīz jebkuriem datiem, kas atrodas GraphQL Admin API. Tas ietver kompleksus datu objektus, piemēram, sarakstus un objektus. Tomēr ir daži ierobežojumi tam, ko tu vari darīt ar šiem objektiem. Šajā sadaļā ir aprakstīti šie ierobežojumi un sniegti piemēri, kā ar tiem strādāt.

Tā vietā, lai izsauktu sarakstus un objektus tieši, tev jāveido saraksta cikls un jāiekļauj tikai vēlamie lauki.

Piemēram, tā vietā, lai tieši izsauktu {{ order.lineItems }}, izmanto tālāk norādīto formātu, lai izsauktu konkrētus laukus. Šie piemēri ietver visus laukus, kas tiktu iekļauti, tieši izsaucot sarakstu vai objektu. Nokopē un ielīmē laukus, kas tev nepieciešami.

Teksts
{% for li in order.lineItems %}
    {% comment %}li.contract - omitted{% endcomment %}

{% for ca in li.customAttributes %}
    {{ ca.key }}
    {{ ca.value }}
{% endfor %}

{% for da in li.discountAllocations %}
    {{ da.allocatedAmountSet.presentmentMoney.amount }}
    {{ da.allocatedAmountSet.presentmentMoney.currencyCode }}
    {{ da.allocatedAmountSet.shopMoney.amount }}
    {{ da.allocatedAmountSet.shopMoney.currencyCode }}
{% endfor %}

{{ li.discountedTotalSet.presentmentMoney.amount }}
{{ li.discountedTotalSet.presentmentMoney.currencyCode }}
{{ li.discountedTotalSet.shopMoney.amount }}
{{ li.discountedTotalSet.shopMoney.currencyCode }}

{{ li.discountedUnitPriceSet.presentmentMoney.amount }}
{{ li.discountedUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.discountedUnitPriceSet.shopMoney.amount }}
{{ li.discountedUnitPriceSet.shopMoney.currencyCode }}

{% comment %}li.duties - omitted {% endcomment %}

{{ li.fulfillableQuantity }}

{{ li.fulfillmentService.callbackUrl }}
{{ li.fulfillmentService.fulfillmentOrdersOptIn }}
{{ li.fulfillmentService.handle }}
{{ li.fulfillmentService.id }}
{{ li.fulfillmentService.inventoryManagement }}
{% comment %}rest of location omitted{% endcomment %}
{{ li.fulfillmentService.location.name }}
{{ li.fulfillmentService.productBased }}
{{ li.fulfillmentService.serviceName }}
{% for sm in li.fulfillmentService.shippingMethods %}
    {{ sm.code }}
    {{ sm.label }}
{% endfor %}
{{ li.fulfillmentService.type }}

{{ li.fulfillmentStatus }}
{{ li.id }}

{{ li.image.altText }}
{{ li.image.height }}
{{ li.image.id }}
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
{{ li.image.width }}

{{ li.merchantEditable }}
{{ li.name }}
{{ li.nonFulfillableQuantity }}

{{ li.originalTotalSet.presentmentMoney.amount }}
{{ li.originalTotalSet.presentmentMoney.currencyCode }}
{{ li.originalTotalSet.shopMoney.amount }}
{{ li.originalTotalSet.shopMoney.currencyCode }}

{{ li.originalUnitPriceSet.presentmentMoney.amount }}
{{ li.originalUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.originalUnitPriceSet.shopMoney.amount }}
{{ li.originalUnitPriceSet.shopMoney.currencyCode }}

{% comment %}rest of product omitted{% endcomment %}
{{ li.product.title }}

{{ li.quantity }}
{{ li.refundableQuantity }}
{{ li.requiresShipping }}
{{ li.restockable }}

{{ li.sellingPlan.name }}

{{ li.sku }}

{% for tl in li.taxLines %}
    {{ tl.priceSet.presentmentMoney.amount | json }}
    {{ tl.priceSet.presentmentMoney.currencyCode | json }}
    {{ tl.priceSet.shopMoney.amount | json }}
    {{ tl.priceSet.shopMoney.currencyCode | json }}
    {{ tl.rate | json }}
    {{ tl.ratePercentage | json }}
    {{ tl.title | json }}
{% endfor %}

{{ li.taxable }}
{{ li.title }}

{{ li.totalDiscountSet.presentmentMoney.amount }}
{{ li.totalDiscountSet.presentmentMoney.currencyCode }}
{{ li.totalDiscountSet.shopMoney.amount }}
{{ li.totalDiscountSet.shopMoney.currencyCode }}

{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode }}

{{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode }}

{{ li.unfulfilledQuantity }}

{% comment %}rest of variant omitted{% endcomment %}
{{ li.variant.title }}

{{ li.variantTitle }}
{{ li.vendor }}

{% endfor %}

json
{
    "lineItems": [
        {% for li in order.lineItems %}
            {% if forloop.first != true %},{% endif %}
        {
            "contract": {
                {% comment %}rest of contract omitted{% endcomment %}
                "id": {{ li.contract.id | json }}
            },
            "customAttributes": [
                {% for ca in li.customAttributes %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        "key":{{ ca.key | json }},
                        "value":{{ ca.value | json }}
                    }
                {% endfor %}
            ],
&#x22;discountAllocations&#x22;: [
            {% for da in li.discountAllocations %}
                {% if forloop.first != true %},{% endif %}
                &#x22;allocatedAmountSet&#x22;: {
                    &#x22;presentmentMoney&#x22; : {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
                    },
                    &#x22;shopMoney&#x22;: {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.shopMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
                    }
                }
            {% endfor %}
        ],

        &#x22;discountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;discountedUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },
        &#x22;duties&#x22;: [
            {% for duty li.duties %}
            {% if forloop.first != true %},{% endif %}
            {
                {% comment %}rest of duties omitted{% endcomment %}
                &#x22;id&#x22;: {{ duty.id | json }}
            }
            {% endfor %}
        ],
        &#x22;fulfillableQuantity&#x22;: {{ li.fulfillableQuantity | json }},

        &#x22;fulfillmentService&#x22;: {
            &#x22;callbackUrl&#x22;:{{ li.fulfillmentService.callbackUrl | json }},
            &#x22;fulfillmentOrdersOptIn&#x22;: {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
            &#x22;handle&#x22;: {{ li.fulfillmentService.handle | json }},
            &#x22;id&#x22;: {{ li.fulfillmentService.id | json }},
            &#x22;inventoryManagement&#x22;: {{ li.fulfillmentService.inventoryManagement | json }},
            {% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
            &#x22;productBased&#x22;: {{ li.fulfillmentService.productBased | json }},
            &#x22;serviceName&#x22;: {{ li.fulfillmentService.serviceName | json }},
            &#x22;shippingMethods&#x22;: [
                {% for sm in li.fulfillmentService.shippingMethods %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        &#x22;code&#x22;: {{ sm.code | json }},
                        &#x22;label&#x22;: {{ sm.label | json }}
                    }
                {% endfor %}
            ],
            &#x22;type&#x22;: {{ li.fulfillmentService.type | json }}

        },
        &#x22;fulfillmentStatus&#x22;: {{ li.fulfillmentStatus | json }},
        &#x22;id&#x22;: {{ li.id | json }},
        &#x22;image&#x22;: {
            &#x22;altText&#x22;: {{ li.image.altText | json }},
            &#x22;height&#x22;: {{ li.image.height | json }},
            &#x22;id&#x22;: {{ li.image.id | json }},
            {% comment %}li.image.metafield omitted{% endcomment %}
            {% comment %}li.image.privateMetafield omitted{% endcomment %}
            &#x22;width&#x22;:{{ li.image.width | json }}
        },
        &#x22;merchantEditable&#x22;: {{ li.merchantEditable | json }},
        &#x22;name&#x22;: {{ li.name | json }},
        &#x22;nonFulfillableQuantity&#x22;: {{ li.nonFulfillableQuantity | json }},

        &#x22;originalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;originalUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;product&#x22;: {
            {% comment %}rest of Product omitted{% endcomment %}
            &#x22;title&#x22;: {{ li.product.title | json }}
        },

        &#x22;quantity&#x22;: {{ li.quantity | json }},
        &#x22;refundableQuantity&#x22;: {{ li.refundableQuantity | json }},
        &#x22;requiresShipping&#x22;: {{ li.requiresShipping | json }},
        &#x22;restockable&#x22;: {{ li.restockable | json }},

        &#x22;sellingPlan&#x22;: {
            &#x22;name&#x22;: {{ li.sellingPlan.name | json }}
        },

        &#x22;sku&#x22;: {{ li.sku | json }},

        &#x22;taxLines&#x22;: [
            {% for tl in li.taxLines %}
                {% if forloop.first != true %},{% endif %}
                {
                    &#x22;priceSet&#x22;: {
                        &#x22;presentmentMoney&#x22; : {
                            &#x22;amount&#x22;: {{ tl.priceSet.presentmentMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.presentmentMoney.currencyCode | json }}
                        },
                        &#x22;shopMoney&#x22;: {
                            &#x22;amount&#x22;: {{ tl.priceSet.shopMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.shopMoney.currencyCode | json }}
                        }
                    },
                    &#x22;rate&#x22;: {{ tl.rate | json }},
                    &#x22;ratePercentage&#x22;: {{ tl.ratePercentage | json }},
                    &#x22;title&#x22;: {{ tl.title | json }}
                }
            {% endfor %}
        ],
        &#x22;taxable&#x22;:{{ li.taxable | json }},
        &#x22;title&#x22;:{{ li.title | json }},

        &#x22;totalDiscountSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledDiscountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledOriginalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledQuantity&#x22;: {{ li.unfulfilledQuantity | json }},

        &#x22;variant&#x22;: {
            {% comment %}rest of variant omitted {% endcomment %}
            &#x22;title&#x22;: {{ li.variant.title | json }}
        },

        &#x22;variantTitle&#x22;: {{ li.variantTitle | json }},
        &#x22;vendor&#x22;: {{ li.vendor | json }}
    }
{% endfor %}
]

}