Files
freeplanet_serverside/src/server/models/orderscart.js

566 lines
14 KiB
JavaScript
Raw Normal View History

2022-09-14 11:32:04 +02:00
const mongoose = require('mongoose').set('debug', false)
2021-01-18 00:48:17 +01:00
const Schema = mongoose.Schema;
const shared_consts = require('../tools/shared_nodejs');
const Order = require('../models/order');
var { User } = require('../models/user');
2021-01-18 00:48:17 +01:00
const Storehouse = require('../models/storehouse');
const Provider = require('../models/provider');
const Product = require('../models/product');
const tools = require('../tools/general');
2021-01-18 00:48:17 +01:00
const { ObjectID } = require('mongodb');
const OrdersCartSchema = new Schema({
idapp: {
type: String
},
numorder: { type: Number },
2023-12-15 23:36:43 +01:00
numord_pers: { type: Number },
2021-01-18 00:48:17 +01:00
userId: { type: Schema.Types.ObjectId, ref: 'User' },
totalQty: { type: Number, default: 0 },
2023-12-18 12:11:12 +01:00
TotalPriceProduct: { type: Number, default: 0 },
2021-01-18 00:48:17 +01:00
totalPrice: { type: Number, default: 0 },
department: {
type: String, ref: 'Department'
},
2021-01-18 00:48:17 +01:00
items: [
{
order:
{ type: Schema.Types.ObjectId, ref: 'Order' }
}
],
status: {
type: Number,
Default: 0,
2021-01-18 00:48:17 +01:00
},
evaso: { // e quindi è stato tolto dal magazzino (aggiornando il campo stockQty)
2023-12-13 19:17:53 +01:00
type: Boolean,
default: false,
},
date_evaso: {
type: Date
},
pagato: {
type: Boolean,
default: false,
},
date_pagato: {
type: Date
},
spedito: {
type: Boolean,
default: false,
},
date_spedito: {
type: Date
},
2023-12-14 15:20:21 +01:00
completato: {
2023-12-13 19:17:53 +01:00
type: Boolean,
default: false,
},
2023-12-14 15:20:21 +01:00
date_completato: {
2023-12-13 19:17:53 +01:00
type: Date
},
consegnato: {
type: Boolean,
default: false,
},
date_consegnato: {
type: Date
},
ricevuto: {
type: Boolean,
default: false,
},
date_ricevuto: {
type: Date
},
2021-01-18 00:48:17 +01:00
note: {
type: String
},
modify_at: {
type: Date
},
created_at: {
type: Date
},
deleted: {
type: Boolean,
default: false,
},
2021-01-18 00:48:17 +01:00
});
var OrdersCart = module.exports = mongoose.model('OrdersCart', OrdersCartSchema);
module.exports.findAllIdApp = async function (idapp, userId) {
const myfind = { idapp, userId, deleted: false };
2021-01-18 00:48:17 +01:00
return await await OrdersCart.find(myfind);
};
module.exports.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
module.exports.getFieldsForSearch = function () {
2021-03-30 02:23:38 +02:00
return [{ field: 'note', type: tools.FieldType.string }]
2021-01-18 00:48:17 +01:00
};
2023-12-15 23:36:43 +01:00
module.exports.getLastNumOrder = async function (idapp) {
let query = { idapp, deleted: false }
let numorder = 100;
let numorderrec = await OrdersCart.find(query).sort({ numorder: -1 }).limit(1);
if (numorderrec && numorderrec.length > 0)
numorder = numorderrec[0].numorder;
else
numorder = 100;
return numorder;
};
module.exports.getLastNumOrdPers = async function (uid, idapp) {
let query = { userId: uid, idapp, deleted: false }
2021-01-18 00:48:17 +01:00
let numorder = 1;
let numorderrec = await OrdersCart.find(query).sort({ numorder: -1 }).limit(1);
2023-12-13 19:17:53 +01:00
if (numorderrec && numorderrec.length > 0)
2021-01-18 00:48:17 +01:00
numorder = numorderrec[0].numorder;
2023-12-13 19:17:53 +01:00
else
numorder = 0;
2021-01-18 00:48:17 +01:00
return numorder;
};
module.exports.getStatusCartByUserId = async function (uid, idapp, numorder) {
let query = { userId: uid, idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT } }
2021-03-30 02:23:38 +02:00
let myorderscart = null;
if (numorder > 0) {
query = { userId: uid, idapp, numorder, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT } }
}
myorderscart = await OrdersCart.findOne(query);
if (!!myorderscart)
return myorderscart.status;
else
return shared_consts.OrderStatus.NONE
2023-12-13 19:17:53 +01:00
}
module.exports.getRecCartByUserId = async function (uid, idapp, numorder) {
let query = { userId: uid, idapp, status: { $lt: shared_consts.OrderStatus.CHECKOUT_SENT } }
2023-12-13 19:17:53 +01:00
let myorderscart = null;
if (numorder > 0) {
query = { userId: uid, idapp, numorder, status: { $lt: shared_consts.OrderStatus.CHECKOUT_SENT } }
2023-12-13 19:17:53 +01:00
}
myorderscart = await OrdersCart.findOne(query).lean();
return myorderscart
}
module.exports.getOrdersCartById = async function (id) {
2023-12-17 19:19:04 +01:00
let query = { _id: ObjectID(id) };
const arrris = await OrdersCart.getOrdersCartByQuery(query);
return arrris && arrris.length > 0 ? arrris[0] : null;
}
module.exports.getOrdersCartByQuery = async function (query) {
let myorderscart = await OrdersCart.find(query)
.populate('items.order')
.populate({
path: 'items.order',
populate: {
path: 'idProduct',
model: 'Product'
},
})
.populate({
path: 'items.order',
populate: {
path: 'idProducer',
model: 'Producer'
},
})
.populate({
path: 'items.order',
populate: {
path: 'idProvider',
model: 'Provider'
},
})
.populate({
path: 'items.order',
populate: {
path: 'idStorehouse',
model: 'Storehouse'
},
})
.populate({
path: 'items.order',
populate: {
path: 'idScontisticas',
model: 'Scontistica'
},
})
.populate({
path: 'userId',
model: 'User',
select: '_id name surname username profile', // Specify the fields you want to retrieve
})
.lean();
myorderscart = myorderscart.map(order => {
order.user = order.userId
order.userId = order.user._id
order.items = order.items.map(item => {
if (item.order) {
try {
item.order.product = item.order.idProduct;
item.order.idProduct = item.order.product ? item.order.product._id : '';
item.order.producer = item.order.idProducer;
item.order.idProducer = item.order.producer ? item.order.producer._id : '';
item.order.storehouse = item.order.idStorehouse;
item.order.idStorehouse = item.order.storehouse ? item.order.storehouse._id : '';
item.order.provider = item.order.idProvider;
item.order.idProvider = item.order.provider ? item.order.provider._id : '';
item.order.scontisticas = item.order.scontisticas;
item.order.idScontisticas = item.order.idScontisticas ? item.order.idScontisticas._id : '';
} catch (e) {
console.error('Err: ', e);
}
}
return item;
});
return order;
});
return myorderscart;
2023-12-13 19:17:53 +01:00
}
module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
try {
let query = { idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT }, deleted: false }
let myorderscart = null;
if (numorder > 0) {
query.numorder = numorder;
}
if (uid !== 'ALL') {
query.userId = uid;
}
2023-12-17 19:19:04 +01:00
myorderscart = await OrdersCart.getOrdersCartByQuery(query);
/*transform: function(doc, populated) {
// Rinomina 'idProduct' a 'product' nei risultati della popolazione
populated.product = populated.idProduct;
delete populated.idProduct;
return populated;
},*/
2021-01-18 00:48:17 +01:00
return myorderscart
} catch (e) {
console.error('Err:', e);
}
// return null;
}
2021-01-18 00:48:17 +01:00
module.exports.updateOrdersCartById = function (id, newOrdersCart, callback) {
let query = {
id,
deleted: false,
}
2021-01-18 00:48:17 +01:00
OrdersCart.find(query, function (err, c) {
if (err) throw err
//exist cart in databse
if (c.length > 0) {
2023-12-13 19:17:53 +01:00
return OrdersCart.findOneAndUpdate(
2021-01-18 00:48:17 +01:00
{ _id: id },
{
$set: {
items: newOrdersCart.items,
totalQty: newOrdersCart.totalQty,
totalPrice: newOrdersCart.totalPrice,
2023-12-18 12:11:12 +01:00
totalPriceProduct: newOrdersCart.totalPriceProduct,
2021-01-18 00:48:17 +01:00
userId: userId,
status: newOrdersCart.status,
numorder: newOrdersCart.numorder,
2023-12-15 23:36:43 +01:00
numord_pers: newOrdersCart.numord_pers,
2021-01-18 00:48:17 +01:00
note: newOrdersCart.note,
modify_at: new Date(),
}
},
{ new: true },
callback
)
} else {
//no cart in database
2023-12-13 19:17:53 +01:00
return newOrdersCart.save(callback)
2021-01-18 00:48:17 +01:00
}
})
}
2023-12-14 15:20:21 +01:00
module.exports.setFieldInOrdersById = async function (objtoset, myOrderCart) {
2023-12-13 19:17:53 +01:00
try {
let ris2 = null;
// Imposta su tutti i singoli prodotti ordinati (Order)
for (const recitem of myOrderCart.items) {
ris2 = await Order.findOneAndUpdate(
{ _id: recitem.order._id },
{
$set: objtoset
},
{ new: false }
)
// console.log('ris', ris2);
}
const ris = await OrdersCart.findOneAndUpdate(
{ _id: myOrderCart._id },
2023-12-14 15:20:21 +01:00
{
$set: objtoset
},
{ new: false }
)
} catch (e) {
console.log('Err', e);
2023-12-14 15:20:21 +01:00
}
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
module.exports.setConsegnatoById = async function (value, myOrderCart) {
let objtoset = {
consegnato: value,
date_consegnato: new Date(),
};
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
module.exports.setSpeditoById = async function (value, myOrderCart) {
let objtoset = {
spedito: value,
date_spedito: new Date(),
};
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
module.exports.setPagatoById = async function (value, myOrderCart) {
let objtoset = {
pagato: value,
date_pagato: new Date(),
};
if (!value) {
objtoset.date_pagato = null;
}
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
module.exports.setCompletatoById = async function (value, myOrderCart) {
let objtoset = {
completato: value,
date_completato: new Date(),
};
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
module.exports.setEvasoById = async function (value, myOrderCart) {
let objtoset = {
evaso: value,
date_evaso: new Date(),
};
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
2023-12-14 15:20:21 +01:00
}
module.exports.setRicevutoById = async function (value, myOrderCart) {
let objtoset = {
ricevuto: value,
date_ricevuto: new Date(),
};
return await OrdersCart.setFieldInOrdersById(objtoset, myOrderCart);
}
2021-01-18 00:48:17 +01:00
module.exports.createOrdersCart = async function (newOrdersCart) {
return await newOrdersCart.save()
}
module.exports.updateStockQtaDalMagazzino = async function (idorderscart) {
try {
const myorderscart = await OrdersCart.findOne({ _id: idorderscart }).populate('items.order').lean();
if (myorderscart) {
for (const idkey in myorderscart.items) {
let order = myorderscart.items[idkey].order;
2023-12-14 15:20:21 +01:00
if (!order.evaso) {
const update = {
$inc: {
stockQty: -order.quantity
}
2023-12-14 15:20:21 +01:00
};
await Product.findOneAndUpdate({ _id: order.idProduct }, update, { new: false });
}
}
}
} catch (e) {
console.error('Err', e);
}
}
2023-12-14 15:20:21 +01:00
module.exports.updateCmd = async function (ordersCart, status, value) {
2023-12-13 19:17:53 +01:00
2023-12-14 15:20:21 +01:00
2023-12-17 19:19:04 +01:00
let myOrderCart = await OrdersCart.findOne({ _id: ordersCart._id })
.populate('items.order').lean();
2023-12-13 19:17:53 +01:00
try {
if (!!myOrderCart) {
2023-12-14 15:20:21 +01:00
2023-12-13 19:17:53 +01:00
const id = myOrderCart._id;
2023-12-14 15:20:21 +01:00
if (status === shared_consts.OrderStatus.ORDER_CONFIRMED) {
// Aggiorna anche il Magazzino, togliendo le quantità in Stock
if (value) {
OrdersCart.updateStockQtaDalMagazzino(id);
}
2023-12-14 15:20:21 +01:00
ris = await OrdersCart.setEvasoById(value, myOrderCart);
} else if (status === shared_consts.OrderStatus.DELIVERED) {
ris = await OrdersCart.setConsegnatoById(value, myOrderCart);
} else if (status === shared_consts.OrderStatus.SHIPPED) {
ris = await OrdersCart.setSpeditoById(value, myOrderCart);
} else if (status === shared_consts.OrderStatus.PAYED) {
ris = await OrdersCart.setPagatoById(value, myOrderCart);
} else if (status === shared_consts.OrderStatus.COMPLETED) {
ris = await OrdersCart.setCompletatoById(value, myOrderCart);
} else if (status === shared_consts.OrderStatus.RECEIVED) {
ris = await OrdersCart.setRicevutoById(value, myOrderCart);
2023-12-13 19:17:53 +01:00
}
2023-12-14 15:20:21 +01:00
await OrdersCart.setFieldInOrdersById({ status }, myOrderCart);
2023-12-17 19:19:04 +01:00
myOrderCart = await OrdersCart.getOrdersCartById(ordersCart._id)
2023-12-13 19:17:53 +01:00
// myOrderCart = await OrdersCart.findOne({ _id: idorderscart });
2023-12-14 15:20:21 +01:00
return myOrderCart;
2023-12-13 19:17:53 +01:00
}
} catch (e) {
console.error('Err:', e)
}
}
2021-01-18 00:48:17 +01:00
OrdersCartSchema.pre('save', async function (next) {
try {
if (this.isNew) {
try {
const myrec = await User.findOne({ idapp: this.idapp }).limit(1).sort({ neworder: -1 });
if (!!myrec) {
this.neworder = myrec._doc.neworder + 1;
} else {
this.neworder = 1;
}
} catch (e) {
this.neworder = 2;
}
}
/*
if (user.isModified('password')) {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(user.password, salt, (err, hash) => {
user.password = hash;
next();
});
});
} else {
next();
}
*/
next();
} catch (e) {
console.error(e.message);
}
});
2023-12-09 11:55:58 +01:00
2023-12-17 19:19:04 +01:00
module.exports.getmsgorderTelegram = async function (ordersCart) {
try {
const statusstr = shared_consts.getStatusStr(ordersCart.status);
let msg = '🟢✍️ Ordine n. ' + ordersCart.numorder
msg += '<br>Stato: ' + statusstr;
msg += '<br>🙎🏻‍♂️ ' + tools.getNomeCognomeEUserNameByUser(ordersCart.user)
if (ordersCart.note)
msg += '<br>Note: ' + ordersCart.note;
msg += '<br><br>Lista Prodotti:';
for (const ord of ordersCart.items) {
msg += '<br>';
2023-12-18 08:02:28 +01:00
msg += '✅ [' + ord.order.quantity + '] ' + ord.order.product.name + ' (' + ord.order.price + ' € ' + (ord.order.after_price ? ord.order.after_price : '') + ' Tot=' + ord.order.TotalPriceProduct + '€ )';
2023-12-17 19:19:04 +01:00
}
msg += '<br>';
msg += '<br>Totale Prodotti: ' + ordersCart.totalQty;
msg += '<br>Totale Ordine: ' + ordersCart.totalPrice + ' € 💰';
return msg;
} catch (e) {
console.error('Err', e);
}
};
2023-12-09 11:55:58 +01:00
module.exports.createIndexes((err) => {
if (err) throw err;
});