aggiornamento Ordini GAS filtri

This commit is contained in:
Surya Paolo
2024-02-13 18:13:26 +01:00
parent 26ab024514
commit 24f2b46cc8
6 changed files with 663 additions and 90 deletions

View File

@@ -1,11 +1,11 @@
DATABASE=test_FreePlanet
DATABASE=test_PiuCheBuono
UDB=paofreeplanet
PDB=mypassword@1A
SEND_EMAIL=0
SEND_EMAIL_ORDERS=1
PORT=3000
appTelegram_TEST=["1","13"]
appTelegram=["1","13"]
appTelegram_TEST=["1","17"]
appTelegram=["1","17"]
DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=true
MONGODB_USER=admin

47
outout.csv Normal file
View File

@@ -0,0 +1,47 @@
Num|Nome|Peso|Prezzo|Quantita|Totale|Ordini
0|"Acqua distillata di rose di Damasco"|100|8|2|16|1
0|"Artemisia in foglie"|20|1,5|7|10,5|3
0|"Cannella"|100|3|4|12|3
0|"Carruba macinata"|250|3|2|6|2
0|"Cous cous 5 stelle (grano duro, mais, orzo, lenticchie ed avena)"|500|3,5|1|3,5|1
0|"Cous cous d'avena"|500|3|3|9|2
0|"Cous cous d'orzo"|500|3|1|3|1
0|"Cous cous di grano duro (Akka)"|500|3,25|1|3,25|1
0|"Cous cous di lenticchie"|500|3,5|4|14|3
0|"Cous cous di miglio"|500|3|4|12|4
0|"Couscous 5 cereali 1kg"|1|5,5|1|5,5|1
0|"Couscous di grano duro 500g"|500|2,5|1|2,5|1
0|"Curcuma"|100|3|5|15|4
0|"Datteri boufeggous extra 1kg"|1|11|1|11|1
0|"Datteri boufeggous extra 500g"|500|6,5|3|19,5|3
0|"Datteri boustahammi 1kg"|1|5|11|55|6
0|"Datteri boustahammi 500g"|500|3|3|9|3
0|"Datteri bouzagagh 1kg"|1|5,5|2|11|2
0|"Datteri bouzagagh 500g"|500|3,5|7|24,5|6
0|"Farina di segale grigliata 1kg"|1|3,5|1|3,5|1
0|"Fichi secchi bianchi 250g"|250|5|1|5|1
0|"Fichi secchi bianchi 500g"|500|9|1|9|1
0|"Fieno greco"|500|3,5|2|7|1
0|"Ghassoul (pezzetti di argilla saponifera) per capelli"|100|4|2|8|2
0|"Henné"|250|3|2|6|2
0|"Henné (per tatuaggi e capelli)"|200|3,5|1|3,5|1
0|"Henné (per tatuaggi e capelli)"|150|2,5|1|2,5|1
0|"Menta Maachi (autoctona) in foglie"|20|1,5|1|1,5|1
0|"Olio alle rose di Damasco"|60|9|2|18|2
0|"Olio di argan cosmetico 30ml"|30|8|3|24|2
0|"Olio di mandorle dolci"|30|5,5|1|5,5|1
0|"Olio di nigella (cumino nero)"|30|5,5|1|5,5|1
0|"Olio di sesamo"|30|5,5|1|5,5|1
0|"Olive nere"|125|2|1|2|1
0|"Olive nere alle piante aromatiche 1kg"|1|9|1|9|1
0|"Olive nere alle piante aromatiche 500g"|500|5|1|5|1
0|"Olive verdi alle piante aromatiche 1kg"|1|9|1|9|1
0|"Olive verdi alle spezie 500g"|500|5|1|5|1
0|"Paprika dolce senza olio"|100|3|2|6|2
0|"Prugne secche"|250|3|2|6|2
0|"Rose secche di Damasco"|50|2,5|2|5|2
0|"Sapone a base di olio di argan"|80|4|3|12|3
0|"Scrub Naama (rosa, in polvere)"|100|5|2|10|2
0|"Sottopentola medio"|296|2,5|1|2,5|1
0|"Verbena citronella in foglie"|20|1,5|1|1,5|1
0|"Zenzero"|100|3|2|6|2
1 Num Nome Peso Prezzo Quantita Totale Ordini
2 0 Acqua distillata di rose di Damasco 100 8 2 16 1
3 0 Artemisia in foglie 20 1,5 7 10,5 3
4 0 Cannella 100 3 4 12 3
5 0 Carruba macinata 250 3 2 6 2
6 0 Cous cous 5 stelle (grano duro, mais, orzo, lenticchie ed avena) 500 3,5 1 3,5 1
7 0 Cous cous d'avena 500 3 3 9 2
8 0 Cous cous d'orzo 500 3 1 3 1
9 0 Cous cous di grano duro (Akka) 500 3,25 1 3,25 1
10 0 Cous cous di lenticchie 500 3,5 4 14 3
11 0 Cous cous di miglio 500 3 4 12 4
12 0 Couscous 5 cereali 1kg 1 5,5 1 5,5 1
13 0 Couscous di grano duro 500g 500 2,5 1 2,5 1
14 0 Curcuma 100 3 5 15 4
15 0 Datteri boufeggous extra 1kg 1 11 1 11 1
16 0 Datteri boufeggous extra 500g 500 6,5 3 19,5 3
17 0 Datteri boustahammi 1kg 1 5 11 55 6
18 0 Datteri boustahammi 500g 500 3 3 9 3
19 0 Datteri bouzagagh 1kg 1 5,5 2 11 2
20 0 Datteri bouzagagh 500g 500 3,5 7 24,5 6
21 0 Farina di segale grigliata 1kg 1 3,5 1 3,5 1
22 0 Fichi secchi bianchi 250g 250 5 1 5 1
23 0 Fichi secchi bianchi 500g 500 9 1 9 1
24 0 Fieno greco 500 3,5 2 7 1
25 0 Ghassoul (pezzetti di argilla saponifera) per capelli 100 4 2 8 2
26 0 Henné 250 3 2 6 2
27 0 Henné (per tatuaggi e capelli) 200 3,5 1 3,5 1
28 0 Henné (per tatuaggi e capelli) 150 2,5 1 2,5 1
29 0 Menta Maachi (autoctona) in foglie 20 1,5 1 1,5 1
30 0 Olio alle rose di Damasco 60 9 2 18 2
31 0 Olio di argan cosmetico 30ml 30 8 3 24 2
32 0 Olio di mandorle dolci 30 5,5 1 5,5 1
33 0 Olio di nigella (cumino nero) 30 5,5 1 5,5 1
34 0 Olio di sesamo 30 5,5 1 5,5 1
35 0 Olive nere 125 2 1 2 1
36 0 Olive nere alle piante aromatiche 1kg 1 9 1 9 1
37 0 Olive nere alle piante aromatiche 500g 500 5 1 5 1
38 0 Olive verdi alle piante aromatiche 1kg 1 9 1 9 1
39 0 Olive verdi alle spezie 500g 500 5 1 5 1
40 0 Paprika dolce senza olio 100 3 2 6 2
41 0 Prugne secche 250 3 2 6 2
42 0 Rose secche di Damasco 50 2,5 2 5 2
43 0 Sapone a base di olio di argan 80 4 3 12 3
44 0 Scrub Naama (rosa, in polvere) 100 5 2 10 2
45 0 Sottopentola medio 296 2,5 1 2,5 1
46 0 Verbena citronella in foglie 20 1,5 1 1,5 1
47 0 Zenzero 100 3 2 6 2

