diff --git a/docs/prova.txt b/docs/prova.txt
index 54a043f..e69de29 100644
--- a/docs/prova.txt
+++ b/docs/prova.txt
@@ -1 +0,0 @@
-"{ \"code\":\"8017977028342\", \"name\":\"Mochi di Riso Integrale Bio - 250g (0828293)\", \"price\":\"10.48\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__mochi-di-riso-integrale-bio-250g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"6.3\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977001215\", \"name\":\"Malto di Riso Bio - 400g (0706072)\", \"price\":\"5.00\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__malto-di-riso-bio-400-g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.1\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977001338\", \"name\":\"KUZU BIO \", \"price\":\"7.56\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__kuzu-bio.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"5.13\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977004544\", \"name\":\"Sale Marino Integrale FINO\", \"price\":\"1.79\", \"stockQty\":\"6\", \"link\":\"\", \"perc_iva\":\"22\", \"price_acquistato\":\"1\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977034374\", \"name\":\"Bevanda di riso - Rice Drink - 1l (0827622)\", \"price\":\"2.30\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__bevanda-di-riso-rice-drink.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"1.31\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977000669\", \"name\":\"Thain Bio Crema di Sesamo\", \"price\":\"7.00\", \"stockQty\":\"6\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.57\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977001666\", \"name\":\"Malto di Orzo Bio - 400g (0706106)\", \"price\":\"5.18\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__malto-di-orzo-bio-400g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.23\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977002427\", \"name\":\"Acidulato di Umeboshi - 250ml (0706067)\", \"price\":\"4.34\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__acidulato-di-umeboshi-250-ml.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.08\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977043604\", \"name\":\"Tè Bancha Bio\", \"price\":\"2.33\", \"stockQty\":\"12\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__te-bancha-non-tostato.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"1.2\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977013720\", \"name\":\"Pangermoglio con Semi di Lino e Girasole 400 gr. (0828261)\", \"price\":\"6.25\", \"stockQty\":\"3\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__pangermoglio-con-semi-di-lino-e-girasole-400-gr.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.27\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977000515\", \"name\":\"Gomasio Bio alle Alghe - 150g (0706085)\", \"price\":\"4.46\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__gomasio-bio-alle-alghe-150g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.15\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8052204790371\", \"name\":\"Uber Granola Proteica Rosè\", \"price\":\"7.09\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__ubergranola-granola-proteica-rose.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.03\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977000614\", \"name\":\"Umeboshi Bio - 100g (0706118)\", \"price\":\"9.43\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__umeboshi-bio-prugne-salate-la-finestra-sul-cielo.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"6.17\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"4015533015007\", \"name\":\"Succo Verdure \", \"price\":\"4.70\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/verdure.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"3.06\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977034350\", \"name\":\"Bio Avena Drink Senza Glutine - 1l (0845294)\", \"price\":\"2.60\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__avena-drink-senza-glutine-1.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"1.35\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977011696\", \"name\":\"Sciroppo d\\'acero Bio\", \"price\":\"9.40\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__sciroppo-d-acero-canadese-bio-grado-c.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"6.02\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977043550\", \"name\":\"Fette di Semi Bio\", \"price\":\"4.98\", \"stockQty\":\"18\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.21\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977042430\", \"name\":\"Soba Bio - 200g (0001198)\", \"price\":\"6.14\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__soba-bio-giapponese.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.15\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"5600872803133\", \"name\":\"Super colazione Lamponi e Burro di Arachidi\", \"price\":\"6.75\", \"stockQty\":\"6\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"5.15\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"4015533014994\", \"name\":\"Succo di Barbabietole\", \"price\":\"4.94\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__succo-di-barbabietola-rossa.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"3.06\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"7618500940110\", \"name\":\"Succo di carota\", \"price\":\"4.20\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__succo-di-carote-500ml.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"2.39\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8004192103107\", \"name\":\"Acqua Minerale Naturale \", \"price\":\"0.83\", \"stockQty\":\"6\", \"link\":\"\", \"perc_iva\":\"22\", \"price_acquistato\":\"0.48\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977031496\", \"name\":\"Crunchy con Avena e Cacao - 375g (0706078)\", \"price\":\"5.23\", \"stockQty\":\"3\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__crunchy-con-avena-e-cacao-375g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.04\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977031441\", \"name\":\"Crunchy con Avena e Frutti Rossi - 375g (0706080)\", \"price\":\"5.78\", \"stockQty\":\"3\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__crunchy-con-avena-e-frutti-rossi-375-gr.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.04\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977035944\", \"name\":\"Gomasio alla Curcuma Bio - 150g (0706088)\", \"price\":\"3.77\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__gomasio-alla-curcuma-bio.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"2.43\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977003974\", \"name\":\"Alghe Marine Nori\", \"price\":\"6.90\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__alghe-marine-nori-in-fogli-25-g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"4.09\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977020018\", \"name\":\"Stuoia in Bambù (per Sushi) (0708808)\", \"price\":\"3.30\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__stuoia-in-bambu-per-sushi.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"2.32\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977004278\", \"name\":\"Fagioli Azuki Bio \", \"price\":\"3.98\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__azuki-hokkaido-500g.php\", \"perc_iva\":\"04\", \"price_acquistato\":\"3.17\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977028342\", \"name\":\"Mochi di Riso Integrale Bio - 250g (0828293)\", \"price\":\"10.48\", \"stockQty\":\"4\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__mochi-di-riso-integrale-bio-250g.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"6.3\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977041808\", \"name\":\"Avena Mandorla Drink Bio - 1l (0828642)\", \"price\":\"2.60\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__avena-mandorla-drink-bio-bevanda-a-base-di-avena-e-mandorla.php\", \"perc_iva\":\"22\", \"price_acquistato\":\"1.45\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977043505\", \"name\":\"Crunchy Snack ai Semi - 110gr (0007125)\", \"price\":\"4.15\", \"stockQty\":\"14\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__crunchy-snack-ai-semi.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"3.31\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8016323046863\", \"name\":\"Peasy snack\", \"price\":\"1.55\", \"stockQty\":\"15\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"1.13\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977043536\", \"name\":\"Mini Crock Bio Avena e Mix di Semi\", \"price\":\"3.25\", \"stockQty\":\"14\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"2.12\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8056734461442\", \"name\":\"Paccheri Rigati Le Campane\", \"price\":\"3.70\", \"stockQty\":\"12\", \"link\":\"\", \"perc_iva\":\"04\", \"price_acquistato\":\"2.47\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8056734463255\", \"name\":\"Le Pugliesi Foglie di Ulivo con Spinaci Bio\", \"price\":\"3.30\", \"stockQty\":\"12\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__foglie-d-ulivo-con-spinaci-bio.php\", \"perc_iva\":\"04\", \"price_acquistato\":\"2.26\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"4012824406094\", \"name\":\"Infuso Uomo energia Yogi\", \"price\":\"4.18\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__infuso-uomo-energia.php\", \"perc_iva\":\"10\", \"price_acquistato\":\"2.27\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"4012824406100\", \"name\":\"Infuso Donna Energia Yogi\", \"price\":\"4.18\", \"stockQty\":\"6\", \"link\":\"https://www.macrolibrarsi.it/prodotti/__infuso-donna-energia.php#descrizione\", \"perc_iva\":\"10\", \"price_acquistato\":\"2.27\", \"producer_name\":\"La Finestra sul Cielo\"}, { \"code\":\"8017977043307\", \"name\":\"Mochi all\\'Artemisia - 250g (0042682)\", \"price\":\"10.40\", \"stockQty\":\"4\", \"link\":\"\", \"perc_iva\":\"10\", \"price_acquistato\":\"6.3\", \"producer_name\":\"La Finestra sul Cielo\"}, "
\ No newline at end of file
diff --git a/emails/ecommerce/makeorder/it/html.pug b/emails/ecommerce/makeorder/it/html.pug
index b40bbd6..efdac13 100755
--- a/emails/ecommerce/makeorder/it/html.pug
+++ b/emails/ecommerce/makeorder/it/html.pug
@@ -45,6 +45,7 @@ html
- var price = product.order.price
- var after_price = product.order.after_price
- var qty = product.order.quantity
+ - var qtypreordered = product.order.quantitypreordered
- index = index + 1
table(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center")
@@ -66,9 +67,14 @@ html
tr
td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price}
- tr
- td(class="sectionContent", valign="top")
- p Quantità: #{qty}
+ if (qty > 0)
+ tr
+ td(class="sectionContent", valign="top")
+ p Quantità: #{qty}
+ if (qtypreordereded > 0)
+ tr
+ td(class="sectionContent", valign="top")
+ p Quantità Prenotata: #{qtypreorder}
p Note Aggiuntive: #{note}
diff --git a/emails/ecommerce/order_confirmed/it/html.pug b/emails/ecommerce/order_confirmed/it/html.pug
index 089d136..a385c44 100755
--- a/emails/ecommerce/order_confirmed/it/html.pug
+++ b/emails/ecommerce/order_confirmed/it/html.pug
@@ -45,6 +45,7 @@ html
- var price = product.price
- var after_price = product.after_price
- var qty = product.quantity
+ - var qtypreordered = product.order.quantitypreordered
- index = index + 1
table(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center")
@@ -66,9 +67,14 @@ html
tr
td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price}
- tr
- td(class="sectionContent", valign="top")
- p Quantità: #{qty}
+ if (qty > 0)
+ tr
+ td(class="sectionContent", valign="top")
+ p Quantità: #{qty}
+ if (qtypreordered > 0)
+ tr
+ td(class="sectionContent", valign="top")
+ p Quantità Prenotata: #{qtypreordered}
p Note Aggiuntive: #{note}
diff --git a/src/server/models/order.js b/src/server/models/order.js
index 10583ca..d91f43a 100755
--- a/src/server/models/order.js
+++ b/src/server/models/order.js
@@ -2,6 +2,7 @@
const mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
+const shared_consts = require('../tools/shared_nodejs');
const { ObjectID } = require('mongodb');
@@ -44,11 +45,15 @@ const orderSchema = new Schema({
type: Number,
default: 0,
},
+ quantitypreordered: {
+ type: Number,
+ default: 0,
+ },
TotalPriceProduct: {
type: Number,
default: 0,
},
- evaso: { // e quindi è stato tolto dal magazzino (aggiornando il campo StockQty)
+ evaso: { // e quindi è stato tolto dal magazzino (aggiornando il campo stockQty)
type: Boolean,
default: false,
},
@@ -306,7 +311,102 @@ module.exports.getTotalOrderById = async function (id) {
path: '$provider',
preserveNullAndEmptyArrays: true,
},
- }
+ },
+ {
+ $lookup: {
+ from: 'orders',
+ let: { productId: '$product._id' },
+ pipeline: [
+ {
+ $match: {
+ $expr: {
+ $and: [
+ { $eq: ['$idProduct', '$$productId'] },
+ { $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
+ ]
+ }
+ }
+ },
+ {
+ $group: {
+ _id: null,
+ totalQty: { $sum: '$quantity' },
+ }
+ }
+ ],
+ as: 'productOrders'
+ }
+ },
+ {
+ $lookup: {
+ from: 'orders',
+ let: { productId: '$product._id' },
+ pipeline: [
+ {
+ $match: {
+ $expr: {
+ $and: [
+ { $eq: ['$idProduct', '$$productId'] },
+ { $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
+ ]
+ }
+ }
+ },
+ {
+ $group: {
+ _id: null,
+ totalQtyPreordered: { $sum: '$quantitypreordered' }
+ }
+ }
+ ],
+ as: 'productPreOrders'
+ }
+ },
+ {
+ $addFields: {
+ 'product.QuantitaOrdinateInAttesa': {
+ $ifNull: [
+ {
+ $cond: {
+ if: { $isArray: '$productOrders' },
+ then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
+ else: 0
+ }
+ },
+ 0
+ ]
+ },
+ 'product.QuantitaPrenotateInAttesa': {
+ $ifNull: [
+ {
+ $cond: {
+ if: { $isArray: '$productPreOrders' },
+ then: { $arrayElemAt: ['$productPreOrders.totalQtyPreordered', 0] },
+ else: 0
+ }
+ },
+ 0
+ ]
+ },
+ },
+ },
+ {
+ $addFields: {
+ 'product.quantityAvailable': {
+ $subtract: ["$product.stockQty", "$product.QuantitaOrdinateInAttesa"],
+ },
+ 'product.bookableAvailableQty': {
+ $subtract: ["$product.bookableQty", "$product.QuantitaPrenotateInAttesa"],
+ }
+ }
+ },
+ {
+ $unset: 'productOrders'
+ },
+ {
+ $unset: 'productPreOrders'
+ },
+
];
return await Order.aggregate(query);
diff --git a/src/server/models/orderscart.js b/src/server/models/orderscart.js
index 8883e79..0647955 100755
--- a/src/server/models/orderscart.js
+++ b/src/server/models/orderscart.js
@@ -22,6 +22,7 @@ const OrdersCartSchema = new Schema({
numord_pers: { type: Number },
userId: { type: Schema.Types.ObjectId, ref: 'User' },
totalQty: { type: Number, default: 0 },
+ totalQtyPreordered: { type: Number, default: 0 },
totalPrice: { type: Number, default: 0 },
department: {
type: String, ref: 'Department'
@@ -250,10 +251,10 @@ module.exports.getOrdersCartByQuery = async function (query) {
return myorderscart;
}
-module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
+module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder, filterStatus) {
try {
- let query = { idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT }, deleted: false }
+ let query = { idapp, deleted: false }
let myorderscart = null;
if (numorder > 0) {
query.numorder = numorder;
@@ -263,10 +264,14 @@ module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
query.userId = uid;
}
+ if (filterStatus) {
+ query.status = { $gte: shared_consts.OrderStatus.CHECKOUT_SENT };
+ }
+
myorderscart = await OrdersCart.getOrdersCartByQuery(query);
- if (myorderscart)
- console.log('*** Num myorderscart ', myorderscart.length);
+ // if (myorderscart)
+ // console.log('*** Num myorderscart ', myorderscart.length);
/*transform: function(doc, populated) {
@@ -301,6 +306,7 @@ module.exports.updateOrdersCartById = function (id, newOrdersCart, callback) {
$set: {
items: newOrdersCart.items,
totalQty: newOrdersCart.totalQty,
+ totalQtyPreordered: newOrdersCart.totalQtyPreordered,
totalPrice: newOrdersCart.totalPrice,
userId: userId,
status: newOrdersCart.status,
@@ -433,12 +439,18 @@ module.exports.updateStockQtaDalMagazzino = async function (idorderscart) {
let order = myorderscart.items[idkey].order;
if (!order.evaso) {
- const update = {
+ let update = {
$inc: {
stockQty: -order.quantity
}
};
await Product.findOneAndUpdate({ _id: order.idProduct }, update, { new: false });
+ update = {
+ $inc: {
+ bookableQty: -order.quantitypreordered
+ }
+ };
+ await Product.findOneAndUpdate({ _id: order.idProduct }, update, { new: false });
}
}
@@ -544,12 +556,17 @@ module.exports.getmsgorderTelegram = async function (ordersCart) {
msg += '
Lista Prodotti:';
for (const ord of ordersCart.items) {
msg += '
';
- msg += '✅ [' + ord.order.quantity + '] ' + ord.order.product.name + ' (' + ord.order.price + ' € ' + (ord.order.after_price ? ord.order.after_price : '') + ' Tot=' + ord.order.TotalPriceProduct + '€ )';
+ let qtystr = ''
+ if (ord.order.quantity > 0)
+ qtystr += 'Ordinate: ' + ord.order.quantity
+ if (ord.order.quantitypreordered > 0)
+ qtystr += 'Prenotate: ' + ord.order.quantitypreordered
+ msg += '✅ [' + qtystr + '] ' + ord.order.product.name + ' (' + ord.order.price + ' € ' + (ord.order.after_price ? ord.order.after_price : '') + ' Tot=' + ord.order.TotalPriceProduct + '€ )';
}
msg += '
';
- msg += '
Totale Prodotti: ' + ordersCart.totalQty;
+ msg += '
Totale Prodotti: ' + ordersCart.totalQty + ordersCart.totalQtyPreordered;
msg += '
Totale Ordine: ' + ordersCart.totalPrice + ' € 💰';
diff --git a/src/server/models/product.js b/src/server/models/product.js
index 7d34ef9..9b8b280 100755
--- a/src/server/models/product.js
+++ b/src/server/models/product.js
@@ -96,6 +96,10 @@ const productSchema = new Schema({
type: Number,
default: 0,
},
+ bookableQty: { // Quantità prenotabili
+ type: Number,
+ default: 0,
+ },
quantityLow: { //Soglia disponibilità bassa
type: Number,
default: 0,
@@ -275,27 +279,82 @@ module.exports.findAllIdApp = async function (idapp, code, id) {
{
$group: {
_id: null,
- totalQty: { $sum: '$quantity' }
+ totalQty: { $sum: '$quantity' },
}
}
],
as: 'productOrders'
}
},
+ {
+ $lookup: {
+ from: 'orders',
+ let: { productId: '$_id' },
+ pipeline: [
+ {
+ $match: {
+ $expr: {
+ $and: [
+ { $eq: ['$idProduct', '$$productId'] },
+ { $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
+ ]
+ }
+ }
+ },
+ {
+ $group: {
+ _id: null,
+ totalQtyPreordered: { $sum: '$quantitypreordered' }
+ }
+ }
+ ],
+ as: 'productPreOrders'
+ }
+ },
{
$addFields: {
QuantitaOrdinateInAttesa: {
- $cond: {
- if: { $isArray: '$productOrders' },
- then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
- else: 0
- }
+ $ifNull: [
+ {
+ $cond: {
+ if: { $isArray: '$productOrders' },
+ then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
+ else: 0
+ }
+ },
+ 0
+ ]
+ },
+ QuantitaPrenotateInAttesa: {
+ $ifNull: [
+ {
+ $cond: {
+ if: { $isArray: '$productPreOrders' },
+ then: { $arrayElemAt: ['$productPreOrders.totalQtyPreordered', 0] },
+ else: 0
+ }
+ },
+ 0
+ ]
+ },
+ },
+ },
+ {
+ $addFields: {
+ quantityAvailable: {
+ $subtract: ["$stockQty", "$QuantitaOrdinateInAttesa"],
+ },
+ bookableAvailableQty: {
+ $subtract: ["$bookableQty", "$QuantitaPrenotateInAttesa"],
}
}
},
{
$unset: 'productOrders'
},
+ {
+ $unset: 'productPreOrders'
+ },
);
@@ -352,6 +411,14 @@ module.exports.getProductByID = function (id, callback) {
Product.findById(id, callback);
}
+module.exports.updateProductInOrder = async function (order) {
+
+ if (order.product)
+ order.product = await Product.getProductById(order.product._id);
+
+ return order;
+}
+
module.exports.createIndexes((err) => {
if (err) throw err;
});
diff --git a/src/server/modules/Cart.js b/src/server/modules/Cart.js
index 89b3660..cf2af35 100755
--- a/src/server/modules/Cart.js
+++ b/src/server/modules/Cart.js
@@ -34,24 +34,49 @@ class Cart {
}
}
+ isAvailableByOrder(order) {
+ if (order && order.product) {
+ return (order.product.quantityAvailable > 0)
+ }
+ return false;
+ }
+
+ isInPreorderByOrder(order) {
+ if (order && order.product) {
+ return (order.product.bookableAvailableQty > 0)
+ }
+ return false;
+ }
+
async addqty(itemorder) {
const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
if (!!myitem) {
- myitem.order.quantity++;
+ if (this.isAvailableByOrder(myitem.order)) {
+ myitem.order.quantity++;
+ } else {
+ myitem.order.quantitypreordered++;
+ }
+
this.updatetotals();
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
- return myitem.order.quantity;
+ return myitem.order;
}
}
async subqty(itemorder) {
try {
const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
- if (!!myitem && myitem.order.quantity > 0) {
- myitem.order.quantity--;
+ if (!!myitem) {
+ if (myitem.order.quantitypreordered > 0) {
+ myitem.order.quantitypreordered--;
+ } else {
+ if (myitem.order.quantity > 0) {
+ myitem.order.quantity--;
+ }
+ }
this.updatetotals();
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
- return myitem.order.quantity;
+ return myitem.order;
}
} catch (e) {
console.error('Err: ', e);
@@ -76,17 +101,22 @@ class Cart {
}
generateModel() {
- let newCart = new cartModel({
- idapp: this.idapp,
- items: this.generateArray(),
- totalQty: this.totalQty,
- totalPrice: this.totalPrice,
- userId: this.userId,
- department: this.department,
- note: this.note,
- modify_at: this.modify_at
- })
- return newCart
+ try {
+ let newCart = new cartModel({
+ idapp: this.idapp,
+ items: this.generateArray(),
+ totalQty: this.totalQty,
+ totalPrice: this.totalPrice,
+ userId: this.userId,
+ department: this.department,
+ note: this.note,
+ modify_at: this.modify_at
+ })
+ return newCart
+ } catch (e) {
+ console.error('Err', e);
+ }
+ return null;
}
updatetotals() {
@@ -95,19 +125,19 @@ class Cart {
this.totalPrice = 0;
for (const rec in this.items) {
let mypricecalc = 0;
-
+
let order = this.items[rec].order;
if (!order) {
order = this.items[rec];
}
order.TotalPriceProduct = 0;
- this.totalQty += order.quantity;
+ this.totalQty += order.quantity + order.quantitypreordered;
// Calcolo Sconto
let sconti_da_applicare = [];
if (order.scontisticas) {
- let qtadascontare = order.quantity
+ let qtadascontare = order.quantity + order.quantitypreordered
let qtanonscontata = 0
while (qtadascontare > 0) {
@@ -145,9 +175,9 @@ class Cart {
if (qtanonscontata > 0) {
mypricecalc += order.price * qtanonscontata;
}
-
+
} else {
- mypricecalc = order.price * order.quantity;
+ mypricecalc = (order.price * order.quantity) + (order.price * order.quantitypreordered);
}
order.TotalPriceProduct += mypricecalc;
this.totalPrice += order.TotalPriceProduct;
diff --git a/src/server/router/cart_router.js b/src/server/router/cart_router.js
index bf9d903..b41f832 100755
--- a/src/server/router/cart_router.js
+++ b/src/server/router/cart_router.js
@@ -64,7 +64,6 @@ router.post('/:userId', authenticate, async function (req, res, next) {
let cart = null;
let product = null;
// no cart save empty cart to database then return response
- let myqty = 0;
let nuovo = false;
if (!mycart) {
let oldCart = new CartClass(order)
@@ -75,16 +74,19 @@ router.post('/:userId', authenticate, async function (req, res, next) {
}
let newCart = CartClass.constructByCart(mycart);
+ // order = await Product.updateProductInOrder(order);
if (!nuovo) {
if (addqty) {
- myqty = await newCart.addqty(order);
+ myord = await newCart.addqty(order);
} else if (subqty) {
- myqty = await newCart.subqty(order);
+ myord = await newCart.subqty(order);
} else {
const ind = newCart.addItem(order);
+ myord = order;
}
} else {
await newCart.updatetotals();
+ myord = order;
}
cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel());
@@ -95,9 +97,10 @@ router.post('/:userId', authenticate, async function (req, res, next) {
product = await Product.getProductById(order.idProduct);
else if (order.product)
product = await Product.getProductById(order.product._id);
- return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, qty: myqty, product });
+ return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, myord, product });
} else {
- return res.send({ code: server_constants.RIS_CODE_ERR, cart: null });
+ console.error('Err:', err);
+ return res.send({ code: server_constants.RIS_CODE_ERR, cart: null, myord: null });
}
/*
@@ -360,9 +363,9 @@ router.post('/:userId/ordercartstatus', authenticate, async function (req, res,
if (User.isManager(user.perm)) {
// Prende Tutti gli Ordini !
- orderscart = await OrdersCart.getOrdersCartByUserId('ALL', idapp, 0);
+ orderscart = await OrdersCart.getOrdersCartByUserId('ALL', idapp, 0, false);
} else {
- orderscart = await OrdersCart.getOrdersCartByUserId(req.user.id, idapp, 0);
+ orderscart = await OrdersCart.getOrdersCartByUserId(req.user.id, idapp, 0, false);
}
return res.send({ code: server_constants.RIS_CODE_OK, status, orders: orderscart });
diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js
index f501fc6..8d1f536 100755
--- a/src/server/router/index_router.js
+++ b/src/server/router/index_router.js
@@ -1466,9 +1466,9 @@ function load(req, res, version) {
cart = Cart.getCartByUserId(req.user.id, idapp);
if (User.isManager(req.user.perm)) {
// Prende Tutti gli Ordini !
- orderscart = OrdersCart.getOrdersCartByUserId('ALL', idapp, 0);
+ orderscart = OrdersCart.getOrdersCartByUserId('ALL', idapp, 0, false);
} else {
- orderscart = OrdersCart.getOrdersCartByUserId(req.user.id, idapp, 0);
+ orderscart = OrdersCart.getOrdersCartByUserId(req.user.id, idapp, 0, false);
}
}
let askedfriends = [];
diff --git a/src/server/router/orders_router.js b/src/server/router/orders_router.js
index 90c3007..de04a13 100755
--- a/src/server/router/orders_router.js
+++ b/src/server/router/orders_router.js
@@ -30,14 +30,15 @@ const OrdersCart = require('../models/orderscart');
router.get('/:userId', authenticate, function (req, res, next) {
let userId = req.body.userId
let idapp = req.body.idapp
- OrdersCart.getOrdersCartByUserId(userId, idapp, 0, function (err, cart) {
- if (err) return next(err)
+ OrdersCart.getOrdersCartByUserId(userId, idapp, 0, false)
+ .then((cart) => {
+
+ if (cart)
+ res.send({ code: server_constants.RIS_CODE_OK, cart });
+ else
+ res.status(400).send(e);
+ })
- if (cart)
- res.send({ code: server_constants.RIS_CODE_OK, cart });
- else
- res.status(400).send(e);
- })
})
module.exports = router;
diff --git a/src/server/router/products_router.js b/src/server/router/products_router.js
index fcfd9f2..ac837ff 100755
--- a/src/server/router/products_router.js
+++ b/src/server/router/products_router.js
@@ -36,9 +36,9 @@ router.post('/', auth_default, async function (req, res, next) {
let orders = null;
if (await User.isManagerById(userId)) {
// Prende Tutti gli Ordini !
- orders = await OrdersCart.getOrdersCartByUserId('ALL', idapp, 0);
+ orders = await OrdersCart.getOrdersCartByUserId('ALL', idapp, 0, false);
} else {
- orders = await OrdersCart.getOrdersCartByUserId(userId, idapp, 0);
+ orders = await OrdersCart.getOrdersCartByUserId(userId, idapp, 0, false);
}
if (products)