Liquid ცვლადების გამოყენება Shopify Flow-ში

Liquid ცვლადები არის Liquid-ში განსაზღვრული ადგილის მანიშნებლები, რომლებიც ნაცვლდება GraphQL Admin API-დან მიღებული მნიშვნელობებით სამუშაო პროცესის გაშვებისას. ცვლადებს შეუძლია აღწეროს იმ მომხმარებლების, შეკვეთებისა და პროდუქტების ატრიბუტები, რომლებიც ჩართულია შენს სამუშაო პროცესებში, როგორიცაა შეკვეთის ნომერი, შეკვეთის ფასი ან მომხმარებლის სახელი. ცვლადები შეიძლება გამოყენებულ იქნას პირობებში, რათა გააკონტროლო სამუშაო პროცესის ლოგიკა, ან მოქმედებიდან მონაცემების გამოსატანად.

სამუშაო პროცესებში ცვლადების დამატება Liquid-ის გამოყენებით

შენ შეგიძლია დაამატო ცვლადები Liquid-ის გამოყენებით ნებისმიერ ტექსტურ ველში, რომელიც შეიცავს ბმულს ცვლადის დამატება. დააწკაპუნე ბმულს ცვლადის დამატება შესაბამისი ველის ქვემოთ და აირჩიე ცვლადი სიიდან.

შიდა ელფოსტის გაგზავნის მოქმედების კონფიგურაციის პანელის სურათი, სადაც მონიშნულია ვარიანტი „ცვლადის დამატება“ თემის ველის ქვემოთ.

ცვლადის დამატების სიაში ცვლადები გაფილტრულია, ამიტომ შენ მხოლოდ იმ ცვლადებს იყენებ, რომლებიც დაბრუნებულია მიმდინარე ნაბიჯამდე არსებული ნაბიჯების (მაგალითად, ტრიგერების) მიერ. მაგალითად, შეკვეთა შეიქმნას ტრიგერი უზრუნველყოფს შეკვეთისა და მაღაზიის რესურსებს Admin API-დან, რომელთა ჩასმაც შესაძლებელია ცვლადების სახით. მას შემდეგ, რაც სიიდან აირჩევ ცვლადს, ის ემატება ტექსტის ველს სწორად ფორმატირებული Liquid-ის სახით.

შენ ასევე შეგიძლია პირდაპირ ტექსტის ველში დაწერო Liquid. მაგალითად, შეგიძლია გამოიყენო ცვლადი {{ order.name }} Shopify-ს ადმინიდან შეკვეთის სტრიქონის საჩვენებლად, როგორიცაა order-123.

რადგან Flow იყენებს Admin API-ს Liquid-ისთვის გამოყენებული მონაცემების დასაბრუნებლად, ცვლადის სინტაქსი იყენებს camel case-ს (აქლემისებური რეგისტრი). Camel case ცვლადების შემთხვევაში პირველი სიტყვა იწყება პატარა ასოთი, ხოლო შემდგომი სიტყვები — დიდი ასოთი, მაგალითად: firstName ან canMarkAsPaid. მაგალითად, პროდუქტის შექმნის თარიღზე წვდომისთვის შეიყვანე {{ product.createdAt }}. თუ შენ იყენებ Liquid-ის სინტაქსს Shopify თემაში, რომელიც არ იყენებს camel case-ს, მაშინ უნდა შეიყვანო {{ product.created_at }}.

პირობითი და განმეორებითი Liquid თეგები

Liquid თეგები შეგიძლია გამოიყენო ცვლადებთან შემდეგი ფუნქციების შესასრულებლად:

  • პირობითი განაცხადების დაწერა, მაგალითად, იმის დადგენა, არის თუ არა შეკვეთის ჯამური თანხა $100-ზე მეტი.
  • ობიექტების სიის გავლა (იტერაცია), მაგალითად, შეკვეთაში თითოეული ხაზის ელემენტისთვის მონაცემების გამოტანა.

