Merge branch 'Dev_PDB1' of ssh://risosrv:5522/~/repository/freeplanet_serverside into Dev_PDB1

This commit is contained in:
Surya Paolo
2023-12-18 08:34:51 +01:00
27 changed files with 1118 additions and 355 deletions

View File

@@ -2,6 +2,7 @@ DATABASE=test_PiuCheBuono
UDB=paofreeplanet
PDB=mypassword@1A
SEND_EMAIL=0
SEND_EMAIL_ORDERS=0
PORT=3000
appTelegram_TEST=["1","13"]
appTelegram=["1","13"]
@@ -15,6 +16,7 @@ PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true
DEBUG=0
DEBUG=0
TESTING_ON=1
LOCALE=1
DELAY_SENDEMAIL=2000

View File

@@ -2,6 +2,7 @@ DATABASE=PiuCheBuono
UDB=paofreeplanet
PDB=suerteFreePlanet@1A
SEND_EMAIL=1
SEND_EMAIL_ORDERS=1
PORT=3000
appTelegram_TEST=["17"]
appTelegram=["17"]

View File

@@ -2,6 +2,7 @@ DATABASE=test_PiuCheBuono
UDB=paofreeplanet
PDB=suerteFreePlanet@1A
SEND_EMAIL=1
SEND_EMAIL_ORDERS=1
PORT=3001
appTelegram_TEST=["17"]
appTelegram=["17"]

View File

