Service - Sell Offer Plan: Difference between revisions
No edit summary |
|||
Line 43: | Line 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == LogicalResultsMain == | ||
A cached result set for logicals | |||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | { | ||
logicalResultId: "xxx", // hash of logical element | |||
logicalElement: {}, // full element being processed | |||
logicalType: "xx", // same filterType | |||
status: "xxx", // "processing"|"complete", | |||
{ | |||
} | |||
status: " | |||
expiryTime: "xx", | expiryTime: "xx", | ||
uniqueRequestId: "xx", used for idempotence when first process request called, in case that invocation fails and restarts, can be removed when set to complete | uniqueRequestId: "xx", used for idempotence when first process request called, in case that invocation fails and restarts, can be removed when set to complete | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* partition key: | * partition key: logicalResultId | ||
* sort key: (none) | * sort key: (none) | ||
== | == LogicalResultsData == | ||
Caches found results for logical elements | |||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | { | ||
logicalResultId: xxx, | |||
dataId: xxx // eg: one sellofferId | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* partition key: | * partition key: resultId | ||
* sort key: | * sort key: dataId | ||
= Graph database = | = Graph database = | ||
Line 492: | Line 317: | ||
logicalTag: "combineWins", | logicalTag: "combineWins", | ||
comparison: "true", | comparison: "true", | ||
}, | }, | ||
{ | { | ||
Line 520: | Line 333: | ||
}, | }, | ||
... | ... | ||
//maybe no longer offered: | |||
{ | |||
type: "logical", | |||
logicalTag: "maxPrice", | |||
comparison: "lessThan", | |||
value: "xx" | |||
}, | |||
{ | |||
type: "logical", | |||
logicalTag: "minPrice", | |||
comparison: "lessThan", | |||
value: "xx" | |||
}, | |||
] | ] | ||
} | } | ||
Line 536: | Line 364: | ||
paymentMethodIds: [], | paymentMethodIds: [], | ||
deliveryMethodIds: [] | deliveryMethodIds: [] | ||
} | }, | ||
{ | |||
//will find all PlanDeliveryPaymentCombinations for this sellOfferId | |||
type: "logical", | |||
logicalTag: "sellOfferId", | |||
comparison: "equals", | |||
value: {sellOfferId} | |||
}, | |||
{ | |||
//will find all PlanDeliveryPaymentCombinations for listed sellOfferIds | |||
type: "logical", | |||
logicalTag: "sellOfferIds", | |||
comparison: "equals", | |||
value: [] // array of sellOfferIds | |||
}, | |||
... | ... | ||
] | ] |
Revision as of 08:02, 22 November 2021
Overview
A user's plan that connects a user's sell offer to any number of delivery method links and payment method links, and also to the sell offer's prices.
Each sell offer will have one plan, the plan controls the sell offer's prices, and many sell offers can point to the same plan (if they all share the same prices), so any change in price will mean a new sell offer plan.
The plan also links to delivery methods and payment methods using link nodes, so sell offers that use the same sell offer plan must offer the same delivery method and payment methods and their link settings.
Many sell offer plans can use the same delivery method links and payment method links, so if multiple sell offers have the same delivery and payment method settings but different prices, they can share the links but with separate sell offer plans + pricing.
Repository
https://bitbucket.org/izara-market-products/izara-market-products-sell-offer-plan
DynamoDB tables
Standard Config Table Per Service
Configuration tags
{
configTag: "DeliveryMethodManagerServiceName"
configKey: "DeliveryMethodManagerServiceName"
configValue: xxx // eg: "DeliveryMethodManager"
}
{
configTag: "PaymentMethodManagerServiceName"
configKey: "PaymentMethodManagerServiceName"
configValue: xxx // eg: "PaymentMethodManager"
}
{
configTag: "ProductGraphServiceName"
configKey: "ProductGraphServiceName"
configValue: xxx // eg: "ProductGraph"
}
LogicalResultsMain
A cached result set for logicals
{
logicalResultId: "xxx", // hash of logical element
logicalElement: {}, // full element being processed
logicalType: "xx", // same filterType
status: "xxx", // "processing"|"complete",
expiryTime: "xx",
uniqueRequestId: "xx", used for idempotence when first process request called, in case that invocation fails and restarts, can be removed when set to complete
}
- partition key: logicalResultId
- sort key: (none)
LogicalResultsData
Caches found results for logical elements
{
logicalResultId: xxx,
dataId: xxx // eg: one sellofferId
}
- partition key: resultId
- sort key: dataId
Graph database
Service - Products Graph
Nodes
{
nodeLabel: "{SellOfferPlanLib.SELLOFFERPLAN_GRAPH_NODE_LABEL}", // "sellOfferPlan"
schema: {
identifier: true,
restrictProperties: true,
restrictRelationships: true,
properties: {
sellOfferPlanId: {
identifier: true, // create unique id from request params and uniqueMessageId
},
userId: {
immutable: true, // a sellOfferPlan can only be used by one user (because links to their userPaymentMethods)
},
currencyId: {
immutable: true, // all added deliveryMethods must match
},
},
}
}
{
nodeLabel: "{SellOfferPlanLib.SELLOFFERPLAN_DELIVERYMETHODLINK_GRAPH_NODE_LABEL}", // "sellOfferPlanDeliveryMethodLink"
schema: {
identifier: true,
restrictProperties: true,
restrictRelationships: true,
properties: {
sellOfferPlanDeliveryMethodLinkId: {
identifier: true, // create unique id from request params and uniqueMessageId
},
},
}
}
{
nodeLabel: "{SellOfferPlanLib.SELLOFFERPLAN_USERPAYMENTMETHODLINK_GRAPH_NODE_LABEL}", // "sellOfferPlanUserPaymentMethodLink"
schema: {
identifier: true,
restrictProperties: true,
restrictRelationships: true,
properties: {
sellOfferPlanUserPaymentMethodLinkId: {
identifier: true, // create unique id from request params and uniqueMessageId
},
},
}
}
Versioned data
sellOfferPlanDeliveryMethodLinkSettings
{
properties: {
addToRateTableValuePerOrder: {}, // added once per order to the value before calculating delivery method price
addToRateTableValuePerUnit: {}, // added once per orderQuantity to the value before calculating delivery method price
addToCalculatedValuePerOrder: {}, // added once per order to the value after calculating delivery method price
addToCalculatedValuePerUnit: {}, // added once per orderQuantity to the value after calculating delivery method price
valueType: "xx", // orderQuantity|orderValue|productAttributeId|sellOfferTermId, if set overwrites deliveryMethod defaultValueType
valueId: "xx", // if set overwrites deliveryMethod defaultValueId (used for productAttributeId|sellOfferTermId)
},
}
sellOfferPlanUserPaymentMethodLinkSettings
{
properties: {
oneTimePercentage: {}, // increase paymentMethod price by percentage
oneTimeAmount: {}, // increase paymentMethod price by set amount
},
}
- if both oneTimePercentage and oneTimeAmount are set, applies oneTimePercentage first
sellOfferPlanSettings
{
properties: {
combineWins: {}, // true|false
minimumQuantity: xx,
prices: {
sellOfferQuantity: [ // sellOfferQuantity type price settings, ordered low to high
{
upToValue: "xx.xx",
price: "xx.xx",
},
// ...
],
orderQuantity: [ // orderQuantity type price settings, ordered low to high
{
upToValue: "xx.xx",
price: "xx.xx",
},
// ...
]
orderValue: [ // orderValue type price settings, ordered low to high
{
upToValue: "xx.xx",
price: "xx.xx",
},
// ...
]
},
},
}
Relationships
{
relationshipType: "{SellOfferPlanLib.createHasSellOfferPlanGraphRelationshipType()}", // "has_sellOfferPlan"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
- links a user to one of their sell offer plans
{
relationshipType: "{SellOfferPlanLib.createHasDeliveryMethodLinkGraphRelationshipType()}", // "has_deliveryMethodLink"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
{
relationshipType: "{SellOfferPlanLib.createDisabledDeliveryMethodLinkGraphRelationshipType()}", // "disabled_deliveryMethodLink"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
{
relationshipType: "{SellOfferPlanLib.createHasUserPaymentMethodLinkGraphRelationshipType()}", // "has_userPaymentMethodLink"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
{
relationshipType: "{SellOfferPlanLib.createDisabledUserPaymentMethodLinkGraphRelationshipType()}", // "disabled_userPaymentMethodLink"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
- many sell offer plans can link to one delivery method link, or one payment method link, this allows user to share settings in the link nodes across multiple sell offer plans
{
relationshipType: "{SellOfferPlanLib.createIsDeliveryMethodGraphRelationshipType()}", // "is_deliveryMethod"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
{
relationshipType: "{SellOfferPlanLib.createIsUserPaymentMethodGraphRelationshipType()}", // "is_userPaymentMethod"
schema: {
elementCanBeRemoved: true,
allPropertiesImmutable: true,
restrictProperties: true,
properties: {
originTimestamp: //timestamp the request to create/change this relationship was sent
},
}
}
Complex Filter requests
{
filterType: "sellOfferPlan" //unique id is sellOfferPlanId
type: "group",
elements:
[
{
type: "logical",
logicalTag: "userId",
comparison: "equals",
value: "xx"
},
{
type: "logical",
logicalTag: "combineWins",
comparison: "true",
},
{
type: "complexFilter",
complexFilter: {
filterType: "userPaymentMethod",
// see [[Service - Payment Method Generic|Complex Filter requests]]
}
},
{
type: "complexFilter",
complexFilter: {
filterType: "deliveryMethod",
// see [[Service - Delivery Method Standard|Complex Filter requests]]
}
},
...
//maybe no longer offered:
{
type: "logical",
logicalTag: "maxPrice",
comparison: "lessThan",
value: "xx"
},
{
type: "logical",
logicalTag: "minPrice",
comparison: "lessThan",
value: "xx"
},
]
}
{
// finds all combinations where the plan has both a deliveryMethodId and paymentMethodId from the given lists of deliveryMethodId and paymentMethodIds
filterType: "planDeliveryPaymentCombination" //unique id is planDeliveryPaymentCombinationId
type: "group",
elements:
[
{
type: "logical",
logicalTag: "planDeliveryPaymentCombination",
paymentMethodIds: [],
deliveryMethodIds: []
},
{
//will find all PlanDeliveryPaymentCombinations for this sellOfferId
type: "logical",
logicalTag: "sellOfferId",
comparison: "equals",
value: {sellOfferId}
},
{
//will find all PlanDeliveryPaymentCombinations for listed sellOfferIds
type: "logical",
logicalTag: "sellOfferIds",
comparison: "equals",
value: [] // array of sellOfferIds
},
...
]
}
- planDeliveryPaymentCombinationId = {sellOfferPlanId}_{sellOfferPlanDeliveryMethodLinkId}_{sellOfferPlanPaymentMethodLinkId}
Translate Ids - userPaymentMethod and deliveryMethod to sellOfferPlan
- only find sellOfferPlanIds that have has_userPaymentMethodLink or has_deliveryMethodLink relationships (ignore disabled)
- bypasses link nodes (no complex filterType)
Calc pricing use cases
Complex filter
Complex filter (filterType = sellOfferPlan) can find all sellOfferPlanIds that match a pricing comparison, eg minimumPrice < 100:
Cart price
A cart has a fixed deliveryMethod and paymentMethod so no comparisons are needed across these, instead the array of sellOfferQuantities are sent to PriceCalc which returns the total price, per sellOffer price, orderQuantity, etc..
Presenting a sellOffer's price options
- For a range of (or all) paymentMethodIds / deliveryMethodIds, deliverToLocationIds / orderQuantity are fixed.
Presenting a product's price options
- For a range of (or all) paymentMethodIds / deliveryMethodIds, deliverToLocationIds / orderQuantity are fixed
Handling SellOfferPlanPrice errors
- If a SellOfferPlanPrice has an error it's status is set to error
- SellOfferPlanPrice's that are error do save into SellOfferPlanPriceRangePrice, so a SellOfferPlanPriceRange object can see all prices calculated, any requests at this level will need to filter out error prices
- SellOfferPlanPrice's that are error do not save into FilteredSellOfferPlanPrice, they are ignored as they cannot be filtered effectively