@spree/docs 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -155,6 +155,81 @@ Price Lists are managed in the Admin Panel under **Products → Price Lists**, o
|
|
|
155
155
|
|
|
156
156
|
Each Price List contains prices for specific variants and currencies. Products can be added to a Price List, and individual variant prices set within it.
|
|
157
157
|
|
|
158
|
+
## Price History (EU Omnibus Directive)
|
|
159
|
+
|
|
160
|
+
Spree automatically records price changes for EU Omnibus Directive compliance. When a product goes on sale, EU regulations require displaying the lowest price in the preceding 30 days alongside the discounted price.
|
|
161
|
+
|
|
162
|
+
### How It Works
|
|
163
|
+
|
|
164
|
+
Every time a base price amount changes, a `PriceHistory` record is created automatically. Price list prices are not tracked — only the base price visible to all customers.
|
|
165
|
+
|
|
166
|
+
### Fetching Prior Price via API
|
|
167
|
+
|
|
168
|
+
The prior price is available as an expandable field on product and variant endpoints:
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
```typescript SDK
|
|
172
|
+
const product = await client.products.get('spree-tote', {
|
|
173
|
+
expand: ['prior_price'],
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
if (product.prior_price) {
|
|
177
|
+
console.log(product.prior_price.amount) // "9.99"
|
|
178
|
+
console.log(product.prior_price.display_amount) // "$9.99"
|
|
179
|
+
console.log(product.prior_price.currency) // "USD"
|
|
180
|
+
console.log(product.prior_price.recorded_at) // "2026-03-10T..."
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```bash cURL
|
|
185
|
+
curl 'https://api.mystore.com/api/v3/store/products/spree-tote?expand=prior_price' \
|
|
186
|
+
-H 'X-Spree-API-Key: spree_pk_xxx'
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
The response includes a `prior_price` object when expanded:
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{
|
|
194
|
+
"id": "prod_xxx",
|
|
195
|
+
"name": "Spree Tote",
|
|
196
|
+
"price": { "amount": "15.99", "currency": "USD", "display_amount": "$15.99" },
|
|
197
|
+
"prior_price": {
|
|
198
|
+
"amount": "9.99",
|
|
199
|
+
"amount_in_cents": 999,
|
|
200
|
+
"currency": "USD",
|
|
201
|
+
"display_amount": "$9.99",
|
|
202
|
+
"recorded_at": "2026-03-10T14:30:00Z"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Configuration
|
|
208
|
+
|
|
209
|
+
Price history tracking is enabled by default. To disable it (e.g., for non-EU stores):
|
|
210
|
+
|
|
211
|
+
```ruby
|
|
212
|
+
# config/initializers/spree.rb
|
|
213
|
+
Spree.config do |config|
|
|
214
|
+
config.track_price_history = false
|
|
215
|
+
config.price_history_retention_days = 30 # default
|
|
216
|
+
end
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Price history retention defaults to 30 days and can be configured globally. A Rake task is provided for cleanup:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
bundle exec rake spree:price_history:prune
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Seeding Existing Prices
|
|
226
|
+
|
|
227
|
+
After enabling price history on an existing store, seed the current prices as a baseline:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
bundle exec rake spree:price_history:seed
|
|
231
|
+
```
|
|
232
|
+
|
|
158
233
|
## Related Documentation
|
|
159
234
|
|
|
160
235
|
- [Products](products.md) — Products, Variants, and base prices
|
|
@@ -84,6 +84,25 @@ const product = await client.products.get('spree-tote', {
|
|
|
84
84
|
});
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
### Prior Price (EU Omnibus Directive)
|
|
88
|
+
|
|
89
|
+
When a product is on sale, EU regulations require displaying the lowest price in the last 30 days. Use the `prior_price` expand to fetch this:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
const product = await client.products.get('spree-tote', {
|
|
93
|
+
expand: ['prior_price'],
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if (product.prior_price) {
|
|
97
|
+
console.log(product.prior_price.amount); // "9.99"
|
|
98
|
+
console.log(product.prior_price.display_amount); // "$9.99"
|
|
99
|
+
console.log(product.prior_price.currency); // "USD"
|
|
100
|
+
console.log(product.prior_price.recorded_at); // "2026-03-10T..."
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
> **INFO:** Prior price is only relevant on product detail pages (PDP), not on listings. It returns `null` if no price history exists within the 30-day window. Price history tracking can be disabled globally via `Spree::Config[:track_price_history] = false`.
|
|
105
|
+
|
|
87
106
|
### Product Filters
|
|
88
107
|
|
|
89
108
|
Get available filters (price range, availability, options, categories) and sort options for building filter UIs:
|