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

305 lines
6.1 KiB
JavaScript
Raw Normal View History

2022-09-14 11:32:04 +02:00
mongoose = require('mongoose').set('debug', false)
2020-12-21 02:16:42 +01:00
const Schema = mongoose.Schema;
const tools = require('../tools/general');
2023-12-14 15:20:21 +01:00
const Producer = require('../models/producer');
2023-12-12 15:42:41 +01:00
const shared_consts = require('../tools/shared_nodejs');
2020-12-21 02:16:42 +01:00
mongoose.Promise = global.Promise;
mongoose.level = "F";
2023-12-11 10:10:52 +01:00
// A1P
2020-12-21 02:16:42 +01:00
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const productSchema = new Schema({
idapp: {
type: String,
},
active: {
type: Boolean,
2023-12-13 19:17:53 +01:00
default: true,
},
2023-12-12 15:42:41 +01:00
idProducer: { type: Schema.Types.ObjectId, ref: 'Producer' },
2020-12-25 03:54:16 +01:00
idStorehouses: [
{ type: Schema.Types.ObjectId, ref: 'Storehouse' }
],
2021-01-18 00:48:17 +01:00
code: {
type: String,
},
codice_EAN: {
type: String,
},
barcode: {
type: String,
},
2020-12-21 02:16:42 +01:00
name: {
type: String,
},
description: {
type: String,
},
department: {
2020-12-25 03:54:16 +01:00
type: String, ref: 'Department'
2020-12-21 02:16:42 +01:00
},
category: {
2023-11-28 14:20:22 +01:00
type: Array,
},
2023-11-28 15:04:17 +01:00
prezzo_ivato: { // Con IVA
2023-11-28 14:20:22 +01:00
type: Number
},
perc_iva: { // 4, 10, 22 &
type: Number
2020-12-21 02:16:42 +01:00
},
price: {
2023-12-12 15:42:41 +01:00
type: Number,
required: true,
2020-12-21 02:16:42 +01:00
},
2023-12-14 15:20:21 +01:00
price_acquistato: {
type: Number,
required: true,
},
2021-06-04 10:07:57 +02:00
after_price: {
type: String
},
2020-12-21 02:16:42 +01:00
color: {
type: String
},
size: {
type: String
},
2020-12-25 03:54:16 +01:00
weight: {
type: Number
},
vegan: {
type: Boolean
},
2023-11-30 14:27:37 +01:00
unit: {
type: Number
},
stockQty: { // in magazzino
type: Number,
2023-12-12 15:42:41 +01:00
default: 0,
},
2020-12-25 03:54:16 +01:00
quantityAvailable: {
2023-12-12 15:42:41 +01:00
type: Number,
default: 0,
2020-12-21 02:16:42 +01:00
},
quantityLow: { //Soglia disponibilità bassa
2023-12-12 15:42:41 +01:00
type: Number,
default: 0,
},
visibilityProductOutOfStock: { // Visibilità prodotto "esaurito"
2023-12-12 15:42:41 +01:00
type: Boolean,
default: false,
},
2021-01-18 00:48:17 +01:00
canBeShipped: { // è spedibile
2023-12-12 15:42:41 +01:00
type: Boolean,
default: false,
2021-01-18 00:48:17 +01:00
},
canBeBuyOnline: { // è acquistabile online
2023-12-12 15:42:41 +01:00
type: Boolean,
default: false,
2021-01-18 00:48:17 +01:00
},
2020-12-25 03:54:16 +01:00
stars: {
2023-12-12 15:42:41 +01:00
type: Number,
default: 0,
2020-12-21 02:16:42 +01:00
},
2020-12-25 03:54:16 +01:00
dateAvailableFrom: {
type: Date
},
2020-12-21 02:16:42 +01:00
icon: {
type: String,
},
img: {
type: String,
},
2023-12-14 15:20:21 +01:00
link: {
type: String,
},
2021-01-18 00:48:17 +01:00
img2: {
type: String,
},
img3: {
type: String,
},
ingredienti: {
type: String,
},
valori_nutrizionali: {
type: String,
},
note: {
type: String,
},
2023-12-14 15:20:21 +01:00
producer_name: {
type: String,
}
2020-12-21 02:16:42 +01:00
});
var Product = module.exports = mongoose.model('Product', productSchema);
2023-12-09 11:55:58 +01:00
productSchema.index({ idapp: 1 });
2020-12-21 02:16:42 +01:00
module.exports.getFieldsForSearch = function () {
2020-12-25 03:54:16 +01:00
return [{ field: 'name', type: tools.FieldType.string }]
2020-12-21 02:16:42 +01:00
};
module.exports.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
2021-01-18 00:48:17 +01:00
module.exports.findAllIdApp = async function (idapp, code) {
2021-06-04 10:07:57 +02:00
let myfind = { idapp, active: true };
2021-01-18 00:48:17 +01:00
if (code) {
myfind = { ...myfind, code }
}
2020-12-21 02:16:42 +01:00
2020-12-25 03:54:16 +01:00
// return await Product.find(myfind);
const query = [
2021-01-18 00:48:17 +01:00
{ $match: myfind },
2020-12-25 03:54:16 +01:00
{
$lookup: {
from: 'producers',
2023-12-12 15:42:41 +01:00
localField: 'idProducer',
2020-12-25 03:54:16 +01:00
foreignField: '_id',
as: 'producer'
}
},
{ $unwind: '$producer' },
{
$lookup: {
from: 'storehouses',
localField: 'idStorehouses',
foreignField: '_id',
as: 'storehouses'
}
},
2023-12-12 15:42:41 +01:00
{
$lookup: {
2023-12-13 19:17:53 +01:00
from: 'orders',
let: { productId: '$_id' },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ['$idProduct', '$$productId'] },
{ $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
]
2023-12-12 15:42:41 +01:00
}
2023-12-13 19:17:53 +01:00
}
2023-12-12 15:42:41 +01:00
},
2023-12-13 19:17:53 +01:00
{
$group: {
_id: null,
totalQty: { $sum: '$quantity' }
2023-12-12 15:42:41 +01:00
}
}
2023-12-13 19:17:53 +01:00
],
as: 'productOrders'
}
},
{
$addFields: {
2023-12-14 15:20:21 +01:00
QuantitaOrdinateInAttesa: {
2023-12-13 19:17:53 +01:00
$cond: {
if: { $isArray: '$productOrders' },
then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
else: 0
}
2023-12-12 15:42:41 +01:00
}
}
2023-12-13 19:17:53 +01:00
},
{
$unset: 'productOrders'
},
2020-12-25 03:54:16 +01:00
];
let ris = await Product.aggregate(query)
return ris;
2020-12-21 02:16:42 +01:00
};
module.exports.getAllProducts = function (query, sort, callback) {
Product.find(query, null, sort, callback)
}
2020-12-25 03:54:16 +01:00
module.exports.getProductByDepartment = function (query, sort, callback) {
2020-12-21 02:16:42 +01:00
Product.find(query, null, sort, callback)
}
2020-12-25 03:54:16 +01:00
module.exports.getProductByCategory = function (query, sort, callback) {
2020-12-21 02:16:42 +01:00
Product.find(query, null, sort, callback)
}
2020-12-25 03:54:16 +01:00
module.exports.getProductByTitle = function (query, sort, callback) {
2020-12-21 02:16:42 +01:00
Product.find(query, null, sort, callback)
}
2021-01-18 00:48:17 +01:00
module.exports.getProductByCode = function (idapp, code) {
return Product.findOne({ idapp, code })
}
2020-12-21 02:16:42 +01:00
module.exports.filterProductByDepartment = function (department, callback) {
let regexp = new RegExp(`^${department}$`, 'i')
2020-12-21 02:16:42 +01:00
var query = { department: { $regex: regexp } };
Product.find(query, callback)
}
module.exports.filterProductByCategory = function (category, callback) {
let regexp = new RegExp(`^${category}$`, 'i')
2020-12-21 02:16:42 +01:00
var query = { category: { $regex: regexp } };
Product.find(query, callback);
}
module.exports.filterProductByTitle = function (title, callback) {
let regexp = new RegExp(`^${title}$`, 'i')
2020-12-21 02:16:42 +01:00
var query = { title: { $regex: regexp } };
Product.find(query, callback);
}
module.exports.getProductByID = function (id, callback) {
Product.findById(id, callback);
}
2023-12-09 11:55:58 +01:00
module.exports.createIndexes((err) => {
if (err) throw err;
});
2023-11-28 15:04:17 +01:00
2023-12-14 15:20:21 +01:00
module.exports.convertAfterImport = async function () {
const arrprod = await Product.find({}).lean();
for (const prod of arrprod) {
if (prod.producer_name) {
// Cerca il produttore
const recproducer = await Producer.findOne({ name: prod.producer_name }).lean();
const campodarimuovere = 'producer_name';
if (recproducer) {
await Product.findOneAndUpdate({ _id: prod._id }, { $set: { idProducer: recproducer._id } })
await Product.findOneAndUpdate({ _id: prod._id }, { $unset: { [campodarimuovere]: 1 } })
}
}
}
}
2023-11-28 15:04:17 +01:00
2020-12-21 02:16:42 +01:00
// const Product = mongoose.model('Product', ProductSchema);
// module.exports = { Product };
2023-11-28 15:04:17 +01:00
// PROVA