@@ -4,7 +4,10 @@ module.exports = {
name: "FreePlanetServerSide",
script: "./src/server/server.js",
ignore_watch : ["node_modules"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
watch: false,
//autorestart: true,
instances: 1,
env: {
"PORT": 3000,
"NODE_ENV": "development",
@@ -17,9 +20,9 @@ module.exports = {
"PORT": 3000,
"NODE_ENV": "production",
},
log_file: "combined.outerr.log",
error_file: "err.log",
out_file: "out.log",
log_file: "logs/combined.outerr.log",
error_file: "logs/err.log",
out_file: "logs/out.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
}

View File

@@ -40,11 +40,11 @@ html
- var index = 0
each product in orders.items
- var descr = product.order.product.name
- var img = product.order.product.img
- var price = product.order.price
- var after_price = product.order.after_price
- var qty = product.order.quantity
- var descr = product.name
- var img = product.img
- var price = product.price
- var after_price = product.after_price
- var qty = product.quantity
- index = index + 1
table(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center")

View File

@@ -93,3 +93,15 @@ Gio 12/10 ORE 15:06: USER [paoloar77]: bottone
Ven 13/10 ORE 11:05: USER [SuryaArena]: bottone
Ven 13/10 ORE 11:40: USER [SuryaArena]: bottone
Dom 17/12 ORE 15:38: USER [admin]: prova
Dom 17/12 ORE 16:18: USER [admin]: vai al sito
Dom 17/12 ORE 16:19: USER [admin]: vai al sito
Dom 17/12 ORE 16:19: USER [admin]: il mio profilo
Dom 17/12 ORE 16:19: USER [admin]: prova
Dom 17/12 ORE 16:19: USER [admin]: link da condividere

View File

@@ -14,7 +14,7 @@
"test-watch": "nodemon --exec 'npm test'"
},
"engines": {
"node": "^18.17.0"
"node": "^18.19.0"
},
"author": "Paolo Arena",
"license": "MIT",

View File

@@ -50,11 +50,11 @@ const BotSchema = new Schema({
},
});
BotSchema.statics.getFieldsForSearch = function() {
BotSchema.statics.getFieldsForSearch = function () {
return [{ field: 'label', type: tools.FieldType.string }]
};
BotSchema.statics.executeQueryTable = function(idapp, params) {
BotSchema.statics.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
@@ -66,12 +66,141 @@ BotSchema.statics.DuplicateAllRecords = async function (idapporig, idappdest) {
};
BotSchema.statics.findAllIdApp = async function(idapp) {
BotSchema.statics.generateBotMenuRecords = async function (idapp) {
try {
let arrrec = [
{
"page": 1,
"index": 1,
"riga": 1,
"active": true,
"label": "Vai al Sito",
"type": 3,
"value": "{host}",
"visibility": 0,
idapp,
"lang": "it",
"main": true
},
{
"page": 1,
"index": 1,
"riga": 2,
"active": true,
"label": "Il mio Profilo",
"type": 3,
"value": "{host}/my/{username}",
"visibility": 1,
idapp,
"lang": "it",
"main": true
},
{
"page": 1,
"index": 1,
"riga": 3,
"active": true,
"label": "Link da Condividere",
"type": 2,
"value": "{host}/registrati/{username}",
"visibility": 1,
idapp,
"lang": "it",
"main": true,
},
{
"page": 1,
"index": 2,
"riga": 1,
"active": true,
"label": "🔮 Help",
"type": 4,
"value": "",
"visibility": 0,
idapp,
"lang": "it",
"main": true,
},
{
"page": 1,
"index": 1,
"riga": 3,
"active": true,
"label": "💁‍♀️ Admin",
"type": 4,
"value": "",
"visibility": 5,
idapp,
"lang": "it",
"main": true
},
{
"page": 1,
"index": 2,
"riga": 2,
"active": true,
"label": "Imposta Foto Profilo",
"type": 4,
"value": "🖼 SetPicProfile",
"visibility": 1,
idapp,
"lang": "it",
"main": true
},
{
"page": 1,
"index": 2,
"riga": 3,
"active": true,
"label": "🛠 Strumenti",
"type": 1,
"value": "2",
"visibility": 1,
idapp,
"lang": "it",
"main": true,
},
{
"page": 2,
"index": 1,
"riga": 1,
"active": true,
"label": "🔑 Cambio Password",
"type": 4,
"value": "🔑 SetResetPwd",
"visibility": 1,
idapp,
"lang": "it",
},
{
"page": 2,
"index": 1,
"riga": 2,
"active": true,
"label": "👉🏻 Indietro",
"type": 1,
"value": "1",
"visibility": 1,
idapp,
"lang": "it",
}];
const ris = await MyBot.insertMany(arrrec);
return ris;
} catch (e) {
console.error('Err:', e);
}
}
BotSchema.statics.findAllIdApp = async function (idapp) {
const Bot = this;
const myfind = {idapp};
const myfind = { idapp };
return await Bot.find(myfind).sort({page: 1, lang: 1, riga: 1, index: 1}).lean();
return await Bot.find(myfind).sort({ page: 1, lang: 1, riga: 1, index: 1 }).lean();
};
const MyBot = mongoose.model('Bot', BotSchema);
@@ -80,4 +209,4 @@ MyBot.createIndexes((err) => {
if (err) throw err;
});
module.exports = {MyBot};
module.exports = { MyBot };

View File

@@ -98,7 +98,6 @@ MovementSchema.statics.addMov = async function (idapp, accountFromIdTable, accou
let mymov = await Movement.create(
{
_id: new ObjectID().toString(),
idapp,
transactionDate: new Date(),
accountFromId: accountFromIdTable._id,

View File

@@ -25,8 +25,11 @@ const orderSchema = new Schema({
idProduct: { type: Schema.Types.ObjectId, ref: 'Product' },
idProducer: { type: Schema.Types.ObjectId, ref: 'Producer' },
idStorehouse: { type: Schema.Types.ObjectId, ref: 'StoreHouse' },
idScontisticas: [{ type: Schema.Types.ObjectId, ref: 'Scontistica' }],
idProvider: { type: Schema.Types.ObjectId, ref: 'Provider' },
price: {
type: Number
type: Number,
default: 0,
},
after_price: {
type: String
@@ -38,7 +41,12 @@ const orderSchema = new Schema({
type: String
},
quantity: {
type: Number
type: Number,
default: 0,
},
TotalPriceProduct: {
type: Number,
default: 0,
},
evaso: { // e quindi è stato tolto dal magazzino (aggiornando il campo StockQty)
type: Boolean,
@@ -148,8 +156,41 @@ module.exports.findAllIdApp = async function (idapp) {
as: 'producer'
}
},
{ $unwind: '$product' },
{ $unwind: '$producer' },
{
$lookup: {
from: 'providers',
localField: 'idProvider',
foreignField: '_id',
as: 'provider'
}
},
{
$lookup: {
from: 'scontisticas',
localField: 'idScontisticas',
foreignField: '_id',
as: 'scontistica'
}
},
{
$unwind: {
path: '$product',
preserveNullAndEmptyArrays: true,
},
},
{
$unwind: {
path: '$producer',
preserveNullAndEmptyArrays: true,
},
},
{
$unwind: {
path: '$provider',
preserveNullAndEmptyArrays: true,
},
}
];
return await Order.aggregate(query)
@@ -170,30 +211,33 @@ module.exports.getOrderByID = function (id, callback) {
}
module.exports.createOrder = async function (order) {
const orderModel = new Order(order);
return await orderModel.save(order)
.then((ris) => {
if (!!ris)
return ris._id;
return null;
});
try {
return await Order.create(order)
.then((ris) => {
if (!!ris)
return ris._id;
return null;
});
} catch (e) {
console.error('err', e);
}
}
module.exports.updateStatusOrders = async function (arrOrders, status) {
for (const order of arrOrders) {
const ret = await this.findOneAndUpdate({ _id: order._id }, { $set: status });
}
}
module.exports.updateStatusOrdersElements = async function (arrOrders, myelements) {
for (const order of arrOrders) {
const ret = await this.findOneAndUpdate({ _id: order._id }, { $set: myelements });
}
}
module.exports.getTotalOrderById = async function (id) {
@@ -223,9 +267,46 @@ module.exports.getTotalOrderById = async function (id) {
as: 'storehouse'
}
},
{ $unwind: '$product' },
{ $unwind: '$producer' },
{ $unwind: '$storehouse' },
{
$lookup: {
from: 'providers',
localField: 'idProvider',
foreignField: '_id',
as: 'provider'
}
},
{
$lookup: {
from: 'scontisticas',
localField: 'idScontisticas',
foreignField: '_id',
as: 'scontisticas'
}
},
{
$unwind: {
path: '$product',
preserveNullAndEmptyArrays: true,
},
},
{
$unwind: {
path: '$producer',
preserveNullAndEmptyArrays: true,
},
},
{
$unwind: {
path: '$storehouse',
preserveNullAndEmptyArrays: true,
},
},
{
$unwind: {
path: '$provider',
preserveNullAndEmptyArrays: true,
},
}
];
return await Order.aggregate(query);

View File

@@ -6,7 +6,8 @@ const shared_consts = require('../tools/shared_nodejs');
const Order = require('../models/order');
var { User } = require('../models/user');
const Storehouse = require('../models/storehouse');
const Storehouse = require('../models/storehouse');
const Provider = require('../models/provider');
const Product = require('../models/product');
const tools = require('../tools/general');
@@ -18,6 +19,7 @@ const OrdersCartSchema = new Schema({
type: String
},
numorder: { type: Number },
numord_pers: { type: Number },
userId: { type: Schema.Types.ObjectId, ref: 'User' },
totalQty: { type: Number, default: 0 },
totalPrice: { type: Number, default: 0 },
@@ -34,7 +36,7 @@ const OrdersCartSchema = new Schema({
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,
},
@@ -109,7 +111,21 @@ module.exports.getFieldsForSearch = function () {
};
module.exports.getLastNumOrder = async function (uid, idapp) {
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 }
let numorder = 1;
let numorderrec = await OrdersCart.find(query).sort({ numorder: -1 }).limit(1);
@@ -140,10 +156,10 @@ module.exports.getStatusCartByUserId = async function (uid, idapp, numorder) {
}
module.exports.getRecCartByUserId = async function (uid, idapp, numorder) {
let query = { userId: uid, idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT } }
let query = { userId: uid, idapp, status: { $lt: shared_consts.OrderStatus.CHECKOUT_SENT } }
let myorderscart = null;
if (numorder > 0) {
query = { userId: uid, idapp, numorder, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT } }
query = { userId: uid, idapp, numorder, status: { $lt: shared_consts.OrderStatus.CHECKOUT_SENT } }
}
myorderscart = await OrdersCart.findOne(query).lean();
@@ -152,36 +168,24 @@ module.exports.getRecCartByUserId = async function (uid, idapp, numorder) {
}
module.exports.getOrdersCartById = async function (id) {
let query = { _id: id };
return await OrdersCart.findOne(query);
let query = { _id: ObjectID(id) };
const arrris = await OrdersCart.getOrdersCartByQuery(query);
return arrris && arrris.length > 0 ? arrris[0] : null;
}
module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
let query = { idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT }, deleted: false }
let myorderscart = null;
if (numorder > 0) {
query.numorder = numorder;
}
module.exports.getOrdersCartByQuery = async function (query) {
if (uid !== 'ALL') {
query.userId = uid;
}
myorderscart = await OrdersCart.find(query).populate('items.order')
let myorderscart = await OrdersCart.find(query)
.populate('items.order')
.populate({
path: 'items.order',
populate: {
path: 'idProduct',
model: 'Product'
},
/*transform: function(doc, populated) {
// Rinomina 'idProduct' a 'product' nei risultati della popolazione
populated.product = populated.idProduct;
delete populated.idProduct;
return populated;
},*/
})
.populate({
path: 'items.order',
@@ -189,12 +193,13 @@ module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
path: 'idProducer',
model: 'Producer'
},
/* transform: function(doc, populated) {
// Rinomina 'idProduct' a 'product' nei risultati della popolazione
populated.producer = populated.idProducer;
delete populated.idProducer;
return populated;
}, */
})
.populate({
path: 'items.order',
populate: {
path: 'idProvider',
model: 'Provider'
},
})
.populate({
path: 'items.order',
@@ -202,126 +207,84 @@ module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
path: 'idStorehouse',
model: 'Storehouse'
},
/*transform: function(doc, populated) {
// Rinomina 'idProduct' a 'product' nei risultati della popolazione
populated.storehouse = populated.idStorehouse;
delete populated.idStorehouse;
return populated;
},*/
})
.populate('userId').lean();
.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.items = order.items.map(item => {
item.order.product = item.order.idProduct;
delete item.order.idProduct;
item.order.producer = item.order.idProducer;
delete item.order.idProducer;
item.order.storehouse = item.order.idStorehouse;
delete item.order.idStorehouse;
return item;
});
return order;
});
/*for (let ind = 0; ind < myorderscart.length; ind++) {
for (const idkey in myorderscart[ind].items) {
try {
let idorder = myorderscart[ind].items[idkey]._id.toString();
const myorder = myorderscart[ind].items[idkey].order;
if (!!myorder) {
idorder = myorderscart[ind].items[idkey].order._id.toString();
}
// myorderscart[ind].nameSurname = await User.getNameSurnameById(idapp, myorderscart[ind].userId);
// const myord = await Order.getTotalOrderById(idorder);
// if (myord.length > 0) {
// myorderscart[ind].items[idkey].order = myord[0];
// }
} catch (e) {
console.log('err', e);
}
}
}*/
/* if (!!mycart) {
for (const idkey in mycart.items) {
myorderscart = myorderscart.map(order => {
order.user = order.userId
order.userId = order.user._id
order.items = order.items.map(item => {
if (item.order) {
try {
idorder = mycart.items[idkey]._id.toString();
const myorder = mycart.items[idkey].order;
if (!!myorder) {
idorder = mycart.items[idkey].order._id.toString();
}
const myord = await Order.getTotalOrderById(idorder);
if (myord.length > 0) {
mycart.items[idkey]._doc.order = myord[0];
}
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.log('err', e);
console.error('Err: ', e);
}
}
return mycart;
}*/
return myorderscart
// return null;
return item;
});
return order;
});
return myorderscart;
}
module.exports.getOrdersCartByUserId = async function (uid, idapp, numorder) {
module.exports.getOrdersCartByDepartmentId = async function (depId, idapp) {
let query = {
idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT },
deleted: false,
}
const myorderscart = await OrdersCart.find(query).lean();
for (let ind = 0; ind < myorderscart.length; ind++) {
for (const idkey in myorderscart[ind].items) {
try {
let idorder = myorderscart[ind].items[idkey]._id.toString();
const myorder = myorderscart[ind].items[idkey].order;
if (!!myorder) {
idorder = myorderscart[ind].items[idkey].order._id.toString();
}
myorderscart[ind].nameSurname = await User.getNameSurnameById(idapp, myorderscart[ind].userId);
const myord = await Order.getTotalOrderById(idorder);
if (myord.length > 0) {
myorderscart[ind].items[idkey].order = myord[0];
}
} catch (e) {
console.log('err', e);
}
try {
let query = { idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT }, deleted: false }
let myorderscart = null;
if (numorder > 0) {
query.numorder = numorder;
}
}
return myorderscart
// return null;
}
module.exports.getOrderById = async function (Id, idapp) {
let query = { _id: Id, idapp, status: { $gte: shared_consts.OrderStatus.CHECKOUT_SENT } }
const myorderscart = await OrdersCart.find(query).lean();
for (let ind = 0; ind < myorderscart.length; ind++) {
for (const idkey in myorderscart[ind].items) {
try {
let idorder = myorderscart[ind].items[idkey]._id.toString();
const myorder = myorderscart[ind].items[idkey].order;
if (!!myorder) {
idorder = myorderscart[ind].items[idkey].order._id.toString();
}
myorderscart[ind].nameSurname = await User.getNameSurnameById(idapp, myorderscart[ind].userId);
const myord = await Order.getTotalOrderById(idorder);
if (myord.length > 0) {
myorderscart[ind].items[idkey].order = myord[0];
}
} catch (e) {
console.log('err', e);
}
if (uid !== 'ALL') {
query.userId = uid;
}
}
return myorderscart
myorderscart = await OrdersCart.getOrdersCartByQuery(query);
if (myorderscart)
console.log('*** Num myorderscart ', myorderscart.length);
/*transform: function(doc, populated) {
// Rinomina 'idProduct' a 'product' nei risultati della popolazione
populated.product = populated.idProduct;
delete populated.idProduct;
return populated;
},*/
return myorderscart
} catch (e) {
console.error('Err:', e);
}
// return null;
}
module.exports.updateOrdersCartById = function (id, newOrdersCart, callback) {
let query = {
id,
@@ -342,6 +305,7 @@ module.exports.updateOrdersCartById = function (id, newOrdersCart, callback) {
userId: userId,
status: newOrdersCart.status,
numorder: newOrdersCart.numorder,
numord_pers: newOrdersCart.numord_pers,
note: newOrdersCart.note,
modify_at: new Date(),
}
@@ -358,23 +322,30 @@ module.exports.updateOrdersCartById = function (id, newOrdersCart, callback) {
module.exports.setFieldInOrdersById = async function (objtoset, myOrderCart) {
const ris = await OrdersCart.findOneAndUpdate(
{ _id: myOrderCart._id },
{
$set: objtoset
},
{ new: false }
)
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);
}
// Imposta su tutti i singoli prodotti ordinati (Order)
for (const order of myOrderCart.items) {
await Order.findOneAndUpdate(
{ _id: order._id },
const ris = await OrdersCart.findOneAndUpdate(
{ _id: myOrderCart._id },
{
$set: objtoset
},
{ new: false }
)
} catch (e) {
console.log('Err', e);
}
}
@@ -459,7 +430,6 @@ module.exports.updateStockQtaDalMagazzino = async function (idorderscart) {
if (myorderscart) {
for (const idkey in myorderscart.items) {
let idorder = myorderscart.items[idkey]._id;
let order = myorderscart.items[idkey].order;
if (!order.evaso) {
@@ -482,7 +452,8 @@ module.exports.updateStockQtaDalMagazzino = async function (idorderscart) {
module.exports.updateCmd = async function (ordersCart, status, value) {
let myOrderCart = await OrdersCart.findOne({ _id: ordersCart._id }).populate('items.order').lean();
let myOrderCart = await OrdersCart.findOne({ _id: ordersCart._id })
.populate('items.order').lean();
try {
if (!!myOrderCart) {
@@ -510,7 +481,7 @@ module.exports.updateCmd = async function (ordersCart, status, value) {
await OrdersCart.setFieldInOrdersById({ status }, myOrderCart);
myOrderCart = await OrdersCart.findOne({ _id: ordersCart._id }).populate('items.order').lean();
myOrderCart = await OrdersCart.getOrdersCartById(ordersCart._id)
// myOrderCart = await OrdersCart.findOne({ _id: idorderscart });
return myOrderCart;
@@ -557,6 +528,39 @@ OrdersCartSchema.pre('save', async function (next) {
}
});
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>';
msg += '✅ [' + ord.order.quantity + '] ' + ord.order.product.name + ' (' + ord.order.price + ' € ' + (ord.order.after_price ? ord.order.after_price : '') + ' Tot=' + ord.order.TotalPriceProduct + '€ )';
}
msg += '<br>';
msg += '<br>Totale Prodotti: ' + ordersCart.totalQty;
msg += '<br>Totale Ordine: ' + ordersCart.totalPrice + ' € 💰';
return msg;
} catch (e) {
console.error('Err', e);
}
};
module.exports.createIndexes((err) => {
if (err) throw err;
});

View File

@@ -4,9 +4,14 @@ const Schema = mongoose.Schema;
const tools = require('../tools/general');
const Producer = require('../models/producer');
const Storehouse = require('../models/storehouse');
const Provider = require('../models/provider');
const Scontistica = require('../models/scontistica');
const shared_consts = require('../tools/shared_nodejs');
const { ObjectID } = require('mongodb');
mongoose.Promise = global.Promise;
mongoose.level = "F";
@@ -29,8 +34,13 @@ const productSchema = new Schema({
idStorehouses: [
{ type: Schema.Types.ObjectId, ref: 'Storehouse' }
],
idScontisticas: [
{ type: Schema.Types.ObjectId, ref: 'Scontistica' }
],
idProvider: { type: Schema.Types.ObjectId, ref: 'Provider' },
code: {
type: String,
unique: true,
},
codice_EAN: {
type: String,
@@ -86,10 +96,6 @@ const productSchema = new Schema({
type: Number,
default: 0,
},
quantityAvailable: {
type: Number,
default: 0,
},
quantityLow: { //Soglia disponibilità bassa
type: Number,
default: 0,
@@ -140,7 +146,10 @@ const productSchema = new Schema({
producer_name: {
type: String,
},
fornitore_name: {
provider_name: {
type: String,
},
magazzino_name: {
type: String,
},
});
@@ -158,79 +167,149 @@ module.exports.executeQueryTable = function (idapp, params) {
return tools.executeQueryTable(this, idapp, params);
};
module.exports.findAllIdApp = async function (idapp, code) {
let myfind = { idapp, active: true };
module.exports.getProductByCode = function (idapp, code) {
return Product.findAllIdApp(idapp, code);
}
if (code) {
myfind = { ...myfind, code }
}
module.exports.getProductById = async function (id) {
const arrris = await Product.findAllIdApp('', '', id);
return arrris && arrris.length > 0 ? arrris[0] : null
}
// return await Product.find(myfind);
module.exports.findAllIdApp = async function (idapp, code, id) {
let myfind = {};
let myqueryadd = {};
let query = [];
const query = [
{ $match: myfind },
{
$lookup: {
from: 'producers',
localField: 'idProducer',
foreignField: '_id',
as: 'producer'
try {
if (idapp)
myfind = { idapp, active: true };
if (code) {
myfind = { ...myfind, code }
}
if (id) {
myqueryadd = {
$addFields: {
myId1: {
$toObjectId: id,
},
},
}
},
{ $unwind: '$producer' },
{
$lookup: {
from: 'storehouses',
localField: 'idStorehouses',
foreignField: '_id',
as: 'storehouses'
myfind = {
$expr: {
$eq: ["$_id", "$myId1"],
},
}
},
{
$lookup: {
from: 'orders',
let: { productId: '$_id' },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ['$idProduct', '$$productId'] },
{ $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
]
query.push(myqueryadd);
}
// DA TOGLIEREE
// myfind = { ...myfind, code: '4012824406094' };
// return await Product.find(myfind);
query.push(
{ $match: myfind },
{
$lookup: {
from: 'producers',
localField: 'idProducer',
foreignField: '_id',
as: 'producer'
}
},
{
$unwind: {
path: '$producer',
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: 'providers',
localField: 'idProvider',
foreignField: '_id',
as: 'provider'
}
},
{
$unwind: {
path: '$provider',
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: 'scontisticas',
localField: 'idScontisticas',
foreignField: '_id',
as: 'scontisticas'
}
},
{
$lookup: {
from: 'storehouses',
localField: 'idStorehouses',
foreignField: '_id',
as: 'storehouses'
}
},
{
$lookup: {
from: 'orders',
let: { productId: '$_id' },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ['$idProduct', '$$productId'] },
{ $lt: ['$status', shared_consts.OrderStatus.ORDER_CONFIRMED] }
]
}
}
},
{
$group: {
_id: null,
totalQty: { $sum: '$quantity' }
}
}
},
{
$group: {
_id: null,
totalQty: { $sum: '$quantity' }
],
as: 'productOrders'
}
},
{
$addFields: {
QuantitaOrdinateInAttesa: {
$cond: {
if: { $isArray: '$productOrders' },
then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
else: 0
}
}
],
as: 'productOrders'
}
},
{
$addFields: {
QuantitaOrdinateInAttesa: {
$cond: {
if: { $isArray: '$productOrders' },
then: { $arrayElemAt: ['$productOrders.totalQty', 0] },
else: 0
}
}
}
},
{
$unset: 'productOrders'
},
},
{
$unset: 'productOrders'
},
];
);
let ris = await Product.aggregate(query)
// console.log('query=', query);
return ris;
let ris = await Product.aggregate(query)
// console.table('ris', ris);
return ris;
} catch (e) {
console.error('E', e);
}
};
@@ -251,10 +330,6 @@ module.exports.getProductByTitle = function (query, sort, callback) {
Product.find(query, null, sort, callback)
}
module.exports.getProductByCode = function (idapp, code) {
return Product.findOne({ idapp, code })
}
module.exports.filterProductByDepartment = function (department, callback) {
let regexp = new RegExp(`^${department}$`, 'i')
var query = { department: { $regex: regexp } };
@@ -281,31 +356,93 @@ module.exports.createIndexes((err) => {
if (err) throw err;
});
module.exports.convertAfterImport = async function () {
module.exports.convertAfterImport = async function (idapp, dataObjects) {
const arrprod = await Product.find({}).lean();
const arrprod = await Product.find({ idapp }).lean();
for (const prod of arrprod) {
let setta = false;
// Impostazioni Base:
let objtoset = {
idapp,
img: 'upload/products/' + prod.code + '.jpg',
}
if (prod.producer_name) {
// Cerca il produttore
const recproducer = await Producer.findOne({ name: prod.producer_name }).lean();
const campodarimuovere = 'producer_name';
let ris = null;
let recproducer = await Producer.findOne({ idapp, name: prod.producer_name }).lean();
if (!recproducer) {
// Non esiste questo produttore, quindi lo creo !
recproducer = new Producer({ idapp, name: prod.producer_name });
ris = await recproducer.save();
recproducer = await Producer.findOne({ idapp, name: prod.producer_name }).lean();
}
if (recproducer) {
ris = await Product.findOneAndUpdate({ _id: prod._id }, { $set: { idProducer: recproducer._id } })
console.log('Ris', ris);
ris = await Product.findOneAndUpdate({ _id: prod._id }, { $unset: { [campodarimuovere]: 1 } })
console.log('Ris', ris);
objtoset = {
...objtoset,
idProducer: recproducer._id,
}
setta = true;
}
}
if (prod.magazzino_name) {
// Cerca il produttore
let recstorehouse = await Storehouse.findOne({ idapp, name: prod.magazzino_name }).lean();
if (!recstorehouse) {
// Non esiste questo produttore, quindi lo creo !
recstorehouse = new Storehouse({ idapp, name: prod.magazzino_name });
ris = await recstorehouse.save();
recstorehouse = await Storehouse.findOne({ idapp, name: prod.magazzino_name }).lean();
}
if (recstorehouse) {
objtoset = {
...objtoset,
idStorehouses: [recstorehouse._id],
}
setta = true;
}
}
if (prod.provider_name) {
// Cerca il produttore
let recprovider = await Provider.findOne({ idapp, name: prod.provider_name }).lean();
if (!recprovider) {
recprovider = new Provider({ idapp, name: prod.provider_name });
// Non esiste questo produttore, quindi lo creo !
ris = await recprovider.save();
recprovider = await Provider.findOne({ idapp, name: prod.provider_name }).lean();
}
if (recprovider) {
objtoset = {
...objtoset,
idProvider: recprovider._id,
}
setta = true;
}
}
// Aggiorna il prezzo ?
const aggiornaprezzo = false;
if (aggiornaprezzo) {
// cerca il prodotto
const myprodinput = dataObjects.find((rec) => rec._id === prod._id)
if (myprodinput) {
objtoset = {
...objtoset,
price: myprodinput.price,
}
}
}
if (setta) {
await Product.findOneAndUpdate({ _id: prod._id }, { $set: objtoset })
// const campodarimuovere = 'producer_name';
// await Product.findOneAndUpdate({ _id: prod._id }, { $unset: { [campodarimuovere]: 1 } })
}
}
}
// const Product = mongoose.model('Product', ProductSchema);
// module.exports = { Product };
// PROVA
}

64
src/server/models/provider.js Executable file
View File

@@ -0,0 +1,64 @@
mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
const tools = require('../tools/general');
mongoose.Promise = global.Promise;
mongoose.level = "F";
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const providerSchema = new Schema({
idapp: {
type: String,
},
name: {
type: String,
},
description: {
type: String,
},
referent: {
type: String,
},
address: {
type: String,
},
city: {
type: String,
},
region: {
type: String,
},
img: {
type: String,
},
website: {
type: String,
},
});
var Provider = module.exports = mongoose.model('Provider', providerSchema);
module.exports.getFieldsForSearch = function () {
return [{ field: 'name', type: tools.FieldType.string }]
};
module.exports.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp };
return await Provider.find(myfind);
};
module.exports.createIndexes((err) => {
if (err) throw err;
});

View File

@@ -0,0 +1,62 @@
mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
const tools = require('../tools/general');
mongoose.Promise = global.Promise;
mongoose.level = "F";
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const scontisticaSchema = new Schema({
idapp: {
type: String,
},
code: {
type: String,
},
description: {
type: String,
},
qta: {
type: Number,
},
perc_sconto: {
type: Number,
},
price: {
type: Number,
},
comulativo: {
type: Boolean,
default: false,
},
});
var Scontistica = module.exports = mongoose.model('Scontistica', scontisticaSchema);
module.exports.getFieldsForSearch = function () {
return [
{ field: 'code', type: tools.FieldType.string },
{ field: 'description', type: tools.FieldType.string }
]
};
module.exports.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp };
return await Scontistica.find(myfind);
};
module.exports.createIndexes((err) => {
if (err) throw err;
});

View File

@@ -64,6 +64,12 @@ const SiteSchema = new Schema({
telegram_key_test: {
type: String,
},
load_process_telegram: {
type: Boolean,
},
load_process_telegram_test: {
type: String,
},
teleg_cfg: {
type: String,
},
@@ -176,6 +182,9 @@ const SiteSchema = new Schema({
info2: { type: String, default: '' },
cell: { type: String, default: '' },
},
ecomm: {
enablePreOrders: { type: Boolean, default: false },
}
});
var Site = module.exports = mongoose.model('Site', SiteSchema);
@@ -335,7 +344,8 @@ module.exports.createFirstUserAdmin = async function () {
const numusers = await User.countDocuments({ idapp: mysite.idapp });
if (numusers === 0) {
// Non esistono utenti, quindi creo quello di Admin
const utenteadmin = await User.findOne({ idapp: '13', username: telegrambot.ADMIN_USER_SERVER }).lean()
const utenteadmin = { idapp: '13', username: telegrambot.ADMIN_USER_SERVER };
const newuser = new User(utenteadmin);
newuser._id = new ObjectID();

View File

@@ -30,6 +30,7 @@ const i18n = require('i18n');
const shared_consts = require('../tools/shared_nodejs');
mongoose.Promise = global.Promise;
mongoose.level = 'F';
@@ -625,6 +626,16 @@ UserSchema.statics.isManager = function (perm) {
}
};
UserSchema.statics.isManagerById = async function (id) {
try {
const ris = await User.findOne({ _id: id }, { perm: 1 }).lean();
return ((ris.perm & shared_consts.Permissions.Manager) ===
shared_consts.Permissions.Manager);
} catch (e) {
return false;
}
};
UserSchema.statics.isEditor = function (perm) {
try {
return ((perm & shared_consts.Permissions.Editor) ===
@@ -5368,6 +5379,7 @@ UserSchema.statics.addNewSite = async function (idappPass, body) {
// cerca un IdApp Libero
let idapp = await Site.generateNewSite_IdApp(idappPass, body, true);
if (idapp) {
let arrSite = await Site.find({ idapp }).lean();
let numutenti = 0;
@@ -5375,7 +5387,9 @@ UserSchema.statics.addNewSite = async function (idappPass, body) {
numutenti = await User.countDocuments({ idapp });
};
if (arrSite && arrSite.length === 1 && numutenti === 0) {
if (arrSite && arrSite.length === 1 && numutenti < 2) {
const MyTelegramBot = require('../telegram/telegrambot');
// Nessun Sito Installato e Nessun Utente installato !
let myuser = new User();
myuser._id = new ObjectID();
@@ -5392,11 +5406,19 @@ UserSchema.statics.addNewSite = async function (idappPass, body) {
myuser.perm = '3';
myuser.profile.special_req = true;
myuser.profile.nationality = 'IT';
myuser.profile.manage_telegram = true;
myuser.profile.teleg_id = MyTelegramBot.ADMIN_IDTELEGRAM_SERVER;
myuser.profile.username_telegram = MyTelegramBot.ADMIN_USERNAME_TELEGRAM;
myuser.lasttimeonline = new Date();
myuser.date_reg = new Date();
await myuser.save();
const { MyBot } = require('../models/bot');
// Genera il Menu del BOT:
await MyBot.generateBotMenuRecords(idapp);
return { code: server_constants.RIS_CODE_OK, idapp };
}
}

View File

@@ -38,8 +38,8 @@ class Cart {
const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
if (!!myitem) {
myitem.order.quantity++;
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
this.updatetotals();
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
return myitem.order.quantity;
}
}
@@ -49,8 +49,8 @@ class Cart {
const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
if (!!myitem && myitem.order.quantity > 0) {
myitem.order.quantity--;
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
this.updatetotals();
await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
return myitem.order.quantity;
}
} catch (e) {
@@ -94,14 +94,64 @@ class Cart {
this.totalQty = 0;
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.totalPrice += order.price * order.quantity;
}
// Calcolo Sconto
let sconti_da_applicare = [];
if (order.scontisticas) {
let qtadascontare = order.quantity
let qtanonscontata = 0
while (qtadascontare > 0) {
let scontoapplicato = null
for (const sconto of order.scontisticas.filter((rec) => !rec.cumulativo)) {
if (qtadascontare >= sconto.qta) {
scontoapplicato = sconto
scontoapplicato.qtadascontare = sconto.qta
}
}
if (scontoapplicato && scontoapplicato.qtadascontare > 0) {
sconti_da_applicare.push(scontoapplicato)
qtadascontare -= scontoapplicato.qtadascontare
} else {
qtanonscontata = qtadascontare
qtadascontare = 0
}
}
/*for (const sconto of order.scontisticas.filter((rec) => rec.cumulativo)) {
if ((sconto.qta % order.quantity) === 0) {
sconti_da_applicare.push(sconto)
}
}*/
if (sconti_da_applicare.length > 0) {
for (const sconto of sconti_da_applicare) {
if (sconto.perc_sconto > 0) {
mypricecalc += (sconto.qtadascontare * order.price) * (1 - (sconto.perc_sconto / 100))
} else {
mypricecalc += sconto.price
}
}
}
if (qtanonscontata > 0) {
mypricecalc += order.price * qtanonscontata;
}
} else {
mypricecalc = order.price * order.quantity;
}
order.TotalPriceProduct += mypricecalc;
this.totalPrice += order.TotalPriceProduct;
}
this.totalPrice = parseFloat(this.totalPrice.toFixed(2))
} catch (e) {
console.error('Err: ', e);

View File

@@ -35,6 +35,7 @@ router.post('/updateval', authenticate, async (req, res) => {
router.post('/import', authenticate, async (req, res) => {
const cmd = req.body.cmd;
const idapp = req.body.idapp;
const data = req.body.data;
try {
@@ -49,15 +50,23 @@ router.post('/import', authenticate, async (req, res) => {
let dataObjects = JSON.parse(`[${data}]`);
return await Product.insertMany(dataObjects).then((ris) => {
// L'opzione ordered: false gestisce gli errori senza interrompere l'inserimento
return await Product.insertMany(dataObjects, { ordered: false })
.then((ris) => {
Product.convertAfterImport().then((ris) => {
return res.status(200).send(true);
Product.convertAfterImport(idapp, dataObjects).then((ris) => {
return res.status(200).send(true);
});
})
.catch((errors) => {
console.error(errors);
Product.convertAfterImport(idapp).then((ris) => {
return res.status(200).send(true);
});
});
});
}
} catch (e) {
console.error('e', e);

View File

@@ -55,20 +55,27 @@ router.post('/:userId', authenticate, async function (req, res, next) {
let order = req.body.order;
try {
const mycart = await Cart.getCartByUserId(userId, idapp);
let mycart = await Cart.getCartByUserId(userId, idapp);
// const myorder = Order.getOrderByID(order._id);
if (!addqty && !subqty)
order._id = await Order.createOrder(order);
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)
cart = await Cart.createCart(oldCart.generateModel());
} else {
let newCart = CartClass.constructByCart(mycart);
mycart = await Cart.getCartByUserId(userId, idapp);
nuovo = true;
}
let newCart = CartClass.constructByCart(mycart);
if (!nuovo) {
if (addqty) {
myqty = await newCart.addqty(order);
} else if (subqty) {
@@ -76,11 +83,19 @@ router.post('/:userId', authenticate, async function (req, res, next) {
} else {
const ind = newCart.addItem(order);
}
cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel());
} else {
await newCart.updatetotals();
}
cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel());
if (cart) {
const carttot = await Cart.getCartByUserId(userId, idapp);
return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, qty: myqty });
if (order.idProduct)
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 });
} else {
return res.send({ code: server_constants.RIS_CODE_ERR, cart: null });
}
@@ -112,6 +127,12 @@ router.delete('/:userId', authenticate, async function (req, res) {
const mycart = await Cart.getCartByUserId(userId, idapp);
const ord = await Order.findOne({ _id: orderId });
let idProduct = ''
let product = null;
if (ord)
idProduct = ord.idProduct;
// Rimuovere l'Ordine
const recremoved = await Order.deleteOne({ _id: orderId });
if (recremoved) {
@@ -124,8 +145,12 @@ router.delete('/:userId', authenticate, async function (req, res) {
carttot = await Cart.getCartByUserId(userId, idapp);
if (idProduct) {
product = await Product.getProductById(idProduct);
}
console.log('carttot', carttot)
return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot });
return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, product });
}
return res.send({ code: server_constants.RIS_CODE_ERR, cart: null });
@@ -140,17 +165,17 @@ router.put('/:userId', authenticate, async function (req, res, next) {
try {
await Cart.getCartByUserId(userId, function (err, c) {
await Cart.getCartByUserId(userId, async function (err, c) {
if (err) return next(err)
let oldCart = new CartClass(c[0] || {})
let oldCart = new CartClass(c || {})
Product.getProductByID(productId, function (err, p) {
await Product.getProductByID(productId, async function (err, p) {
if (err) return next(err)
let newCart = oldCart.add(p, productId, { color, size })
//exist cart in databse
if (c.length > 0) {
Cart.updateCartByUserId(
await Cart.updateCartByUserId(
userId,
{
items: newCart.items,
@@ -164,13 +189,13 @@ router.put('/:userId', authenticate, async function (req, res, next) {
})
} else {
//no cart in database
newCart = new Cart({
let newCartobj = {
items: newCart.items,
totalQty: newCart.totalQty,
totalPrice: newCart.totalPrice,
userId: userId
})
Cart.createCart(newCart, function (err, resultCart) {
}
await Cart.createCart(newCartobj, function (err, resultCart) {
if (err) return next(err)
res.status(201).json(resultCart)
})
@@ -178,7 +203,9 @@ router.put('/:userId', authenticate, async function (req, res, next) {
})
})
return res.send({ code: server_constants.RIS_CODE_OK });
const product = await Product.getProductById(productId);
return res.send({ code: server_constants.RIS_CODE_OK, product });
} catch (e) {
return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 });
}
@@ -192,11 +219,13 @@ router.post('/:userId/createorderscart', authenticate, async function (req, res,
let userId = req.params.userId;
const user = req.user;
let status = req.body.status;
let note = req.body.note;
try {
const mycart = await Cart.findOne({ _id: cart_id });
let numorder = await OrdersCart.getLastNumOrder(userId, idapp);
let numorder = await OrdersCart.getLastNumOrder(idapp);
let numord_pers = await OrdersCart.getLastNumOrdPers(userId, idapp);
// Esiste l'ordine ?
let myorderCart = await OrdersCart.getRecCartByUserId(userId, idapp, numorder);
@@ -204,6 +233,7 @@ router.post('/:userId/createorderscart', authenticate, async function (req, res,
// crea il nuovo numero d'ordine
numorder++;
numord_pers++;
// SE non esiste allora lo creo !
myorderCart = new OrdersCart({
@@ -213,14 +243,17 @@ router.post('/:userId/createorderscart', authenticate, async function (req, res,
totalPrice: mycart.totalPrice,
userId,
status,
note: mycart.note,
note,
numorder,
numord_pers,
created_at: new Date(),
modify_at: new Date(),
})
}
statusOrderCart = myorderCart.status;
const idordercart = myorderCart._id;
if (!!mycart) {
if (status === shared_consts.OrderStatus.CHECKOUT_SENT) {
@@ -246,7 +279,7 @@ router.post('/:userId/createorderscart', authenticate, async function (req, res,
// Invia la email dell'Ordine
sendemail.sendEmail_OrderProduct(user.lang, idapp, orders[0], user)
.then(async (ris) => {
myorderCart = await OrdersCart.getRecCartByUserId(userId, idapp, numorder);
myorderCart = await OrdersCart.findById(idordercart).lean();
return res.send({
code: server_constants.RIS_CODE_OK,
status: myris.status,

View File

@@ -65,6 +65,8 @@ const Producer = require('../models/producer');
const Cart = require('../models/cart');
const OrdersCart = require('../models/orderscart');
const Storehouse = require('../models/storehouse');
const Provider = require('../models/provider');
const Scontistica = require('../models/scontistica');
const Department = require('../models/department');
const { Category } = require('../models/category');
const Group = require('../models/group');
@@ -1431,6 +1433,8 @@ function load(req, res, version) {
let resps = User.getusersRespList(idapp);
let workers = User.getusersWorkersList(idapp);
let storehouses = Storehouse.findAllIdApp(idapp);
let providers = Provider.findAllIdApp(idapp);
let scontisticas = Scontistica.findAllIdApp(idapp);
let departments = Department.findAllIdApp(idapp);
let categories = Category.findAllIdApp(idapp);
@@ -1517,6 +1521,8 @@ function load(req, res, version) {
listcircuits, // 37
myelems, // 38
categories, // 39
providers,
scontisticas,
]).then((arrdata) => {
// console.table(arrdata);
let myuser = req.user;
@@ -1599,6 +1605,8 @@ function load(req, res, version) {
listcircuits: arrdata[37],
myelems: arrdata[38],
categories: arrdata[39],
providers: arrdata[40],
scontisticas: arrdata[41],
});
const prova = 1;

View File

@@ -7,11 +7,14 @@ var server_constants = require('../tools/server_constants');
var { Project } = require('../models/project');
const { User } = require('../models/user');
var { authenticate, auth_default } = require('../middleware/authenticate');
const _ = require('lodash');
const Product = require('../models/product');
const OrdersCart = require('../models/orderscart');
const Variant = require('../models/variant');
/*const Department = require('../models/Department')
@@ -27,11 +30,19 @@ const Cart = require('../models/cart');
//GET /products
router.post('/', auth_default, async function (req, res, next) {
const idapp = req.body.idapp;
let userId = req.body.userId;
var products = await Product.findAllIdApp(idapp, "");
let products = await Product.findAllIdApp(idapp, "");
let orders = null;
if (await User.isManagerById(userId)) {
// Prende Tutti gli Ordini !
orders = await OrdersCart.getOrdersCartByUserId('ALL', idapp, 0);
} else {
orders = await OrdersCart.getOrdersCartByUserId(userId, idapp, 0);
}
if (products)
res.send({ code: server_constants.RIS_CODE_OK, products });
res.send({ code: server_constants.RIS_CODE_OK, products, orders });
else
res.status(400).send(e);

View File

@@ -17,6 +17,8 @@ const { Settings } = require('../models/settings');
const { SendNotif } = require('../models/sendnotif');
const { MyBot } = require('../models/bot');
const tools = require('../tools/general');
const shared_consts = require('../tools/shared_nodejs');
@@ -566,8 +568,7 @@ router.post('/login', (req, res) => {
// tools.mylog("CREDENZIALI ! ");
if (!user) {
await tools.snooze(3000);
const msg = 'Tentativo di Login ERRATO [' + body.username + ' , ' +
body.password + ']\n' + '[IP: ' + tools.getiPAddressUser(req) +
const msg = 'Tentativo di Login ERRATO [' + body.username + ' , ' + ']\n' + '[IP: ' + tools.getiPAddressUser(req) +
']';
tools.mylogshow(msg);
await telegrambot.sendMsgTelegramToTheAdmin(user.idapp, msg, true);
@@ -1410,6 +1411,11 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
} else if (mydata.dbop === 'updateSaldoAndTransato_AllAccounts') {
await Account.updateSaldoAndTransato_AllAccounts(idapp);
} else if (mydata.dbop === 'generateBotMenuRecords') {
await MyBot.generateBotMenuRecords(idapp);
} else if (mydata.dbop === 'GenerateVapiKey') {
await tools.generateVapiKey();

View File

@@ -742,57 +742,78 @@ module.exports = {
sendEmail_OrderProduct: async function (lang, idapp, orders, user) {
const msginizio = 'Ordine n: ' + orders.numorder + ' ' + user.name + ' ' + user.surname;
console.log(msginizio);
try {
const msg = await OrdersCart.getmsgorderTelegram(orders);
const msginizio = msg;
console.log(msginizio);
await telegrambot.sendMsgTelegramToTheManagers(idapp, msginizio);
await telegrambot.sendMsgTelegramToTheManagers(idapp, msginizio);
let mylocalsconf = {
idapp,
locale: lang,
nomeapp: tools.getNomeAppByIdApp(idapp),
orders,
baseurl: tools.getHostByIdApp(idapp),
dataemail: await this.getdataemail(idapp),
ordernumber: orders.numorder,
user,
};
if (process.env.SEND_EMAIL_ORDERS === '1') {
mylocalsconf = this.setParamsForTemplate(user, mylocalsconf);
let mylocalsconf = {
idapp,
locale: lang,
nomeapp: tools.getNomeAppByIdApp(idapp),
orders,
baseurl: tools.getHostByIdApp(idapp),
dataemail: await this.getdataemail(idapp),
ordernumber: orders.numorder,
user,
};
this.sendEmail_base_e_manager(idapp, 'ecommerce/makeorder/' + lang, mylocalsconf.emailto, mylocalsconf,
mylocalsconf.dataemail.email_reply);
mylocalsconf = this.setParamsForTemplate(user, mylocalsconf);
this.sendEmail_base_e_manager(idapp, 'ecommerce/makeorder/' + lang, mylocalsconf.emailto, mylocalsconf,
mylocalsconf.dataemail.email_reply);
} else {
console.log('Invio Email non eseguito perchè sei in TEST !');
}
} catch (e) {
console.error('Err:', e);
}
},
sendEmail_Order: async function (lang, idapp, orders, user, ordertype, status) {
const msginizio = 'INIZIO - sendEmail_Order ' + ordertype + ': ' + tools.getNomeAppByIdApp(idapp);
console.log(msginizio);
try {
const msg = await OrdersCart.getmsgorderTelegram(orders);
const msginizio = msg;
console.log(msginizio);
await telegrambot.sendMsgTelegramToTheManagers(idapp, msginizio);
await telegrambot.sendMsgTelegramToTheManagers(idapp, msginizio);
let mylocalsconf = {
idapp,
locale: lang,
nomeapp: tools.getNomeAppByIdApp(idapp),
orders,
baseurl: tools.getHostByIdApp(idapp),
dataemail: await this.getdataemail(idapp),
ordernumber: orders.numorder,
user,
};
if (process.env.SEND_EMAIL_ORDERS === '1') {
mylocalsconf = this.setParamsForTemplate(user, mylocalsconf);
let mylocalsconf = {
idapp,
locale: lang,
nomeapp: tools.getNomeAppByIdApp(idapp),
orders,
baseurl: tools.getHostByIdApp(idapp),
dataemail: await this.getdataemail(idapp),
ordernumber: orders.numorder,
user,
};
if ((status !== shared_consts.OrderStatus.CANCELED) && (status !== shared_consts.OrderStatus.COMPLETED)) {
const esito = this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, mylocalsconf.emailto, mylocalsconf,
mylocalsconf.dataemail.email_reply);
mylocalsconf = this.setParamsForTemplate(user, mylocalsconf);
this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, tools.getAdminEmailByIdApp(idapp), mylocalsconf, '');
if ((status !== shared_consts.OrderStatus.CANCELED) && (status !== shared_consts.OrderStatus.COMPLETED)) {
const esito = this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, mylocalsconf.emailto, mylocalsconf,
mylocalsconf.dataemail.email_reply);
if (tools.isManagAndAdminDifferent(idapp)) {
this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, tools.getManagerEmailByIdApp(idapp), mylocalsconf, '');
this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, tools.getAdminEmailByIdApp(idapp), mylocalsconf, '');
if (tools.isManagAndAdminDifferent(idapp)) {
this.sendEmail_base('ecommerce/' + ordertype + '/' + lang, tools.getManagerEmailByIdApp(idapp), mylocalsconf, '');
}
}
} else {
console.log('Invio Email non eseguito perchè sei in TEST !');
}
} catch (e) {
console.error('Err:', e);
}
},

View File

@@ -3,8 +3,8 @@ const tools = require('../tools/general');
const appTelegram = [tools.FREEPLANET, tools.RISO];
const appTelegram_TEST = [tools.FREEPLANET, tools.RISO];
const appTelegram_DEVELOP = [tools.RISO];
//const appTelegram_DEVELOP = [tools.FIOREDELLAVITA];
//const appTelegram_DEVELOP = [tools.RISO];
const appTelegram_DEVELOP = [tools.PIUCHEBUONO];
const appTelegramFinti = ['2', tools.CNM];
const appTelegramDest = [tools.FREEPLANET, tools.FREEPLANET];
@@ -695,6 +695,7 @@ const ADMIN_IDTELEGRAM_TEST = 5356627050; // 5022837609; //Surya Arena
const MyTelegramBot = {
ADMIN_IDTELEGRAM_SERVER: '12429864', //Paolo
ADMIN_USERNAME_TELEGRAM: 'surya1977', //Paolo
ADMIN_USER_SERVER: 'paoloar77',
ADMIN_USER_NAME_SERVER: 'Paolo',
@@ -706,11 +707,21 @@ const MyTelegramBot = {
getAppTelegram: function () {
if (process.env.appTelegram) {
return JSON.parse(process.env.appTelegram);
arrTeleg = JSON.parse(process.env.appTelegram);
} else {
return appTelegram;
arrTeleg = appTelegram;
}
if (process.env.NODE_ENV === 'development')
arrTeleg = appTelegram_DEVELOP;
else if (process.env.NODE_ENV === 'test')
arrTeleg = MyTelegramBot.getAppTelegramTest();
const arrTelegFromSite = tools.getArrTelegramFromSite();
if (arrTelegFromSite.length > 0) {
arrTeleg = arrTelegFromSite;
}
return arrTeleg;
},
getAppTelegramTest: function () {
@@ -719,7 +730,7 @@ const MyTelegramBot = {
} else {
return appTelegram_TEST;
}
},
local_sendMsgTelegramByIdTelegram: async function (idapp, idtelegram, text,
@@ -978,7 +989,7 @@ const MyTelegramBot = {
if (send_notif && msg_notifpush) {
// SEND PUSH NOTIFICATION
await tools.sendNotificationToUser(userId, title, msg_notifpush, openUrl, '', tag, actions);
await tools.sendNotificationToUser(userId, title, msg_notifpush, openUrl, '', tag, actions);
}
@@ -3435,15 +3446,26 @@ class Telegram {
rec.status = Status.NONE;
if (!msg.from.username) {
// Non ha l'Username:
// Chiedi l'username sul Bot:
if (tools.getConfSiteOptionEnabledByIdApp(this.idapp, shared_consts.ConfSite.AskUsernameSulBot)) {
rec.status = Status.WAITFOR_USERNAME_TELEGRAM;
}
} else {
// Ha l'Username
// Chiedi l'invitante ?
if (tools.getConfSiteOptionEnabledByIdApp(this.idapp, shared_consts.ConfSite.AskInvitantesulBot)) {
rec.status = Status.WAITFOR_USERNAME_INVITANTE;
}
}
if (rec.status === Status.NONE) {
// Se il Sito non chiede di autenticarsi o l'invitante, allora lo Verifico direttamente !
rec.status = Status.VERIFIED;
}
this.arrUsers.push(rec);
if (tools.getConfSiteOptionEnabledByIdApp(this.idapp, shared_consts.ConfSite.AskInvitantesulBot)) {
@@ -4060,16 +4082,12 @@ function getclTelegByidapp(idapp) {
//if (!tools.testing() || true) {
if (true) {
let arrTeleg = MyTelegramBot.getAppTelegram();
if (process.env.NODE_ENV === 'development')
arrTeleg = appTelegram_DEVELOP;
else if (process.env.NODE_ENV === 'test')
arrTeleg = MyTelegramBot.getAppTelegramTest();
var internetAvailable = require('internet-available');
internetAvailable().then(() => {
// ..
console.log('TELEGRAM STARTING.... NODE_ENV:' + process.env.NODE_ENV);
console.log('TELEGRAM STARTING.... ' + process.env.NODE_ENV);
for (const idapp of arrTeleg) {
@@ -4080,7 +4098,9 @@ if (true) {
// console.log('idapp', idapp, 'token', token);
if (!!token) {
console.log('*** START BOT ' + nomebot);
console.log('-------------------------------------');
console.log('*** STARTING BOT ' + nomebot);
console.log('-------------------------------------');
const bot = new TelegramBot(token, { polling: true });
if (url === '0') {
@@ -4095,6 +4115,7 @@ if (true) {
arrTelegram.push({ idapp, cl: new Telegram(idapp, bot) });
bot.onText(/\/start/, (msg) => {
console.log('*** BOT PARTITO CORRETTAMENTE !!! (Start Cmd)');
const myclTelegram = getclTelegBytoken(bot.token);
myclTelegram.start(msg);

View File

@@ -416,6 +416,7 @@ module.exports = {
CNM: '10',
RISO: '13',
FIOREDELLAVITA: '15',
PIUCHEBUONO: '17',
HELP_CHAT: '',
TYPECONF_ZOOM: 'zoom',
@@ -1803,7 +1804,7 @@ module.exports = {
getTelegramBotNameByIdApp: function (idapp) {
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
if (process.env.NODE_ENV === 'test')
if (process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'development')
return (myapp) ? myapp.telegram_bot_name_test : '';
else
return (myapp) ? myapp.telegram_bot_name : '';
@@ -1822,12 +1823,30 @@ module.exports = {
getTelegramKeyByIdApp: function (idapp) {
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
if (process.env.NODE_ENV === 'test')
if (process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'development')
return (myapp) ? myapp.telegram_key_test : '';
else
return (myapp) ? myapp.telegram_key : '';
},
getArrTelegramFromSite: function () {
const myapp = this.MYAPPS;
let arrteleg = []
for (const site of myapp) {
if (site.active) {
if (process.env.NODE_ENV === 'test') {
if (myapp.load_process_telegram_test)
arrteleg.push(myapp.idapp)
} else {
if (myapp.load_process_telegram)
arrteleg.push(myapp.idapp)
}
}
}
return arrteleg;
},
getLookupPipeLine(params, proj) {
let myquery = [
@@ -4024,7 +4043,11 @@ module.exports = {
if (!msg)
return msg;
if (!!user) {
if (msg.includes('{host}')) {
msg = msg.replace('{host}', this.getHostByIdApp(user.idapp));
}
if (msg.includes('{appname}'))
msg = msg.replace('{appname}', this.getNomeAppByIdApp(user.idapp));
msg = msg.replace('{username}', user.username);

View File

@@ -60,6 +60,8 @@ const Producer = require('../models/producer');
const Cart = require('../models/cart');
const OrdersCart = require('../models/orderscart');
const Storehouse = require('../models/storehouse');
const Provider = require('../models/provider');
const Scontistica = require('../models/scontistica');
const Department = require('../models/department');
const { Category } = require('../models/category');
const ShareWithUs = require('../models/sharewithus');
@@ -104,6 +106,10 @@ module.exports = {
mytable = Product;
else if (tablename === 'storehouses')
mytable = Storehouse;
else if (tablename === 'providers')
mytable = Provider;
else if (tablename === 'scontisticas')
mytable = Scontistica;
else if (tablename === 'departments')
mytable = Department;
else if (tablename === 'categorys')

View File

@@ -407,6 +407,50 @@ module.exports = {
CANCELLATI: { label: 'Cancellati', value: 10, icon: 'delete', color: 'text-red' }, //CANCELED
},
OrderStatusStr: [
{
label: 'Nessuno',
value: 0,
},
{
label: 'In Carrello',
value: 1,
},
{
label: 'Ordine in Lavorazione',
value: 2,
},
{
label: 'Ordine Confermato',
value: 3,
},
{
label: 'Pagato',
value: 4,
},
{
label: 'Consegnato',
value: 5,
},
{
label: 'Spedito',
value: 6,
},
{
label: 'Ricevuto',
value: 7,
},
{
label: 'Completato',
value: 8,
},
{
label: 'Cancellato',
value: 10,
},
],
OrderStatusView: {
CHECKOUT_SENT: 2,
ORDER_CONFIRMED: 3,
@@ -864,5 +908,9 @@ module.exports = {
return ''
},
getStatusStr(status) {
const trovatorec = this.OrderStatusStr.find((rec) => rec.value === status)
return (trovatorec) ? trovatorec.label : ''
},
};