Offer
Offer properties
Properties
CustomerId(['string', 'null'])Customer that the offer belongs to.Id(string)Unique ID assigned to the offer by SOB.OmsOfferId(['string', 'null'])Unique ID assigned to the offer by the OMS.XmPieTemplateId(['string', 'null'])Id of XMPie template to be used in production.XmPieUStoreId(['string', 'null'])Id of offer in UStore, for variable template production.-
AccessGroups(['array', 'null'])An array of access groups assigned to have access to the offer.- Items (string)
-
AdditionalPropsRequiredOnOrder(['array', 'null'])Any properties that are required for this offer that wouldn't otherwise be required for an offer order.-
Items (object)
Hint(['string', 'null'])Hint for entry of the value.IsDeleted(['boolean', 'null'])Flag to indicate the property is deleted. Name will be the key.Label(['string', 'null'])Label for presenting the prompt to the client.Name(string, required)Name of required property.Type(['string', 'null'])Type of property.Value(['string', 'null'])Default Value.
-
-
AvailableEndDate(['string', 'null'])Date that offer is no longer available for sale. AvailableStartDate(['string', 'null'])Date that offer is available for sale.-
CategoryIds(['array', 'null'])An array of category IDs identifying the categories an offer is assigned.- Items (string)
-
Comments(['string', 'null'])Additional information about the offer. DefaultPrice(['number', 'null'])Default price of the offer if no price classes are applied.DeliveryScheduleCron(['string', 'null'])Cron expression that defines the delivery schedule.Description(['string', 'null'])More detailed description of the offer.DoSuppressShippingAndHandling(['boolean', 'null'])Disable shipping and handling fees being applied to the offer.-
FixedOrderQuantities(['array', 'null'])Indicates the offer should only be orderable in the defined quantities.- Items (integer)
-
FullImageUrl(['string', 'null'])URL of full product image for the offer. IsActive(['boolean', 'null'])Flag indicating whether offer is available for sale, if within the availability dates.IsAvailableViaCoopFunds(['boolean', 'null'])Flag indicating whether offer is available for payment with Coop funds.IsDeleted(['boolean', 'null'])Flag indicating a soft delete of the offer.IsInventoried(['boolean', 'null'])Flag indicating whether offer is inventoried.IsTaxable(['boolean', 'null'])Indicates whether the offer can be taxed.Number(['string', 'null'])Number to identify offer.OfferType(['string', 'null'])Indicates whether the offer is a product list, drop ship, etc.-
OmniChannel(['object', 'null'])Offer OmniChannel.-
Offers(['array', 'null'])-
Items (object)
OfferId(['string', 'null'])ID of the offer in the omni channel.DeliveryChannel(['string', 'null'])Delivery channel for the offer.
-
-
-
OmsLastUpdateDateTimeUtc(['string', 'null'])UTC DateTime that the offer was last updated by the system that manages it. This value is set by the OMS. -
OnlyShipMethodsAvailable(['array', 'null'])If an offer is only available via a defined set of ship methods, they are declared in this array.- Items (string)
-
OrderMaximum(['integer', 'null'])The maximum quantity of the offer that can be ordered. OrderMinimum(['integer', 'null'])The minimum quantity of the offer that can be ordered.PdfUrl(['string', 'null'])URL of a PDF that may be associated with the offer.-
PriceClasses(['array', 'null'])An array of different classes of pricing by access group.-
Items (object)
IsDeleted(['boolean', 'null'])Flag to indicate price class has been deleted. The key to identify the item being removed is the Name.Name(['string', 'null'])Name of access group this pricing applies to.Price(['number', 'null'])Default price for the access group if not covered by price tiers.-
PriceTiers(['array', 'null'])Pricing tiered by quantity being ordered.-
Items (object)
IsDeleted(['boolean', 'null'])Flag to indicate price tier has been deleted. If a minimum or maximum quantity is provided, that can be used as the key. If not, we assume it is the default - no min, no max - and consider that deleted.MaximumQuantity(['integer', 'null'])Ending quantity of the range for this price.MinimumQuantity(['integer', 'null'])Starting quantity of the range for this price.-
PageCounts(['array', 'null'])Collection of PageCounts.-
Items (object)
MaximumPages(['integer', 'null'])Maximum Page Count Allowed.MinimumPages(['integer', 'null'])Minimum Page Count Allowed.Price(['number', 'null'])Price.
-
-
Price(['number', 'null'])The price of the offer within this quantity range.
-
-
-
ProductClusters(['array', 'null'])An array of any product clusters included in the offer.-
Items (object)
Id(string, required)SOB unique ID for the cluster.IsDeleted(['boolean', 'null'])Flag to indicate this cluster has been removed.-
Products(['array', 'null'])An array of products included in the offer. This and/or a cluster must be included if the offer type is Product List.-
Items (object)
ProductId(['string', 'null'])SOB unique ID for the product.AssociatedFileName(['string', 'null'])File name of associated file, if applicable.IsDeleted(['boolean', 'null'])Flag to indicate this product has been removed.PageCount(['integer', 'null'])PageCount for Template.ProductColor(['string', 'null'])Color of the product, if applicable.ProductDescription(['string', 'null'])Description of the product.ProductNumber(['string', 'null'])Number to identify product.ProductQuantityInOffer(integer, required)Indicates the quantity of the selected cluster item included in the offer.ProductSize(['string', 'null'])Size of the product, if applicable.
-
-
-
RequiresApproval(['boolean', 'null'])Flag indicating whether offer requires approval for order-fulfillment. SecureEmailBody(['string', 'null'])If this offer is a secure email type, this is the body that should be used.SecureEmailSubject(['string', 'null'])If this offer is a secure email type, this is the subject that should be used.Surcharge(['number', 'null'])Offer Surcharge.ThumbnailUrl(['string', 'null'])URL of thumbnail image for the offer.UnitOfMeasure(['string', 'null'])Orderable units of the offer.WeightInPounds(['number', 'null'])Weight of offer.
Quicktype Command
quicktype \
--framework SystemTextJson \
--lang cs \
--number-type double \
--src-lang schema \
--no-check-required \
--density dense \
--features complete \
--namespace OtpSchema.Event.Offer.Offer \
--src .working/build/internal/json-schema-for-cs/Offer.json -o .working/build/internal/csharp/OtpSchema/Event/Offer/Offer.cs
// <auto-generated />
//
// To parse this JSON data, add NuGet 'System.Text.Json' then do:
//
// using OtpSchema.Event.Offer.Offer;
//
// var offer = Offer.FromJson(jsonString);
#nullable enable
#pragma warning disable CS8618
#pragma warning disable CS8601
#pragma warning disable CS8603
namespace OtpSchema.Event.Offer.Offer
{
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Globalization;
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
using N = System.Text.Json.Serialization.JsonIgnoreCondition;
/// <summary>Offer properties</summary>
public partial class Offer
{
[J("AccessGroups")] public string[] AccessGroups { get; set; } // An array of access groups assigned to have access to the offer
[J("AdditionalPropsRequiredOnOrder")] public AdditionalPropsRequiredOnOrder[] AdditionalPropsRequiredOnOrder { get; set; } // Any properties that are required for this offer that wouldn't otherwise be required for; an offer order
[J("AvailableEndDate")] public string AvailableEndDate { get; set; } // Date that offer is no longer available for sale
[J("AvailableStartDate")] public string AvailableStartDate { get; set; } // Date that offer is available for sale
[J("CategoryIds")] public string[] CategoryIds { get; set; } // An array of category IDs identifying the categories an offer is assigned
[J("Comments")] public string Comments { get; set; } // Additional information about the offer
[J("CustomerId")] public string CustomerId { get; set; } // Customer that the offer belongs to
[J("DefaultPrice")] public double? DefaultPrice { get; set; } // Default price of the offer if no price classes are applied
[J("DeliveryScheduleCron")] public string DeliveryScheduleCron { get; set; } // Cron expression that defines the delivery schedule
[J("Description")] public string Description { get; set; } // More detailed description of the offer
[J("DoSuppressShippingAndHandling")] public bool? DoSuppressShippingAndHandling { get; set; } // Disable shipping and handling fees being applied to the offer
[J("FixedOrderQuantities")] public long[] FixedOrderQuantities { get; set; } // Indicates the offer should only be orderable in the defined quantities
[J("FullImageUrl")] public string FullImageUrl { get; set; } // URL of full product image for the offer
[J("Id")] public string Id { get; set; } // Unique ID assigned to the offer by SOB
[J("IsActive")] public bool? IsActive { get; set; } // Flag indicating whether offer is available for sale, if within the availability dates
[J("IsAvailableViaCoopFunds")] public bool? IsAvailableViaCoopFunds { get; set; } // Flag indicating whether offer is available for payment with Coop funds
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag indicating a soft delete of the offer
[J("IsInventoried")] public bool? IsInventoried { get; set; } // Flag indicating whether offer is inventoried
[J("IsTaxable")] public bool? IsTaxable { get; set; } // Indicates whether the offer can be taxed
[J("Number")] public string Number { get; set; } // Number to identify offer
[J("OfferType")] public string OfferType { get; set; } // Indicates whether the offer is a product list, drop ship, etc
[J("OmniChannel")] public OmniChannel OmniChannel { get; set; } // Offer OmniChannel
[J("OmsLastUpdateDateTimeUtc")] public string OmsLastUpdateDateTimeUtc { get; set; } // UTC DateTime that the offer was last updated by the system that manages it. This value is; set by the OMS
[J("OmsOfferId")] public string OmsOfferId { get; set; } // Unique ID assigned to the offer by the OMS
[J("OnlyShipMethodsAvailable")] public string[] OnlyShipMethodsAvailable { get; set; } // If an offer is only available via a defined set of ship methods, they are declared in; this array
[J("OrderMaximum")] public long? OrderMaximum { get; set; } // The maximum quantity of the offer that can be ordered
[J("OrderMinimum")] public long? OrderMinimum { get; set; } // The minimum quantity of the offer that can be ordered
[J("PdfUrl")] public string PdfUrl { get; set; } // URL of a PDF that may be associated with the offer
[J("PriceClasses")] public PriceClass[] PriceClasses { get; set; } // An array of different classes of pricing by access group
[J("ProductClusters")] public ProductCluster[] ProductClusters { get; set; } // An array of any product clusters included in the offer
[J("RequiresApproval")] public bool? RequiresApproval { get; set; } // Flag indicating whether offer requires approval for order-fulfillment
[J("SecureEmailBody")] public string SecureEmailBody { get; set; } // If this offer is a secure email type, this is the body that should be used
[J("SecureEmailSubject")] public string SecureEmailSubject { get; set; } // If this offer is a secure email type, this is the subject that should be used
[J("Surcharge")] public double? Surcharge { get; set; } // Offer Surcharge
[J("ThumbnailUrl")] public string ThumbnailUrl { get; set; } // URL of thumbnail image for the offer
[J("UnitOfMeasure")] public string UnitOfMeasure { get; set; } // Orderable units of the offer
[J("WeightInPounds")] public double? WeightInPounds { get; set; } // Weight of offer
[J("XmPieTemplateId")] public string XmPieTemplateId { get; set; } // Id of XMPie template to be used in production
[J("XmPieUStoreId")] public string XmPieUStoreId { get; set; } // Id of offer in UStore, for variable template production
}
public partial class AdditionalPropsRequiredOnOrder
{
[J("Hint")] public string Hint { get; set; } // Hint for entry of the value
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag to indicate the property is deleted. Name will be the key
[J("Label")] public string Label { get; set; } // Label for presenting the prompt to the client
[J("Name")] public string Name { get; set; } // Name of required property
[J("Type")] public string Type { get; set; } // Type of property
[J("Value")] public string Value { get; set; } // Default Value
}
public partial class OmniChannel
{
[J("Offers")] public OfferElement[] Offers { get; set; }
}
public partial class OfferElement
{
[J("DeliveryChannel")] public string DeliveryChannel { get; set; } // Delivery channel for the offer
[J("OfferId")] public string OfferId { get; set; } // ID of the offer in the omni channel
}
public partial class PriceClass
{
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag to indicate price class has been deleted. The key to identify the item being removed; is the Name
[J("Name")] public string Name { get; set; } // Name of access group this pricing applies to
[J("Price")] public double? Price { get; set; } // Default price for the access group if not covered by price tiers
[J("PriceTiers")] public PriceTier[] PriceTiers { get; set; } // Pricing tiered by quantity being ordered
}
public partial class PriceTier
{
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag to indicate price tier has been deleted. If a minimum or maximum quantity is; provided, that can be used as the key. If not, we assume it is the default - no min, no; max - and consider that deleted
[J("MaximumQuantity")] public long? MaximumQuantity { get; set; } // Ending quantity of the range for this price
[J("MinimumQuantity")] public long? MinimumQuantity { get; set; } // Starting quantity of the range for this price
[J("PageCounts")] public PageCount[] PageCounts { get; set; } // Collection of PageCounts
[J("Price")] public double? Price { get; set; } // The price of the offer within this quantity range
}
public partial class PageCount
{
[J("MaximumPages")] public long? MaximumPages { get; set; } // Maximum Page Count Allowed
[J("MinimumPages")] public long? MinimumPages { get; set; } // Minimum Page Count Allowed
[J("Price")] public double? Price { get; set; } // Price
}
public partial class ProductCluster
{
[J("Id")] public string Id { get; set; } // SOB unique ID for the cluster
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag to indicate this cluster has been removed
[J("Products")] public Product[] Products { get; set; } // An array of products included in the offer. This and/or a cluster must be included if the; offer type is Product List
}
public partial class Product
{
[J("AssociatedFileName")] public string AssociatedFileName { get; set; } // File name of associated file, if applicable
[J("IsDeleted")] public bool? IsDeleted { get; set; } // Flag to indicate this product has been removed
[J("PageCount")] public long? PageCount { get; set; } // PageCount for Template
[J("ProductColor")] public string ProductColor { get; set; } // Color of the product, if applicable
[J("ProductDescription")] public string ProductDescription { get; set; } // Description of the product
[J("ProductId")] public string ProductId { get; set; } // SOB unique ID for the product
[J("ProductNumber")] public string ProductNumber { get; set; } // Number to identify product
[J("ProductQuantityInOffer")] public long ProductQuantityInOffer { get; set; } // Indicates the quantity of the selected cluster item included in the offer
[J("ProductSize")] public string ProductSize { get; set; } // Size of the product, if applicable
}
public partial class Offer
{
public static Offer FromJson(string json) => JsonSerializer.Deserialize<Offer>(json, OtpSchema.Event.Offer.Offer.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this Offer self) => JsonSerializer.Serialize(self, OtpSchema.Event.Offer.Offer.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerOptions Settings = new(JsonSerializerDefaults.General)
{
Converters =
{
new DateOnlyConverter(),
new TimeOnlyConverter(),
IsoDateTimeOffsetConverter.Singleton
},
};
}
public class DateOnlyConverter : JsonConverter<DateOnly>
{
private readonly string serializationFormat;
public DateOnlyConverter() : this(null) { }
public DateOnlyConverter(string? serializationFormat)
{
this.serializationFormat = serializationFormat ?? "yyyy-MM-dd";
}
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return DateOnly.Parse(value!);
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(serializationFormat));
}
public class TimeOnlyConverter : JsonConverter<TimeOnly>
{
private readonly string serializationFormat;
public TimeOnlyConverter() : this(null) { }
public TimeOnlyConverter(string? serializationFormat)
{
this.serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
}
public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return TimeOnly.Parse(value!);
}
public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(serializationFormat));
}
internal class IsoDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
public override bool CanConvert(Type t) => t == typeof(DateTimeOffset);
private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind;
private string? _dateTimeFormat;
private CultureInfo? _culture;
public DateTimeStyles DateTimeStyles
{
get => _dateTimeStyles;
set => _dateTimeStyles = value;
}
public string? DateTimeFormat
{
get => _dateTimeFormat ?? string.Empty;
set => _dateTimeFormat = (string.IsNullOrEmpty(value)) ? null : value;
}
public CultureInfo Culture
{
get => _culture ?? CultureInfo.CurrentCulture;
set => _culture = value;
}
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
{
string text;
if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
|| (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
{
value = value.ToUniversalTime();
}
text = value.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture);
writer.WriteStringValue(text);
}
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string? dateText = reader.GetString();
if (string.IsNullOrEmpty(dateText) == false)
{
if (!string.IsNullOrEmpty(_dateTimeFormat))
{
return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles);
}
else
{
return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles);
}
}
else
{
return default(DateTimeOffset);
}
}
public static readonly IsoDateTimeOffsetConverter Singleton = new IsoDateTimeOffsetConverter();
}
}
#pragma warning restore CS8618
#pragma warning restore CS8601
#pragma warning restore CS8603
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "Offer.json",
"description": "Offer properties",
"type": "object",
"properties": {
"CustomerId": {
"description": "Customer that the offer belongs to",
"type": ["string", "null"]
},
"Id": {"description": "Unique ID assigned to the offer by SOB", "type": "string"},
"OmsOfferId": {
"description": "Unique ID assigned to the offer by the OMS",
"type": ["string", "null"]
},
"XmPieTemplateId": {
"description": "Id of XMPie template to be used in production",
"type": ["string", "null"]
},
"XmPieUStoreId": {
"description": "Id of offer in UStore, for variable template production",
"type": ["string", "null"]
},
"AccessGroups": {
"description": "An array of access groups assigned to have access to the offer",
"type": ["array", "null"],
"items": {"type": "string"}
},
"AdditionalPropsRequiredOnOrder": {
"description": "Any properties that are required for this offer that wouldn't otherwise be required for an offer order",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"Hint": { "description": "Hint for entry of the value", "type": ["string", "null"] },
"IsDeleted": {
"description": "Flag to indicate the property is deleted. Name will be the key",
"type": ["boolean", "null"]
},
"Label": {
"description": "Label for presenting the prompt to the client",
"type": ["string", "null"]
},
"Name": {"description": "Name of required property", "type": "string"},
"Type": { "description": "Type of property", "type": ["string", "null"] },
"Value": { "description": "Default Value", "type": ["string", "null"] }
},
"required": ["Name"]
}
},
"AvailableEndDate": {
"description": "Date that offer is no longer available for sale",
"type": ["string", "null"]
},
"AvailableStartDate": {
"description": "Date that offer is available for sale",
"type": ["string", "null"]
},
"CategoryIds": {
"description": "An array of category IDs identifying the categories an offer is assigned",
"type": ["array", "null"],
"items": {"type": "string"}
},
"Comments": {
"description": "Additional information about the offer",
"type": ["string", "null"]
},
"DefaultPrice": {
"description": "Default price of the offer if no price classes are applied",
"type": ["number", "null"]
},
"DeliveryScheduleCron": {
"description": "Cron expression that defines the delivery schedule",
"type": ["string", "null"]
},
"Description": {
"description": "More detailed description of the offer",
"type": ["string", "null"]
},
"DoSuppressShippingAndHandling": {
"description": "Disable shipping and handling fees being applied to the offer",
"type": ["boolean", "null"]
},
"FixedOrderQuantities": {
"description": "Indicates the offer should only be orderable in the defined quantities",
"type": ["array", "null"],
"items": {"type": "integer"}
},
"FullImageUrl": {
"description": "URL of full product image for the offer",
"type": ["string", "null"]
},
"IsActive": {
"description": "Flag indicating whether offer is available for sale, if within the availability dates",
"type": ["boolean", "null"]
},
"IsAvailableViaCoopFunds": {
"description": "Flag indicating whether offer is available for payment with Coop funds",
"type": ["boolean", "null"]
},
"IsDeleted": {
"description": "Flag indicating a soft delete of the offer",
"type": ["boolean", "null"]
},
"IsInventoried": {
"description": "Flag indicating whether offer is inventoried",
"type": ["boolean", "null"]
},
"IsTaxable": {
"description": "Indicates whether the offer can be taxed",
"type": ["boolean", "null"]
},
"Number": { "description": "Number to identify offer", "type": ["string", "null"] },
"OfferType": {
"description": "Indicates whether the offer is a product list, drop ship, etc",
"type": ["string", "null"]
},
"OmniChannel": {
"description": "Offer OmniChannel",
"type": ["object", "null"],
"properties": {
"Offers": {
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"OfferId": {
"description": "ID of the offer in the omni channel",
"type": ["string", "null"]
},
"DeliveryChannel": { "description": "Delivery channel for the offer", "type": ["string", "null"] }
}
}
}
}
},
"OmsLastUpdateDateTimeUtc": {
"description": "UTC DateTime that the offer was last updated by the system that manages it. This value is set by the OMS",
"type": ["string", "null"]
},
"OnlyShipMethodsAvailable": {
"description": "If an offer is only available via a defined set of ship methods, they are declared in this array",
"type": ["array", "null"],
"items": {"type": "string"}
},
"OrderMaximum": {
"description": "The maximum quantity of the offer that can be ordered",
"type": ["integer", "null"]
},
"OrderMinimum": {
"description": "The minimum quantity of the offer that can be ordered",
"type": ["integer", "null"]
},
"PdfUrl": {
"description": "URL of a PDF that may be associated with the offer",
"type": ["string", "null"]
},
"PriceClasses": {
"description": "An array of different classes of pricing by access group",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"IsDeleted": {
"description": "Flag to indicate price class has been deleted. The key to identify the item being removed is the Name",
"type": ["boolean", "null"]
},
"Name": {
"description": "Name of access group this pricing applies to",
"type": ["string", "null"]
},
"Price": {
"description": "Default price for the access group if not covered by price tiers",
"type": ["number", "null"]
},
"PriceTiers": {
"description": "Pricing tiered by quantity being ordered",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"IsDeleted": {
"description": "Flag to indicate price tier has been deleted. If a minimum or maximum quantity is provided, that can be used as the key. If not, we assume it is the default - no min, no max - and consider that deleted",
"type": ["boolean", "null"]
},
"MaximumQuantity": {
"description": "Ending quantity of the range for this price",
"type": ["integer", "null"]
},
"MinimumQuantity": {
"description": "Starting quantity of the range for this price",
"type": ["integer", "null"]
},
"PageCounts": {
"description": "Collection of PageCounts",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"MaximumPages": { "description": "Maximum Page Count Allowed", "type": ["integer", "null"] },
"MinimumPages": { "description": "Minimum Page Count Allowed", "type": ["integer", "null"] },
"Price" : { "description": "Price" , "type": ["number", "null"] }
}
}
},
"Price": {
"description": "The price of the offer within this quantity range",
"type": ["number", "null"]
}
}
}
}
}
}
},
"ProductClusters": {
"description": "An array of any product clusters included in the offer",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"Id": {"description": "SOB unique ID for the cluster", "type": "string"},
"IsDeleted": {
"description": "Flag to indicate this cluster has been removed",
"type": ["boolean", "null"]
},
"Products": {
"description": "An array of products included in the offer. This and/or a cluster must be included if the offer type is Product List",
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"ProductId": { "description": "SOB unique ID for the product", "type": ["string", "null"] },
"AssociatedFileName": {
"description": "File name of associated file, if applicable",
"type": ["string", "null"]
},
"IsDeleted": {
"description": "Flag to indicate this product has been removed",
"type": ["boolean", "null"]
},
"PageCount": { "description": "PageCount for Template", "type": ["integer", "null"] },
"ProductColor": {
"description": "Color of the product, if applicable",
"type": ["string", "null"]
},
"ProductDescription": { "description": "Description of the product", "type": ["string", "null"] },
"ProductNumber": { "description": "Number to identify product", "type": ["string", "null"] },
"ProductQuantityInOffer": {
"description": "Indicates the quantity of the selected cluster item included in the offer",
"type": "integer"
},
"ProductSize": {
"description": "Size of the product, if applicable",
"type": ["string", "null"]
}
},
"required": ["ProductQuantityInOffer"]
}
}
},
"required": ["Id"]
}
},
"RequiresApproval": {
"description": "Flag indicating whether offer requires approval for order-fulfillment",
"type": ["boolean", "null"]
},
"SecureEmailBody": {
"description": "If this offer is a secure email type, this is the body that should be used",
"type": ["string", "null"]
},
"SecureEmailSubject": {
"description": "If this offer is a secure email type, this is the subject that should be used",
"type": ["string", "null"]
},
"Surcharge": { "description": "Offer Surcharge", "type": ["number", "null"] },
"ThumbnailUrl": {
"description": "URL of thumbnail image for the offer",
"type": ["string", "null"]
},
"UnitOfMeasure": { "description": "Orderable units of the offer", "type": ["string", "null"] },
"WeightInPounds": { "description": "Weight of offer", "type": ["number", "null"] }
},
"required": ["Id"]
}