5.8 KiB
Reference: Copy quote info to payload
This file holds the detailed mapping rules and a worked example. The main procedure is in SKILL.md.
Source structure (quote data)
{
"quote": {
"id": "...", // the quote id
"customerId": "...",
"customerCategoryId": "...",
"distributionChannelId": "...",
"attributes": { ... },
"orderItemIds": [ ... ], // root product-item ids
"opportunityId": "...",
...
},
"items": [
{ "id": "...", "type": "productItem", ... },
{ "id": "...", "type": "locationItem", ... },
{ "id": "...", "type": "alertItem", ... },
...
]
}
Target structure (quote command skeleton)
The command shape varies greatly. Adapt to whatever keys exist. A common example:
{
"businessCommand": "quote_init",
"businessCommandAttributes": { ... },
"id": "{{quoteId}}",
"items": [],
"batchCommands": [
{
"businessCommand": "product_items_modify",
"businessCommandAttributes": { "date": "..." },
"id": "{{quoteId}}",
"items": [ { "id": "...", "type": "productItem" }, ... ]
}
],
"quoteCmd": {
"attributes": {},
"customerId": "...",
"customerCategoryId": "...",
"distributionChannelId": "..."
}
}
Field mapping (source → target)
Apply a mapping only when the target has a slot for it. Match by key name and meaning.
| Target field (wherever it appears) | Source value |
|---|---|
{{quoteId}} placeholder, top-level id, batch id |
quote.id |
quoteCmd.customerId / any customerId |
quote.customerId |
quoteCmd.customerCategoryId / customerCategoryId |
quote.customerCategoryId |
quoteCmd.distributionChannelId / distributionChannelId |
quote.distributionChannelId |
quoteCmd.attributes (when empty and desired) |
quote.attributes (only if user wants it) |
opportunityId |
quote.opportunityId |
marketId on items |
item's marketId from source |
Notes:
- If the skeleton already has a hardcoded value (e.g. a sample
customerId) and it differs from the source, replace it with the source value — the point is to reflect the source quote. Mention the replacement in the summary. - If the skeleton has a
date/timestamp the source doesn't provide (e.g.businessCommandAttributes.date), leave the skeleton's value as-is unless the user gives one. quoteCmd.attributesis often intentionally{}. Do not dumpquote.attributesinto it unless the user asks — attribute keys in the command context may differ.
Item-selection rules
- Product items: items in the source with
"type": "productItem". These are the ones that typically go into aproduct_items_modify(or similar) block'sitemsarray as{ "id": <sourceId>, "type": "productItem" }. - Location items (
"type": "locationItem") and alert items ("type": "alertItem") are usually not copied into a product-items block. Copy them only where the skeleton has a matching slot for that type. - Copy all matching items from the source into the target's item slot, preserving order and ids, using the field shape the skeleton's item entries use (often just
id+type). - Copy everything unchanged unless the user specifies a change (e.g. "set quantity to 2 on the Fibre item", "drop the DISCONNECT item", "change action to ADD"). Apply only what they name.
- Root vs. child products:
quote.orderItemIdslists the root product ids. If the skeleton only wants roots, use those; if it wants all product items, use everyproductItem. When unclear, default to allproductItems and note it.
Worked example
Source (quote data): quote.id = d968445a-f813-4be1-899d-e06accb6473b, customerId = slotest, customerCategoryId = 0ded2167-c41b-4f58-9941-dbd247b1985d, distributionChannelId = CPMS. Product items in items:
9b4be199-4b65-4ec0-b54b-d2f61366c9ed, 81a3fb42-31a5-4ea8-a668-8973e57aa2f9, c6a7aacd-8d3b-4c44-8680-829b15be5c06, fcd59bff-4339-4fea-8168-bb8598e98085 (plus location and alert items, which are not product items).
Skeleton: the quote_init + product_items_modify command shown above.
Filled result:
{
"businessCommand": "quote_init",
"businessCommandAttributes": {
"itemTypesScope": []
},
"id": "d968445a-f813-4be1-899d-e06accb6473b",
"items": [],
"batchCommands": [
{
"businessCommand": "product_items_modify",
"businessCommandAttributes": {
"date": "2026-08-28T10:00:00.000-03:00"
},
"id": "d968445a-f813-4be1-899d-e06accb6473b",
"items": [
{ "id": "9b4be199-4b65-4ec0-b54b-d2f61366c9ed", "type": "productItem" },
{ "id": "81a3fb42-31a5-4ea8-a668-8973e57aa2f9", "type": "productItem" },
{ "id": "c6a7aacd-8d3b-4c44-8680-829b15be5c06", "type": "productItem" },
{ "id": "fcd59bff-4339-4fea-8168-bb8598e98085", "type": "productItem" }
]
}
],
"quoteCmd": {
"attributes": {},
"customerId": "slotest",
"customerCategoryId": "0ded2167-c41b-4f58-9941-dbd247b1985d",
"distributionChannelId": "CPMS"
}
}
Summary in this example: filled {{quoteId}} (both occurrences) from quote.id; set customerId, customerCategoryId, distributionChannelId from the source (replacing the skeleton's sample values); copied all 4 productItems into the product_items_modify block unchanged; left businessCommandAttributes.date as-is (not present in source); kept quoteCmd.attributes empty (not requested).