ამ განაცხადების დასაწერად და ობიექტების გასავლელად (იტერაციისთვის) შეგიძლია გამოიყენო Liquid თეგები.

მაგალითად, შემდეგი Liquid აჩვენებს შეკვეთის ნომერს, თუ შეკვეთის ჯამური თანხა აღემატება $100-ს:

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

შენ ასევე შეგიძლია გამოიყენო for loop ობიექტების (მაგალითად, შეკვეთის ხაზის ელემენტების) სიის გასავლელად (იტერაციისთვის). მაგალითად, შემდეგი Liquid აჩვენებს შეკვეთაში თითოეული ხაზის ელემენტის სახელს:

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

Flow-ს აქვს შემდეგი Liquid პირობითი (ან მართვის ნაკადის) თეგების მხარდაჭერა:

Flow-ს ასევე აქვს შემდეგი Liquid განმეორებითი (იტერაციის) თეგების მხარდაჭერა:

ცვლადებზე ფილტრების გამოყენება

Liquid-ში ცვლადების მონაცემების გარდაქმნა ფილტრების გამოყენებით შეგიძლია. Flow მხარს უჭერს ყველა ღია კოდის მქონე Liquid ფილტრს.

მაგალითად, შემდეგი Liquid შლის პრეფიქსს შეკვეთის სახელიდან და გამოაქვს ის, რაც დარჩა: {{ order.name | remove: "Order-" }}

Liquid ცვლადების ფილტრებში გამოყენებისას გასათვალისწინებელი ფაქტორები

ფილტრების გამოყენებით ცვლადების გარდაქმნამდე, გადახედე შემდეგ გასათვალისწინებელ ფაქტორებს:

  • Flow არ უჭერს მხარს წერტილოვან ნოტაციას (dot notation), რომელიც ხელმისაწვდომია ზოგიერთი ფილტრისთვის. მაგალითად, Flow მხარს უჭერს {{ order.lineItems | size }}, მაგრამ არა {{ order.lineItems.size }}.
  • Flow არ უჭერს მხარს წერტილოვან ნოტაციას მეტაველებისთვის. მაგალითად, შენ არ შეგიძლია გამოიყენო {{ order.metafields.custom.hold_note }}. ამის ნაცვლად, მაგალითებში ნაჩვენები გზით უნდა გამოიყენო ციკლი მეტაველებზე.
  • Flow არ უჭერს მხარს ინდექსების გამოყენებას სიაში არსებულ ერთეულებზე წვდომისთვის. მაგალითად, შენ არ შეგიძლია გამოიყენო {{ order.lineItems[0].title }}. ამის ნაცვლად, მაგალითებში ნაჩვენები გზით უნდა გამოიყენო ციკლი ხაზის ელემენტებზე.

თარიღის ფილტრები

სტანდარტული Liquid ფილტრების გარდა, Flow გთავაზობს თარიღის ფილტრებს, რათა მიიღო თარიღი სხვა თარიღთან მიმართებაში, დაგეგმილი დროის ტრიგერისა და მონაცემების მიღების ფუნქციების მხარდასაჭერად. ეს ფილტრებია: date_minus და date_plus. მაგალითად:

  • მომავალში ერთი დღით გადაწეული თარიღის დასაბრუნებლად: {{ "now" | date_plus: "1 day" }}
  • წარსულში ერთი დღით გადაწეული თარიღის დასაბრუნებლად: {{ "now" | date_minus: "1 day" }}

ეს ფილტრები ხანგრძლივობის ერთეულად იღებენ შემდეგ მნიშვნელობებს: second, minute, day, week, month და year როგორც მხოლობით (მაგალითად, second), ისე მრავლობით (მაგალითად, seconds) რიცხვში. შენ ასევე შეგიძლია მიაწოდო შემდეგი ტიპის მორგებადი ერთეულები:

  • მთელი რიცხვი, რომელიც წარმოადგენს წამების რაოდენობას: {{ "now" | date_minus: 3600 }}, სადაც 3600 უდრის 1 საათს.
  • ISO8601 ხანგრძლივობის სტრიქონი: {{ "now" | date_minus: "P1Y2D" }}, სადაც P1Y2D ნიშნავს 1 წელსა და 2 დღეს.