View File

@@ -9,6 +9,7 @@ const { ObjectID } = require('mongodb');
mongoose.Promise = global.Promise;
mongoose.level = "F";
const fs = require('fs');
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
@@ -607,6 +608,127 @@ module.exports.getTotalOrderById = async function (id) {
return await Order.aggregate(query);
}
module.exports.GeneraCSVOrdineProdotti = async function () {
const myidGasordine = '65c2a8cc379ee4f57e865ee7';
const myquery = [
{ $match: { idGasordine: ObjectID(myidGasordine) } },
{
$lookup: {
from: 'products',
localField: 'idProduct',
foreignField: '_id',
as: 'product'
}
},
{
$unwind: {
path: '$product',
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: 'productinfos',
localField: 'product.idProductInfo',
foreignField: '_id',
as: 'productInfo'
}
},
{
$unwind: {
path: '$productInfo',
},
},
{
$lookup: {
from: 'gasordines',
localField: 'idGasordine',
foreignField: '_id',
as: 'gasordine'
}
},
{
$unwind: {
path: '$gasordine',
preserveNullAndEmptyArrays: true,
},
},
{
$match: {
$or: [
{ 'gasordine.active': true }, // Include documents where gasordines.active is true
{ 'gasordine': { $exists: false } } // Include documents where gasordines array doesn't exist
]
}
},
{
$match: {
$or: [
{ quantity: { $gt: 0 }, },
{ quantitypreordered: { $gt: 0 }, }
]
}
},
{
$group: {
_id: "$product._id",
name: { $first: "$productInfo.name" },
weight: { $first: "$productInfo.weight" },
price_acquistato: { $first: "$product.price_acquistato" },
totalQuantity: { $sum: { $add: ["$quantity", "$quantitypreordered"] } },
totalPrice_acquistato: { $sum: { $multiply: ["$product.price_acquistato", { $add: ["$quantity", "$quantitypreordered"] }] } },
count: { $sum: 1 }
}
},
{
$sort: {
name: 1 // Sort in ascending order based on the "date_created" field
},
}
];
let myorderscart = await Order.aggregate(myquery);
console.log(myorderscart)
return generateCSV(myorderscart, 'outout.csv');
}
function generateCSV(data, outputPath) {
const headers = ['Num', 'Nome', 'Peso', 'Prezzo', 'Quantita', 'Totale', 'Ordini'];
const rows = data.map(item => {
const formattedPrice = item.price_acquistato.toString().replace(/\./g, ','); // Converti "." in ","
const total = item.totalPrice_acquistato.toString().replace(/\./g, ','); // Converti "." in ","
return [
0,
`"${item.name}"`,
item.weight,
formattedPrice,
item.totalQuantity,
total,
item.count
];
});
rows.unshift(headers);
const csvData = rows.map(row => row.join('|'));
fs.writeFile(outputPath, csvData.join('\n'), (err) => {
if (err) {
console.error('Error writing CSV file:', err);
} else {
console.log('CSV file has been successfully generated:', outputPath);
}
});
}
// const Order = mongoose.model('Order', OrderSchema);

