Passer au contenu principal

[Order Intake - GCW] Exemples de modèles de mappage

T
Écrit par Toby Dawson
Mis à jour il y a plus d'un mois

Ce guide propose des exemples concrets de mappages de modèles Jinja2 dans GelatoConnect pour vous aider à mettre en place des scénarios courants de transformation de données. Que vous souhaitiez mapper des données de commande, transformer des notifications ou effectuer des recherches, ces exemples vous offriront une base solide.

Exemple simple de soumission de commande

Cet exemple illustre comment traiter une commande classique :

Données saisies :

{
"order": {
"id": "12345",
"customer_email": "[email protected]",
"items": [
{
"id": "item-1",
"product_code": "POSTER-A3",
"quantity": 2,
"file_url": "https://example.com/files/poster.pdf"
}
],
"shipping": {
"recipient": {
"first_name": "John",
"last_name": "Smith"
},
"address": {
"line1": "123 Main St",
"line2": "Apt 4B",
"city": "New York",
"postal_code": "10001",
"country": "US",
"state": "NY"
},
"phone": "212-555-1234"
}
}
}

Mappage de modèles :

{
"orderReferenceId": "{{ order.id }}",
"orderType": "order",
"currency": "USD",
"shippingAddress": {
"firstName": "{{ order.shipping.recipient.first_name }}",
"lastName": "{{ order.shipping.recipient.last_name }}",
"addressLine1": "{{ order.shipping.address.line1 }}",
"addressLine2": "{{ order.shipping.address.line2 }}",
"city": "{{ order.shipping.address.city }}",
"postCode": "{{ order.shipping.address.postal_code }}",
"country": "{{ order.shipping.address.country }}",
"state": "{{ order.shipping.address.state }}",
"email": "{{ order.customer_email }}",
"phone": "{{ order.shipping.phone }}"
},
"items": [
{% for item in order.items %}
{
"itemReferenceId": "{{ item.id }}",
"productUid": "{{ lookups({'product_code': item.product_code}, strict=False, default='') }}",
"quantity": {{ item.quantity }},
"files": [
{
"type": "default",
"url": "{{ item.file_url }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Gérer plusieurs fichiers produit

Cet exemple concerne les produits avec plusieurs fichiers (recto et verso) :

Données saisies :

{
"orderReferenceId": "{{ order.id }}",
"orderType": "order",
"currency": "USD",
"shippingAddress": {
"firstName": "{{ order.shipping.recipient.first_name }}",
"lastName": "{{ order.shipping.recipient.last_name }}",
"addressLine1": "{{ order.shipping.address.line1 }}",
"addressLine2": "{{ order.shipping.address.line2 }}",
"city": "{{ order.shipping.address.city }}",
"postCode": "{{ order.shipping.address.postal_code }}",
"country": "{{ order.shipping.address.country }}",
"state": "{{ order.shipping.address.state }}",
"email": "{{ order.customer_email }}",
"phone": "{{ order.shipping.phone }}"
},
"items": [
{% for item in order.items %}
{
"itemReferenceId": "{{ item.id }}",
"productUid": "{{ lookups({'product_code': item.product_code}, strict=False, default='') }}",
"quantity": {{ item.quantity }},
"files": [
{
"type": "default",
"url": "{{ item.file_url }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Mappage de modèle :

{
"orderReferenceId": "{{ orderNumber }}",
"orderType": "order",
"currency": "USD",
"shippingAddress": {
{% set nameParts = deliveryDetails.contactName.split(' ') %}
"firstName": "{{ nameParts[0] }}",
"lastName": "{{ nameParts[1:] | join(' ') }}",
"addressLine1": "{{ deliveryDetails.address.street }}",
"city": "{{ deliveryDetails.address.city }}",
"state": "{{ deliveryDetails.address.state }}",
"postCode": "{{ deliveryDetails.address.zip }}",
"country": "{{ deliveryDetails.address.country }}",
"email": "{{ deliveryDetails.email }}",
"phone": "{{ deliveryDetails.phone }}"
},
"items": [
{% for product in products %}
{
"itemReferenceId": "{{ product.productId }}",
"productUid": "{{ lookups({'sku': product.sku}, strict=False, default='') }}",
"quantity": {{ product.qty }},
"files": [
{
"type": "front",
"url": "{{ product.files.front }}"
},
{
"type": "back",
"url": "{{ product.files.back }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Exemple de logique conditionnelle

Cet exemple montre comment utiliser une logique conditionnelle pour gérer différents types de produits:

Données saisies:

{
"orderId": "ORD-5555",
"customer": {
"name": "Alice Johnson",
"email": "[email protected]",
"phone": "555-123-4567"
},
"shipping": {
"address": "789 Pine St",
"apartment": "",
"city": "Boston",
"state": "MA",
"zipCode": "02108",
"country": "US"
},
"items": [
{
"id": "ITEM-A",
"type": "poster",
"sku": "POSTER-LG",
"quantity": 1,
"image": "https://example.com/files/poster.jpg"
},
{
"id": "ITEM-B",
"type": "card",
"sku": "CARD-SM",
"quantity": 100,
"frontImage": "https://example.com/files/card-front.jpg",
"backImage": "https://example.com/files/card-back.jpg"
}
]
}

Mappeur de modèles :

{
"orderReferenceId": "{{ orderId }}",
"orderType": "order",
"currency": "USD",
"shippingAddress": {
{% set nameParts = customer.name.split(' ') %}
"firstName": "{{ nameParts[0] }}",
"lastName": "{{ nameParts[1:] | join(' ') }}",
"addressLine1": "{{ shipping.address }}",
{% if shipping.apartment %}
"addressLine2": "{{ shipping.apartment }}",
{% endif %}
"city": "{{ shipping.city }}",
"state": "{{ shipping.state }}",
"postCode": "{{ shipping.zipCode }}",
"country": "{{ shipping.country }}",
"email": "{{ customer.email }}",
"phone": "{{ customer.phone }}"
},
"items": [
{% for item in items %}
{
"itemReferenceId": "{{ item.id }}",
"productUid": "{{ lookups({'sku': item.sku}, strict=False, default='') }}",
"quantity": {{ item.quantity }},
"files": [
{% if item.type == 'poster' %}
{
"type": "default",
"url": "{{ item.image }}"
}
{% elif item.type == 'card' %}
{
"type": "front",
"url": "{{ item.frontImage }}"
},
{
"type": "back",
"url": "{{ item.backImage }}"
}
{% endif %}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Exemple de mise à jour du statut de commande

Voici un exemple qui montre comment présenter une notification de retour pour les changements de statut de commande :

Données saisies :

{
"orderId": "a6a1f9ce-2bdd-4a9e-9f8d-0009df0e24d9",
"orderReferenceId": "J123X456",
"customerReferenceId": "CUST-789",
"fulfillmentStatus": "shipped",
"created": "2023-04-12T10:26:52+00:00",
"items": [
{
"itemReferenceId": "123",
"fulfillmentStatus": "shipped",
"fulfillments": [
{
"trackingCode": "TRK123456789",
"trackingUrl": "https://example.com/tracking?code=TRK123456789",
"carrierName": "FedEx",
"carrierUid": "fed_ex_ground",
"fulfillmentCountry": "US",
"fulfillmentStateProvince": "NY"
}
]
}
]
}

Mappage de modèles :

{
"event": "ORDER_SHIPPED",
"timestamp": "{{ created }}",
"order": {
"id": "{{ orderReferenceId }}",
"customer_id": "{{ customerReferenceId }}",
"status": "{{ fulfillmentStatus | upper }}",
"shipped_items": [
{% for item in items %}
{% if item.fulfillmentStatus == 'shipped' %}
{
"item_id": "{{ item.itemReferenceId }}",
"tracking": {
{% for fulfillment in item.fulfillments %}
"carrier": "{{ fulfillment.carrierName }}",
"tracking_number": "{{ fulfillment.trackingCode }}",
"tracking_url": "{{ fulfillment.trackingUrl }}",
"shipped_from": {
"country": "{{ fulfillment.fulfillmentCountry }}",
"state": "{{ fulfillment.fulfillmentStateProvince }}"
}
{% endfor %}
}
}{% if not loop.last %},{% endif %}
{% endif %}
{% endfor %}
]
}
}

Exemple de recherches avancées

Cet exemple montre comment gérer des correspondances complexes pour l'association de produits et le choix du transporteur :

Données saisies :

{
"reference": "ORDER-8888",
"recipient": {
"fullName": "Robert Brown",
"emailAddress": "[email protected]",
"phoneNumber": "888-555-1212",
"shippingInformation": {
"streetAddress": "321 Oak Ave",
"city": "Chicago",
"state": "IL",
"postalCode": "60601",
"countryCode": "US"
}
},
"orderItems": [
{
"lineItemId": "LI-001",
"productReference": {
"code": "BK-HCVR-A5",
"type": "hardcover_book",
"size": "A5"
},
"quantity": 1,
"assetUrls": {
"coverFile": "https://example.com/files/book-cover.pdf",
"interiorFile": "https://example.com/files/book-interior.pdf"
},
"additionalAttributes": {
"pageCount": 120,
"paperType": "premium"
}
}
],
"shippingPreference": "standard",
"region": "north_america"
}

Mappage de modèles :

{% set shipping_lookup = {
"express_north_america": "fed_ex_2_day",
"express_europe": "dhl_express_eu",
"standard_north_america": "ups_ground",
"standard_europe": "dhl_parcel_eu"
} %}

{% set product_lookup = {} %}
{% set product_lookup = product_lookup.update({
"BK-HCVR-A5-premium": "book_product_pf_a5_pt_premium_cl_4-4_hcvr",
"BK-HCVR-A5-standard": "book_product_pf_a5_pt_standard_cl_4-4_hcvr",
"BK-SCVR-A5-premium": "book_product_pf_a5_pt_premium_cl_4-4_scvr",
"BK-SCVR-A5-standard": "book_product_pf_a5_pt_standard_cl_4-4_scvr"
}) %}

{
"orderReferenceId": "{{ reference }}",
"orderType": "order",
"currency": "USD",
{% set shipping_key = shippingPreference + '_' + region %}
"shipmentMethodUid": "{{ shipping_lookup.get(shipping_key, 'normal') }}",
"shippingAddress": {
{% set name_parts = recipient.fullName.split(' ') %}
"firstName": "{{ name_parts[0] }}",
"lastName": "{{ name_parts[1:] | join(' ') }}",
"addressLine1": "{{ recipient.shippingInformation.streetAddress }}",
"city": "{{ recipient.shippingInformation.city }}",
"state": "{{ recipient.shippingInformation.state }}",
"postCode": "{{ recipient.shippingInformation.postalCode }}",
"country": "{{ recipient.shippingInformation.countryCode }}",
"email": "{{ recipient.emailAddress }}",
"phone": "{{ recipient.phoneNumber }}"
},
"items": [
{% for item in orderItems %}
{
"itemReferenceId": "{{ item.lineItemId }}",
{% set product_key = item.productReference.code + '-' + item.additionalAttributes.paperType %}
"productUid": "{{ product_lookup.get(product_key, lookups({'code': item.productReference.code, 'paper': item.additionalAttributes.paperType}, strict=False, default='')) }}",
"quantity": {{ item.quantity }},
"pageCount": {{ item.additionalAttributes.pageCount }},
"files": [
{
"type": "cover",
"url": "{{ item.assetUrls.coverFile }}"
},
{
"type": "inside",
"url": "{{ item.assetUrls.interiorFile }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Travailler avec les dates et le formatage

Cet exemple montre le formatage de date et la manipulation de chaînes de caractères :

Données d'entrée :

{
"orderNum": "INV-20230412-001",
"datePlaced": "2023-04-12T14:30:00Z",
"clientDetails": {
"id": "CLIENT001",
"contactInfo": {
"name": "SARAH WILLIAMS",
"email": "[email protected]",
"telephone": "1.212.555.7890"
},
"deliveryAddress": {
"line1": "555 Broadway",
"line2": "Floor 10",
"city": "New York",
"region": "New York",
"code": "10012",
"country": "United States"
}
},
"lineItems": [
{
"refCode": "LI-001-A",
"productIdentifier": "BROCHURE-A4-GLOSSY",
"amount": 250,
"artwork": "https://example.com/files/brochure.pdf"
}
]
}

Mappeur de modèles :

{% set country_codes = {
"United States": "US",
"United Kingdom": "GB",
"Canada": "CA",
"Australia": "AU",
"Germany": "DE",
"France": "FR"
} %}

{% set date_parts = datePlaced.split('T')[0].split('-') %}
{% set formatted_date = date_parts[1] + '/' + date_parts[2] + '/' + date_parts[0] %}

{
"orderReferenceId": "{{ orderNum }}",
"orderType": "order",
"currency": "USD",
"metadata": [
{
"key": "clientId",
"value": "{{ clientDetails.id }}"
},
{
"key": "orderDate",
"value": "{{ formatted_date }}"
}
],
"shippingAddress": {
{% set name_parts = clientDetails.contactInfo.name | lower | title | split(' ') %}
"firstName": "{{ name_parts[0] }}",
"lastName": "{{ name_parts[1:] | join(' ') }}",
"addressLine1": "{{ clientDetails.deliveryAddress.line1 }}",
"addressLine2": "{{ clientDetails.deliveryAddress.line2 }}",
"city": "{{ clientDetails.deliveryAddress.city }}",
"state": "{{ clientDetails.deliveryAddress.region }}",
"postCode": "{{ clientDetails.deliveryAddress.code }}",
"country": "{{ country_codes.get(clientDetails.deliveryAddress.country, 'US') }}",
"email": "{{ clientDetails.contactInfo.email }}",
"phone": "{{ clientDetails.contactInfo.telephone | replace('.', '-') }}"
},
"items": [
{% for item in lineItems %}
{
"itemReferenceId": "{{ item.refCode }}",
"productUid": "{{ lookups({'product_id': item.productIdentifier}, strict=False, default='') }}",
"quantity": {{ item.amount }},
"files": [
{
"type": "default",
"url": "{{ item.artwork }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Gestion des erreurs et valeurs par défaut

Cet exemple démontre une gestion d'erreurs robuste avec des valeurs par défaut :

Données d'entrée :

{
"id": "ORD-91011",
"buyer": {
"name": "Michael Johnson"
// Missing email field
},
"shipping": {
"name": "Michael Johnson",
"address": "111 River Rd",
// Missing city
"province": "Ontario",
"postal": "M5V 2H1",
"country": "CA"
},
"items": [
{
"id": "ITEM-001",
"sku": "CALENDAR-WALL",
"quantity": 1,
"assets": {
"main": "https://example.com/files/calendar.pdf"
}
},
{
// Incomplete item
"id": "ITEM-002"
}
]
}

Mappeur de modèles :

{
"orderReferenceId": "{{ id }}",
"orderType": "order",
"currency": "CAD",
"shippingAddress": {
{% set recipient = shipping.name | default('') %}
{% set name_parts = recipient.split(' ') if recipient else ['', ''] %}
"firstName": "{{ name_parts[0] | default('Unknown') }}",
"lastName": "{{ name_parts[1:] | join(' ') | default('Customer') }}",
"addressLine1": "{{ shipping.address | default('Address Missing') }}",
"city": "{{ shipping.city | default('Toronto') }}",
"state": "{{ shipping.province | default('ON') }}",
"postCode": "{{ shipping.postal | default('') }}",
"country": "{{ shipping.country | default('CA') }}",
"email": "{{ buyer.email | default('[email protected]') }}",
"phone": "{{ buyer.phone | default('000-000-0000') }}"
},
"items": [
{% for item in items %}
{% if item.id and item.sku and item.quantity %}
{
"itemReferenceId": "{{ item.id }}",
"productUid": "{{ lookups({'sku': item.sku}, strict=False, default='') }}",
"quantity": {{ item.quantity }},
"files": [
{
"type": "default",
"url": "{{ item.assets.main | default('') }}"
}
]
}{% if not loop.last %},{% endif %}
{% endif %}
{% endfor %}
]
}

Combiner plusieurs sources

Cet exemple rassemble des données provenant de plusieurs sources :

Données d'entrée :

{
"order": {
"id": "PO-12345",
"type": "standard"
},
"customer": {
"id": "CUST-789",
"segment": "business"
},
"recipient": {
"first": "David",
"last": "Miller",
"email": "[email protected]",
"phone": "303-555-1212",
"delivery": {
"address": "987 State St",
"suite": "Suite 500",
"city": "Denver",
"state": "CO",
"zip": "80202",
"country": "US"
}
},
"products": [
{
"id": "PROD-A1",
"code": "FLYER-A4-FULL",
"count": 500,
"artwork": "https://example.com/files/flyer.pdf"
}
],
"shipping": {
"method": "ground",
"expectedDays": 3
},
"promotional": {
"campaign": "SPRING2023",
"source": "email"
}
} \"campaign\": \"SPRING2023\", "source": "email" }}

Mappage de modèle :

{% set shipping_method_map = {
"overnight": "fed_ex_priority_overnight",
"express": "fed_ex_2_day",
"ground": "fed_ex_ground"
} %}

{
"orderReferenceId": "{{ order.id }}",
"orderType": "{{ 'draft' if order.type == 'preorder' else 'order' }}",
"currency": "USD",
"customerReferenceId": "{{ customer.id }}",
"shipmentMethodUid": "{{ shipping_method_map.get(shipping.method, 'normal') }}",
"metadata": [
{
"key": "campaign",
"value": "{{ promotional.campaign }}"
},
{
"key": "source",
"value": "{{ promotional.source }}"
},
{
"key": "segment",
"value": "{{ customer.segment }}"
},
{
"key": "expectedDelivery",
"value": "{{ shipping.expectedDays }}"
}
],
"shippingAddress": {
"firstName": "{{ recipient.first }}",
"lastName": "{{ recipient.last }}",
"addressLine1": "{{ recipient.delivery.address }}",
"addressLine2": "{{ recipient.delivery.suite }}",
"city": "{{ recipient.delivery.city }}",
"state": "{{ recipient.delivery.state }}",
"postCode": "{{ recipient.delivery.zip }}",
"country": "{{ recipient.delivery.country }}",
"email": "{{ recipient.email }}",
"phone": "{{ recipient.phone }}"
},
"items": [
{% for product in products %}
{
"itemReferenceId": "{{ product.id }}",
"productUid": "{{ lookups({'product_code': product.code}, strict=False, default='') }}",
"quantity": {{ product.count }},
"files": [
{
"type": "default",
"url": "{{ product.artwork }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Travailler avec des structures imbriquées complexes

Cet exemple montre comment gérer des structures de données profondément imbriquées :

Données saisies :

{
"data": {
"transaction": {
"identifiers": {
"internalRef": "TX-44556",
"customerRef": "CUST-ABC123"
},
"metadata": {
"createdAt": "2023-04-12T09:15:00Z",
"source": "web",
"tags": ["priority", "corporate"]
}
},
"parties": {
"sender": {
"organization": "Acme Corp",
"contact": {
"person": {
"givenName": "Thomas",
"familyName": "Anderson"
},
"details": {
"email": {
"address": "[email protected]"
},
"phone": {
"number": "415-555-9876",
"extension": "123"
}
}
}
},
"recipient": {
"person": {
"givenName": "Sarah",
"familyName": "Connor"
},
"contactDetails": {
"emailAddress": "[email protected]",
"phoneNumber": "213-555-4321"
},
"location": {
"address": {
"street": "1984 Tech Blvd",
"unit": "#42",
"locality": "Los Angeles",
"region": "California",
"postalCode": "90210",
"country": "USA"
}
}
}
},
"contents": {
"items": [
{
"descriptor": {
"id": "ITM-X789",
"type": "brochure",
"specifications": {
"format": "A4",
"paperType": "Glossy",
"colorProfile": "CMYK"
}
},
"quantity": {
"value": 1000,
"unit": "pcs"
},
"digitalAssets": {
"printable": {
"fileLocation": "https://example.com/files/brochure-complex.pdf"
}
}
}
]
}
}
}

Mappeur de modèles :

{% set country_map = {
"USA": "US",
"United States": "US",
"United States of America": "US",
"UK": "GB",
"United Kingdom": "GB",
"England": "GB"
} %}

{
"orderReferenceId": "{{ data.transaction.identifiers.internalRef }}",
"orderType": "order",
"currency": "USD",
"customerReferenceId": "{{ data.transaction.identifiers.customerRef }}",
"metadata": [
{
"key": "createdAt",
"value": "{{ data.transaction.metadata.createdAt }}"
},
{
"key": "source",
"value": "{{ data.transaction.metadata.source }}"
},
{% for tag in data.transaction.metadata.tags %}
{
"key": "tag_{{ loop.index }}",
"value": "{{ tag }}"
}{% if not loop.last %},{% endif %}
{% endfor %}
],
"shippingAddress": {
"firstName": "{{ data.parties.recipient.person.givenName }}",
"lastName": "{{ data.parties.recipient.person.familyName }}",
"addressLine1": "{{ data.parties.recipient.location.address.street }}",
"addressLine2": "{{ data.parties.recipient.location.address.unit }}",
"city": "{{ data.parties.recipient.location.address.locality }}",
"state": "{{ data.parties.recipient.location.address.region }}",
"postCode": "{{ data.parties.recipient.location.address.postalCode }}",
"country": "{{ country_map.get(data.parties.recipient.location.address.country, data.parties.recipient.location.address.country) }}",
"email": "{{ data.parties.recipient.contactDetails.emailAddress }}",
"phone": "{{ data.parties.recipient.contactDetails.phoneNumber }}"
},
"items": [
{% for item in data.contents.items %}
{
"itemReferenceId": "{{ item.descriptor.id }}",
"productUid": "{{ lookups({
'type': item.descriptor.type,
'format': item.descriptor.specifications.format,
'paper': item.descriptor.specifications.paperType
}, strict=False, default='') }}",
"quantity": {{ item.quantity.value }},
"files": [
{
"type": "default",
"url": "{{ item.digitalAssets.printable.fileLocation }}"
}
]
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}

Conseils pour devenir un pro des modèles de correspondance

Lorsque vous travaillez avec les mappeurs de modèles Jinja2 dans GelatoConnect, tenez compte de ces conseils pratiques :

  1. Adoptez des techniques de débogage :

    • Ajouter des champs temporaires pour afficher les valeurs intermédiaires

    • Utilisez le filtre {% raw %}##{{ variable | tojson }}{% endraw %} pour déboguer des objets complexes

  2. Combiner les instructions Set avec des conditions :

    jinja{% set shipping_type = 'express' if order.priority == 'high' else 'standard' %}

  3. Gérer les données manquantes ou imbriquées :

    jinja{{ data.get('nested', {}).get('deeply', {}).get('property', 'default_value') }}

  4. Créer des dictionnaires de correspondance pour les mappages courants :

    {% set status_map = {'NEW': 'received', 'SHIPPED': 'shipped', 'DELIVERED': 'delivered'} %}
    "status": "{{ status_map.get(input_status, 'unknown') }}"

  5. Regroupez la logique réutilisable dans des macros :

    {% macro format_phone(phone) %}
    {{ phone | replace(' ', '') | replace('.', '-') }}
    {% endmacro %}

  6. Transformez vos données grâce aux filtres :

    • Bordure : Enlevez les espaces vides

    • replace : Remplacer le texte

    • upper/lower/title : Changer la casse

    • default : Fournir des valeurs de secours

    • tojson : Formater en chaîne JSON

  7. Tenez compte des performances pour les grands ensembles de données :

    • Pré-calculer les valeurs avant les boucles

    • Placez les instructions d’affectation en dehors des boucles

    • Gardez vos modèles ciblés et spécifiques

Prochaines étapes

Maintenant que vous avez découvert ces exemples concrets, vous pouvez :

  1. Adaptez ces modèles à vos besoins d'intégration spécifiques

  2. Créez des transformations plus complexes en combinant différentes techniques

  3. Testez vos modèles de façon approfondie avec des données réelles

  4. Configurez des déclencheurs de postback à l’aide de ces modèles

  5. Mettez en place des recherches pour associer rapidement les valeurs.

Avez-vous trouvé la réponse à votre question ?