კრიპტოგრაფიული ფილტრები

Flow გთავაზობთ კრიპტოგრაფიულ ფილტრებს ჰეშირებისთვის და ჰეშზე დაფუძნებული შეტყობინების ავთენტიფიკაციის კოდების (HMAC) შესაქმნელად. ეს ფილტრები სასარგებლოა უნიკალური იდენტიფიკატორების, საკონტროლო ჯამების შესაქმნელად ან ისეთ მესამე მხარის სისტემებთან ინტეგრაციისთვის, რომლებიც მოითხოვენ ჰეშის კონკრეტულ ფორმატებს.

ჰეშირების ფილტრები

Shopify Flow მხარს უჭერს შემდეგი ტიპის ჰეშირების ფილტრებს:

  • blake3 - ქმნის BLAKE3 ჰეშს (რეკომენდებულია ზოგადი გამოყენებისთვის).
  • sha256 - ქმნის SHA-256 ჰეშს.
  • sha1 - ქმნის SHA-1 ჰეშს.
  • md5 - ქმნის MD5 ჰეშს.

ჰეშირების ზოგადი მიზნებისთვის და ახალი იმპლემენტაციებისთვის უნდა გამოიყენო blake3, რადგან ის ძველ ალგორითმებთან შედარებით უკეთეს ეფექტურობასა და უსაფრთხოებას გთავაზობს. თუმცა, მესამე მხარის სისტემებთან თავსებადობისთვის ხელმისაწვდომია sha256, sha1 და md5.

გამოყენების მაგალითი: {{ "hello world" | blake3 }} აბრუნებს "hello world"-ის BLAKE3 ჰეშს.

HMAC ფილტრები

საიდუმლო გასაღებით HMAC-ის შესაქმნელად გამოიყენე ქვემოთ მოცემული მხარდაჭერილი ფილტრებიდან ერთ-ერთი:

გამოყენების მაგალითი:

  • საბაზისო: {{ "message" | hmac_sha256: "secret_key" }}
  • საიდუმლო მონაცემებით (რეკომენდებულია): {{ "message" | hmac_sha256: secrets.api_key }}

Shopify Flow-ში Liquid-ით ცვლადების გამოყენების მაგალითები

Liquid ცვლადების გამოყენების უკეთ გასაგებად გაეცანი შემდეგ მაგალითებს:

რესურსებისთვის URL-ების გამოტანა

გსურს სამუშაო პროცესში ჩართული მომხმარებლის, შეკვეთისა და პროდუქტისთვის URL-ების გამოტანა.

# 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>

თეგების სიის მეტაველად კონვერტირება

გსურს თეგების ნაკრების კონვერტირება მეტაველად, რომელიც წარმოადგენს ერთხაზიანი ტექსტური ველების სიას. შენ ქმნი სამუშაო პროცესს ტრიგერით პროდუქტი დაემატა მაღაზიას და იყენებ მოქმედებას პროდუქტის მეტაველის განახლება. პროდუქტის მეტაველის განახლების მოქმედების სექციაში მნიშვნელობა, ამატებ შემდეგ Liquid კოდს. ეს მაგალითი უშვებს, რომ მნიშვნელობების მითითება გჭირდება მხოლოდ ერთხელ, პროდუქტის შექმნისას, და რომ პროდუქტს აქვს ორი შესაბამისი თეგი: color:red და color:orange.