View File

@@ -206,6 +206,7 @@ module.exports.getOrdersCartById = async function (id) {
module.exports.getOrdersCartByQuery = async function (query) {
try {
let myorderscart = await OrdersCart.find(query)
.populate('items.order')
@@ -273,6 +274,8 @@ module.exports.getOrdersCartByQuery = async function (query) {
item.order.idProduct.productInfo.unitstr = tools.getUnitsMeasure(item.order.idProduct.productInfo.unit, true);
item.order.idProduct.idProductInfo = item.order.idProduct.productInfo ? item.order.idProduct.productInfo._id : '';
}
const myid = item.order._id;
// console.log('ID ORD', order.numorder, myid, order.user.name);
item.order.product = { ...item.order.idProduct };
item.order.idProduct = item.order.product ? item.order.product._id : '';
item.order.producer = item.order.idProducer;
@@ -296,7 +299,210 @@ module.exports.getOrdersCartByQuery = async function (query) {
myorderscart = fixupdated(myorderscart);
/*
let myquery = [
{ $match: query }, // Match documents based on your query
{
$unwind: "$items"
},
{
$lookup: {
from: "orders", // Assuming the referenced collection is named "orders"
localField: "items.order",
foreignField: "_id",
as: "items.order"
}
},
{
$unwind: {
path: "$items.order",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
{
$lookup: {
from: "products",
localField: "items.order.idProduct",
foreignField: "_id",
as: "items.order.product"
}
},
{
$unwind: {
path: "$items.order.product",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'items.order.idProduct.idProductInfo' with 'ProductInfo'
{
$lookup: {
from: "productinfos",
localField: "items.order.product.idProductInfo",
foreignField: "_id",
as: "items.order.product.productInfo"
}
},
{ $unwind: "$items.order.product.productInfo" }, // Deconstruct the array
// Populate 'items.order.idProducer' with 'Producer'
{
$lookup: {
from: "producers",
localField: "items.order.product.IdProducer",
foreignField: "_id",
as: "items.order.producer"
}
},
{
$unwind: {
path: "$items.order.producer",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'items.order.idProvider' with 'Provider'
{
$lookup: {
from: "providers",
localField: "items.order.idProvider",
foreignField: "_id",
as: "items.order.provider"
}
},
{
$unwind: {
path: "$items.order.provider",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'items.order.idGasordine' with 'Gasordine'
{
$lookup: {
from: "gasordines",
localField: "items.order.idGasordine",
foreignField: "_id",
as: "items.order.gasordine"
}
},
{
$unwind: {
path: "$items.order.gasordine",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'items.order.idStorehouse' with 'Storehouse'
{
$lookup: {
from: "storehouses",
localField: "items.order.idStorehouse",
foreignField: "_id",
as: "items.order.storehouse"
}
},
{
$unwind: {
path: "$items.order.storehouse",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'items.order.idScontisticas' with 'Scontistica'
{
$lookup: {
from: "scontisticas",
localField: "items.order.product.idScontisticas",
foreignField: "_id",
as: "items.order.scontisticas"
}
},
{
$unwind: {
path: "$items.order.scontisticas",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
// Populate 'userId' with 'User'
{
$lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "user"
}
},
{
$unwind: {
path: "$user",
preserveNullAndEmptyArrays: true // Preserve items with no matching orders
}
},
{
$group: {
_id: "$_id",
}
},
{
$project: {
_id: 1,
'user.name': 1,
'user.surname': 1,
'user.username': 1,
'user.profile': 1,
'user.email': 1,
'user.lang': 1,
'totalQty': 1,
'totalQtyPreordered': 1,
'totalPrice': 1,
"totalPriceCalc": 1,
"confermato": 1,
"pagato": 1,
"spedito": 1,
"consegnato": 1,
"preparato": 1,
"ricevuto": 1,
"deleted": 1,
"idapp": 1,
"items": 1,
"userId": 1,
"status": 1,
"note": 1,
"numorder": 1,
"numord_pers": 1,
"created_at": 1,
"modify_at": 1,
}
}
];
// Project to select specific fields from 'User'
/*{
$project: {
"_id": 1,
"name": "$userId.name",
"surname": "$userId.surname",
"username": "$userId.username",
"profile": "$userId.profile",
"email": "$userId.email",
"lang": "$userId.lang",
"items": 1 // Include other fields as needed
}
}
let myorderscart = await OrdersCart.aggregate(myquery);
*/
// Optionally use toArray() to convert cursor to array
return myorderscart;
} catch (e) {
console.error('err', e);
return [];
}
}
module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder, filterStatus) {
@@ -887,6 +1093,19 @@ module.exports.updateOrdersCartTotals = async function (idOrdersCart, update) {
}
)
}
/*
for (const order of orderscart.items) {
await Order.findOneAndUpdate({ _id: order.order._id }, {
$set: {
price: order.order.price,
quantity: order.order.quantity,
quantitypreordered: order.order.quantitypreordered,
TotalPriceProduct: order.order.TotalPriceProduct,
}
})
}*/
orderscart = await OrdersCart.getOrdersCartById(idOrdersCart);
return orderscart;

