Using fake Products entity in @capire/orders
This commit is contained in:
@@ -16,10 +16,10 @@ extend Books with {
|
||||
}
|
||||
|
||||
//
|
||||
// Extend Orders with Books as articles
|
||||
// Extend Orders with Books as Products
|
||||
//
|
||||
|
||||
using { sap.capire.orders.OrderItems } from '@capire/orders';
|
||||
extend OrderItems with {
|
||||
book : Association to Books on article = book.ID
|
||||
book : Association to Books on product.ID = book.ID
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ module.exports = async()=>{ // called by server.js
|
||||
const { title, price } = await db.tx(msg).read (Books, book, b => { b.title, b.price })
|
||||
return OrdersService.tx(msg).create ('Orders').entries({
|
||||
OrderNo: 'Order at '+ (new Date).toLocaleString(),
|
||||
Items: [{ article:`${book}`, title, price, amount }],
|
||||
Items: [{ product:{ID:`${book}`}, title, price, amount }],
|
||||
buyer, createdBy: buyer
|
||||
})
|
||||
})
|
||||
@@ -51,8 +51,8 @@ module.exports = async()=>{ // called by server.js
|
||||
//
|
||||
OrdersService.on ('OrderChanged', async (msg) => {
|
||||
console.debug ('> received:', msg.event, msg.data)
|
||||
const { article, deltaAmount } = msg.data
|
||||
return UPDATE (Books) .where ('ID =', article)
|
||||
const { product, deltaAmount } = msg.data
|
||||
return UPDATE (Books) .where ('ID =', product)
|
||||
.and ('stock >=', deltaAmount)
|
||||
.set ('stock -=', deltaAmount)
|
||||
})
|
||||
|
||||
@@ -71,14 +71,14 @@ annotate OrdersService.Orders with @(
|
||||
annotate OrderItems with @(
|
||||
UI: {
|
||||
LineItem: [
|
||||
{Value: article, Label:'Article ID'},
|
||||
{Value: title, Label:'Article Title'},
|
||||
{Value: product_ID, Label:'Product ID'},
|
||||
{Value: title, Label:'Product Title'},
|
||||
{Value: price, Label:'Unit Price'},
|
||||
{Value: amount, Label:'Quantity'},
|
||||
],
|
||||
Identification: [ //Is the main field group
|
||||
{Value: amount, Label:'Amount'},
|
||||
{Value: title, Label:'Article'},
|
||||
{Value: title, Label:'Product'},
|
||||
{Value: price, Label:'Unit Price'},
|
||||
],
|
||||
Facets: [
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
ID;order_ID;amount;article;title;price
|
||||
ID;order_ID;amount;product_ID;title;price
|
||||
58040e66-1dcd-4ffb-ab10-fdce32028b79;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;201;Wuthering Heights;11.11
|
||||
64e718c9-ff99-47f1-8ca3-950c850777d4;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;271;Catweazle;15
|
||||
e9641166-e050-4261-bfee-d1e797e6cb7f;64e718c9-ff99-47f1-8ca3-950c850777d4;2;252;Eleonora;28
|
||||
|
@@ -12,8 +12,15 @@ entity Orders : cuid, managed {
|
||||
entity OrderItems {
|
||||
key ID : UUID;
|
||||
order : Association to Orders;
|
||||
@assert.integrity:false // REVISIT: this is a temporary workaround for a glitch in cds-runtime
|
||||
product : Association to Products;
|
||||
amount : Integer;
|
||||
article : String; //> to allow for arbitrary keys
|
||||
title : String;
|
||||
price : Double;
|
||||
}
|
||||
|
||||
/** This is a stand-in for arbitrary ordered Products */
|
||||
@cds.persistence.skip:'always'
|
||||
entity Products {
|
||||
key ID : String;
|
||||
}
|
||||
|
||||
@@ -7,30 +7,30 @@ class OrdersService extends cds.ApplicationService {
|
||||
|
||||
this.before ('UPDATE', 'Orders', async function(req) {
|
||||
const { ID, Items } = req.data
|
||||
if (Items) for (let { article, amount } of Items) {
|
||||
if (Items) for (let { product_ID, amount } of Items) {
|
||||
const { amount:before } = await cds.tx(req).run (
|
||||
SELECT.one.from (OrderItems, oi => oi.amount) .where ({order_ID:ID, article})
|
||||
SELECT.one.from (OrderItems, oi => oi.amount) .where ({order_ID:ID, product_ID})
|
||||
)
|
||||
if (amount != before) this.orderChanged (article, amount-before)
|
||||
if (amount != before) this.orderChanged (product_ID, amount-before)
|
||||
}
|
||||
})
|
||||
|
||||
this.before ('DELETE', 'Orders', async function(req) {
|
||||
const { ID } = req.data
|
||||
const Items = await cds.tx(req).run (
|
||||
SELECT.from (OrderItems, oi => { oi.article, oi.amount }) .where ({order_ID:ID})
|
||||
SELECT.from (OrderItems, oi => { oi.product_ID, oi.amount }) .where ({order_ID:ID})
|
||||
)
|
||||
if (Items) for (let it of Items) this.orderChanged (it.article, -it.amount)
|
||||
if (Items) for (let it of Items) this.orderChanged (it.product_ID, -it.amount)
|
||||
})
|
||||
|
||||
return super.init()
|
||||
}
|
||||
|
||||
/** order changed -> broadcast event */
|
||||
orderChanged (article, deltaAmount) {
|
||||
orderChanged (product, deltaAmount) {
|
||||
// Emit events to inform subscribers about changes in orders
|
||||
console.log ('> emitting:', 'OrderChanged', { article, deltaAmount })
|
||||
return this.emit ('OrderChanged', { article, deltaAmount })
|
||||
console.log ('> emitting:', 'OrderChanged', { product, deltaAmount })
|
||||
return this.emit ('OrderChanged', { product, deltaAmount })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user