Liquid-ის მაგალითი ერთხაზიანი ტექსტური ველის სიის დასაყენებლად.
შეყვანაგამოტანა
{% 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"]

შეკვეთისთვის დინამიკური ელფოსტის შეტყობინების დაწერა

გსურს შექმნა სამუშაო პროცესი, რათა გაუგზავნო ელფოსტა თანამშრომელს, როდესაც მომხმარებელი შეკვეთაზე $500-ზე მეტს ხარჯავს. შენ ქმნი სამუშაო პროცესს ტრიგერით შეკვეთა შეიქმნა, აყენებ პირობას, რომელიც სრულდება, თუ შეკვეთის ჯამი აღემატება $500-ს და იყენებ მოქმედებას შიდა ელფოსტის გაგზავნა. შიდა ელფოსტის გაგზავნის მოქმედების სექციაში შეტყობინება, იყენებ შემდეგ ცვლადებს.

მომხმარებლის დეტალების მისაწოდებლად ცვლადის გამოყენების მაგალითი.
შეყვანაგამოტანა
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 }}.
გთხოვ, გაუგზავნო პერსონალური მადლობის ბარათი Jeanne Dupont-ს (jeanne@example.com) $763,42-ის ღირებულების შეკვეთის განთავსებისთვის.

მცირე მარაგის მქონე პროდუქტისთვის დინამიკური ელფოსტის შეტყობინების დაწერა

შენ გადაწყვიტე, რომ უნდა აცნობო პერსონალის წევრს, როდესაც პროდუქტის მარაგი მცირდება და საჭიროა შეკვეთის განთავსება მარაგის შესავსებად. შენ ქმნი სამუშაო პროცესს, რომელიც იწყება ტრიგერით მარაგის რაოდენობა შეიცვალა და აყენებ პირობას, რომელიც სრულდება, თუ მარაგის წინა რაოდენობა 10-ზე ნაკლები ან მისი ტოლია. შიდა ელფოსტის გაგზავნის მოქმედების სექციაში შეტყობინება, იყენებ შემდეგ ცვლადებს.

ერთეულის დეტალების მისაწოდებლად ცვლადის გამოყენების მაგალითი.
შეყვანაგამოტანა
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
გთხოვ, ხელახლა შეუკვეთო High Waist Leggings - Black. გაუგზავნე ელფოსტა მისამართზე owner@example.com დასადასტურებლად, რომ მათ მიიღეს შესყიდვის ორდერი.

პერსონალისთვის თაღლითური შეკვეთის შესატყობინებლად დინამიკური ელფოსტის შეტყობინების დაწერა

გსურს გააუქმო შეკვეთები, რომლებსაც რისკის მაღალი დონე აქვთ, მაგრამ გირჩევნია, რომ შეკვეთა პერსონალმა ხელით გააუქმოს. შენ ქმნი სამუშაო პროცესს, რომელიც იწყება ტრიგერით შეკვეთა შეიქმნა და აყენებ პირობას, რომელიც სრულდება, თუ შეკვეთის რისკის დონე მაღალია. შიდა ელფოსტის გაგზავნის მოქმედების სექციაში შეტყობინება, იყენებ შემდეგ ცვლადებს.

თაღლითური შეკვეთის შესახებ ინფორმაციის მისაწოდებლად ცვლადის გამოყენების მაგალითი.
შეყვანაგამოტანა
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!
ჩვენმა Shopify-ს მაღაზიამ მიიღო შეკვეთა თაღლითობის მაღალი რისკით. გვსურს, დაუყოვნებლივ გავაუქმოთ ეს შეკვეთა მის წარმოებაში ჩაშვებამდე:

#1001
Dupont, Jeanne
jeanne@example.com

გთხოვთ, დაადასტუროთ შეკვეთის ახალი სტატუსი. მადლობა!

შეკვეთის ხაზის ელემენტების გამოტანა for ციკლის გამოყენებით

როდესაც შეკვეთა მიიღება, შეკვეთილი პროდუქტების შემცველი შეტყობინების გაგზავნა შეიძლება სასარგებლო იყოს. ამის გაკეთება შეგიძლია for ციკლის (for loop) გამოყენებით, რომელიც განმეორებით ასრულებს კოდის ბლოკს. ტექსტურ ველებს, რომლებსაც აქვთ ცვლადების მხარდაჭერა, ასევე აქვთ for ციკლებისა და forloop ობიექტის მხარდაჭერა.