View File

@@ -19,6 +19,8 @@ const Order = require('../models/order');
const Variant = require('../models/variant');
const { User } = require('../models/user');
const {ObjectID} = require('mongodb');
/*const Department = require('../models/Department')
const Category = require('../models/Category')
const TypedError = require('../modules/ErrorHandler')
@@ -418,4 +420,185 @@ router.post('/:userId/ordercartstatus', authenticate, async function (req, res,
});
//POST cart
router.post('/:userId/gestord', authenticate, async function (req, res, next) {
let idapp = req.body.idapp;
const user = req.user;
let idGasordine = req.body.idGasordine;
const { User } = require('../models/user');
try {
let queryord = []
let filtroOrdini = []
if (idGasordine) {
const gasordine = {
$match: {
idGasordine: {
$type: "objectId", // Checks if the field is of type ObjectId
$eq: ObjectID(idGasordine) // Compares the value to a specific ObjectId
}
}
}
queryord.push(gasordine)
}
const query = [
{
$lookup: {
from: 'products',
localField: 'idProduct',
foreignField: '_id',
as: 'product',
},
},
{
$unwind: {
path: '$product',
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: 'productinfos',
localField: 'product.idProductInfo',
foreignField: '_id',
as: 'productInfo',
},
},
{
$unwind: {
path: '$productInfo',
},
},
{
$lookup: {
from: 'gasordines',
localField: 'idGasordine',
foreignField: '_id',
as: 'gasordine',
},
},
{
$unwind: {
path: '$gasordine',
preserveNullAndEmptyArrays: true,
},
},
{
$match: {
$or: [
{
'gasordine.active': true,
},
{
gasordine: {
$exists: false,
},
},
],
},
},
{
$match: {
$or: [
{
quantity: {
$gt: 0,
},
},
{
quantitypreordered: {
$gt: 0,
},
},
],
},
},
{
$group: {
_id: '$product._id',
name: {
$first: '$productInfo.name',
},
weight: {
$first: '$productInfo.weight',
},
unit: {
$first: '$productInfo.unit',
},
price_acquistato: {
$first: '$product.price_acquistato',
},
price: {
$first: '$product.price',
},
totalQuantity: {
$sum: {
$add: [
'$quantity',
'$quantitypreordered',
],
},
},
totalPrice_acquistato: {
$sum: {
$multiply: [
'$product.price_acquistato',
{
$add: [
'$quantity',
'$quantitypreordered',
],
},
],
},
},
totalPrice: {
$sum: {
$multiply: [
'$product.price',
{
$add: [
'$quantity',
'$quantitypreordered',
],
},
],
},
},
count: {
$sum: 1,
},
},
},
{
$sort: {
name: 1,
},
}
]
queryord = [...queryord, ...query]
filtroOrdini = queryord;
const arrout = await Order.aggregate(filtroOrdini);
for (const rec of arrout) {
}
return res.send({ code: server_constants.RIS_CODE_OK, arrout });
} catch (e) {
console.error('Err', e);
}
});
module.exports = router;

View File

@@ -1245,6 +1245,8 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
} else if (mydata.dbop === 'updateReactionsCounts') {
await Reaction.updateReactionsCounts();
} else if (mydata.dbop === 'GeneraCSVOrdineProdotti') {
await Order.GeneraCSVOrdineProdotti();
} else if (mydata.dbop === 'AbilitaNewsletterALL') {
await User.updateMany({
$or: [