მაგალითად, გსურს შექმნა სამუშაო პროცესი, რომელიც დააბრუნებს შეკვეთაში არსებული ყველა SKU-სა და რაოდენობის სიას. შიდა ელფოსტის გაგზავნის მოქმედების სექციაში შეტყობინება, იყენებ შემდეგ ცვლადებს.

შეკვეთის ინფორმაციის მისაწოდებლად for ციკლის გამოყენების მაგალითი.
შეყვანაგამოტანა
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
შეკვეთის შეჯამება:
8987097979 (50)
8877778887 (3)
888998898B (1)

დამატებითი ინფორმაციით შეკვეთის ხაზის ელემენტების გამოტანა for ციკლის გამოყენებით

შენ გადაწყვიტე, ელფოსტაში დაამატო მეტი ინფორმაცია, მათ შორის პროდუქტის სახელი, SKU-ები, თითოეული ერთეულის ფასი და მომხმარებლის მიწოდების ინფორმაცია. შიდა ელფოსტის გაგზავნის მოქმედების სექციაში შეტყობინება, იყენებ შემდეგ ცვლადებს.

`for` ციკლის გამოყენების მაგალითი შეკვეთის უფრო ვრცელი ინფორმაციის მისაწოდებლად.
შეყვანაგამოტანა
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
შეკვეთის შეჯამება:
პროდუქტი: High Waist Leggings - შავი
SKU: 8987097979
ფასი (ერთეულზე): $8.49
რაოდენობა: 5
პროდუქტი: Athletic Socks - ლურჯი
SKU: 888998898B
ფასი (ერთეულზე): $5.61
რაოდენობა: 2

გამოიყვანე რამდენიმე ხაზის ელემენტი `for` ციკლისა და `if` განაცხადის კომბინირებით

კონკრეტული მომწოდებლის მიერ მოწოდებული და გაყიდული ერთეულებისთვის თვალის დევნება გჭირდება. შიდა ელფოსტის გაგზავნა მოქმედების შეტყობინება სექციაში უნდა გამოიყენო შემდეგი ცვლადები და დაამატო if განაცხადი შენს for ციკლში.

`for` ციკლისა და `if` განაცხადის გამოყენების მაგალითი კონკრეტული მომწოდებლებისთვის შეკვეთის ინფორმაციის მისაწოდებლად.
შეყვანაგამოტანა
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
გაიყიდა Acme-ს პროდუქტი:
პროდუქტის სახელი: High Waist Leggings - შავი
SKU: 8987097979

რთული მონაცემთა ობიექტები Shopify Flow-ში

Flow გაძლევს წვდომის საშუალებას თითქმის ნებისმიერ მონაცემზე, რომელიც არის GraphQL Admin API-ში. ეს მოიცავს რთულ მონაცემთა ობიექტებს, როგორიცაა სიები და ობიექტები. თუმცა, არსებობს გარკვეული შეზღუდვები იმასთან დაკავშირებით, თუ რისი გაკეთება შეგიძლია ამ ობიექტებით. ეს სექცია აღწერს ამ შეზღუდვებს და გთავაზობს მათთან მუშაობის მაგალითებს.

სიების და ობიექტების პირდაპირ გამოძახების ნაცვლად, სიაზე ციკლი უნდა გამოიყენო და ჩართო მხოლოდ ის ველები, რომლებიც გჭირდება.

მაგალითად, {{ order.lineItems }}-ის პირდაპირ გამოძახების ნაცვლად, კონკრეტული ველების გამოსაძახებლად გამოიყენე შემდეგი ფორმატი. ეს მაგალითები მოიცავს ყველა ველს, რომელიც შევიდოდა სიის ან ობიექტის პირდაპირ გამოძახებით. დააკოპირე და ჩასვი ის ველები, რომლებიც გჭირდება.

ტექსტი
{% 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 %}
]

}