Aggiornamento cataloghi...
This commit is contained in:
@@ -42,5 +42,5 @@ MIAB_HOST=box.lamiaposta.org
|
|||||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||||
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
|
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
|
||||||
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
|
|
||||||
SERVER_A_URL="http://51.77.156.69:3000"
|
SERVER_A_URL="http://51.77.156.69:3000"
|
||||||
|
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
|
||||||
@@ -40,9 +40,5 @@ CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpY
|
|||||||
MIAB_HOST=box.lamiaposta.org
|
MIAB_HOST=box.lamiaposta.org
|
||||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||||
#DB_CONNECTION=sqlsrv
|
SERVER_A_URL="http://51.77.156.69:3000"
|
||||||
DB_HOST_SQLSRVTEST=31.3.180.50
|
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
|
||||||
DB_PORT_SQLSRVTEST=14338
|
|
||||||
DB_DATABASE_SQLSRVTEST=ANAG_MACRO
|
|
||||||
DB_USERNAME_SQLSRVTEST=woo
|
|
||||||
DB_PASSWORD_SQLSRVTEST=4n4traPe@
|
|
||||||
@@ -41,3 +41,5 @@ CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpY
|
|||||||
MIAB_HOST=box.lamiaposta.org
|
MIAB_HOST=box.lamiaposta.org
|
||||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||||
|
SERVER_A_URL="http://51.77.156.69:3000"
|
||||||
|
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
|
||||||
@@ -4,6 +4,8 @@ const server_constants = require('../tools/server_constants');
|
|||||||
|
|
||||||
const shared_consts = require('../tools/shared_nodejs');
|
const shared_consts = require('../tools/shared_nodejs');
|
||||||
|
|
||||||
|
const tools = require('../tools/general');
|
||||||
|
|
||||||
const SERVER_A_URL = process.env.SERVER_A_URL || "http://IP_DI_SERVER_A:3000";
|
const SERVER_A_URL = process.env.SERVER_A_URL || "http://IP_DI_SERVER_A:3000";
|
||||||
const API_KEY = process.env.API_KEY_MSSQL;
|
const API_KEY = process.env.API_KEY_MSSQL;
|
||||||
|
|
||||||
@@ -18,7 +20,9 @@ const getArticlesSales = async () => {
|
|||||||
COALESCE(o.totVen, 0) as totVen, COALESCE(u.totFat, 0) as totFat,
|
COALESCE(o.totVen, 0) as totVen, COALESCE(u.totFat, 0) as totFat,
|
||||||
COALESCE(p.rank3M, 0) as rank3M, COALESCE(t.fatrank3M, 0) as fatrank3M,
|
COALESCE(p.rank3M, 0) as rank3M, COALESCE(t.fatrank3M, 0) as fatrank3M,
|
||||||
COALESCE(q.rank6M, 0) as rank6M, COALESCE(r.rank1Y, 0) as rank1Y,
|
COALESCE(q.rank6M, 0) as rank6M, COALESCE(r.rank1Y, 0) as rank1Y,
|
||||||
COALESCE(t.fat3mesi, 0) as fatLast3M, COALESCE(p.venduti3mesi, 0) as vLast3M,
|
COALESCE(t.fat3mesi, 0) as fatLast3M,
|
||||||
|
COALESCE(t.fat6mesi, 0) as fatLast6M,
|
||||||
|
COALESCE(p.venduti3mesi, 0) as vLast3M,
|
||||||
COALESCE(q.venduti6mesi, 0) as vLast6M, COALESCE(r.venduti1anno, 0) as vLastY,
|
COALESCE(q.venduti6mesi, 0) as vLast6M, COALESCE(r.venduti1anno, 0) as vLastY,
|
||||||
s.ultimoOrdine as dataUltimoOrdine
|
s.ultimoOrdine as dataUltimoOrdine
|
||||||
FROM T_WEB_Articoli a
|
FROM T_WEB_Articoli a
|
||||||
@@ -82,7 +86,7 @@ const getTableContent = async (options) => {
|
|||||||
const checkResponse = await axios.post(SERVER_A_URL + '/query', { query: checkTableQuery }, {
|
const checkResponse = await axios.post(SERVER_A_URL + '/query', { query: checkTableQuery }, {
|
||||||
headers: { 'x-api-key': API_KEY }
|
headers: { 'x-api-key': API_KEY }
|
||||||
});
|
});
|
||||||
if (!checkResponse.data || checkResponse.data.length === 0 || checkResponse.data[0].tableExists === 0) {
|
if (!checkResponse?.data || checkResponse?.data.length === 0 || checkResponse?.data[0].tableExists === 0) {
|
||||||
return `La tabella '${options.nameTable}' non esiste.`;
|
return `La tabella '${options.nameTable}' non esiste.`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +119,7 @@ const getTableContent = async (options) => {
|
|||||||
if (options.nameTable.toLowerCase() === 't_web_articoli') {
|
if (options.nameTable.toLowerCase() === 't_web_articoli') {
|
||||||
if (true) {
|
if (true) {
|
||||||
dataQuery = `
|
dataQuery = `
|
||||||
SELECT TOP ${options.numrec}
|
SELECT TOP ${options.numrec || 10000}
|
||||||
${columnsToShow}
|
${columnsToShow}
|
||||||
` + (options.campispeciali ? `
|
` + (options.campispeciali ? `
|
||||||
,f.DescrizioneStatoProdotto
|
,f.DescrizioneStatoProdotto
|
||||||
@@ -236,18 +240,20 @@ const getTableContent = async (options) => {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dataQuery = `SELECT TOP ${options.numrec} * FROM ${options.nameTable} `;
|
dataQuery = `SELECT TOP ${options.numrec || 10000} * FROM ${options.nameTable} `;
|
||||||
}
|
}
|
||||||
if (options.where && options.where.trim() !== "") {
|
if (options.where && options.where.trim() !== "") {
|
||||||
dataQuery += ` WHERE ${options.where} `;
|
dataQuery += ` WHERE ${options.where} `;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('dataQuery', dataQuery);
|
||||||
|
|
||||||
// Esegue la query per recuperare i dati
|
// Esegue la query per recuperare i dati
|
||||||
// console.log('dataQuery', dataQuery);
|
// console.log('dataQuery', dataQuery);
|
||||||
const dataResponse = await axios.post(SERVER_A_URL + '/query', { query: dataQuery }, {
|
const dataResponse = await axios.post(SERVER_A_URL + '/query', { query: dataQuery }, {
|
||||||
headers: { 'x-api-key': API_KEY }
|
headers: { 'x-api-key': API_KEY }
|
||||||
});
|
});
|
||||||
const records = dataResponse.data;
|
const records = dataResponse?.data;
|
||||||
if (!records || records.length === 0) {
|
if (!records || records.length === 0) {
|
||||||
return `Nessun record trovato nella tabella '${options.nameTable}'.`;
|
return `Nessun record trovato nella tabella '${options.nameTable}'.`;
|
||||||
}
|
}
|
||||||
@@ -355,6 +361,7 @@ const getTableContent = async (options) => {
|
|||||||
return output;
|
return output;
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
output = error.message;
|
||||||
console.error("Errore nel recupero della tabella: ", error.message);
|
console.error("Errore nel recupero della tabella: ", error.message);
|
||||||
if (options.outhtml) {
|
if (options.outhtml) {
|
||||||
output = `
|
output = `
|
||||||
@@ -409,6 +416,200 @@ const getTableContent = async (options) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const setTableContent = async (options) => {
|
||||||
|
try {
|
||||||
|
// checkPermissions()
|
||||||
|
|
||||||
|
const esegui = true
|
||||||
|
|
||||||
|
if (esegui) {
|
||||||
|
|
||||||
|
// Verifica se la tabella esiste
|
||||||
|
const checkTableQuery = `SELECT COUNT(*) as tableExists FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '${options.nameTable}'`;
|
||||||
|
const checkResponse = await axios.post(SERVER_A_URL + '/query', { query: checkTableQuery }, {
|
||||||
|
headers: { 'x-api-key': API_KEY }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!checkResponse.data || checkResponse.data.length === 0 || checkResponse.data[0].tableExists === 0) {
|
||||||
|
return `La tabella '${options.nameTable}' non esiste.`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Costruisce la query per inserire o aggiornare i record
|
||||||
|
let dataQuery = "";
|
||||||
|
if (options.insertMode) {
|
||||||
|
// Modalità INSERT
|
||||||
|
const columns = Object.keys(options.data);
|
||||||
|
const values = columns.map(col => `'${options.data[col]}'`).join(", ");
|
||||||
|
dataQuery = `
|
||||||
|
INSERT INTO ${options.nameTable} (${columns.join(", ")})
|
||||||
|
VALUES (${values});
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
// Modalità UPDATE
|
||||||
|
const updateFields = Object.keys(options.data)
|
||||||
|
.map(col => `${col} = '${options.data[col]}'`)
|
||||||
|
.join(", ");
|
||||||
|
const whereClause = options.where ? `WHERE ${options.where}` : "";
|
||||||
|
dataQuery = `
|
||||||
|
UPDATE ${options.nameTable}
|
||||||
|
SET ${updateFields}
|
||||||
|
${whereClause};
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('dataQuery', dataQuery);
|
||||||
|
|
||||||
|
// Esegue la query per inserire o aggiornare i dati
|
||||||
|
const dataResponse = await axios.post(SERVER_A_URL + '/query', { query: dataQuery }, {
|
||||||
|
headers: { 'x-api-key': API_KEY }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dataResponse.data && dataResponse.data.affectedRows > 0) {
|
||||||
|
return `Operazione completata con successo su '${options.nameTable}'.`;
|
||||||
|
} else {
|
||||||
|
return `Nessun record modificato nella tabella '${options.nameTable}'.`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Errore nell'inserimento o aggiornamento della tabella: ", error.message);
|
||||||
|
if (options.outhtml) {
|
||||||
|
output = `
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Errore nell'inserimento o aggiornamento della Tabella ${options.nameTable}</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
color: #333;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.error-container {
|
||||||
|
background-color: #ffe6e6;
|
||||||
|
border: 1px solid #ff4d4d;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
max-width: 800px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.error-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #d8000c;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.error-message {
|
||||||
|
font-size: 16px;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="error-container">
|
||||||
|
<div class="error-title">Errore nell'inserimento o aggiornamento della Tabella ${options.nameTable}</div>
|
||||||
|
<div class="error-message">
|
||||||
|
${error.response.data.error || error.stack || error.message}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
`;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
return "Errore nell'inserimento o aggiornamento della tabella.";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const checkPermissions = async (options) => {
|
||||||
|
try {
|
||||||
|
const dataQuery = `
|
||||||
|
SELECT
|
||||||
|
dp.name AS UserName,
|
||||||
|
dp.type_desc AS UserType,
|
||||||
|
o.name AS ObjectName,
|
||||||
|
p.permission_name,
|
||||||
|
p.state_desc AS PermissionState
|
||||||
|
FROM
|
||||||
|
sys.database_permissions p
|
||||||
|
JOIN
|
||||||
|
sys.objects o ON p.major_id = o.object_id
|
||||||
|
JOIN
|
||||||
|
sys.database_principals dp ON p.grantee_principal_id = dp.principal_id
|
||||||
|
WHERE
|
||||||
|
o.name = 'T_WEB_Articoli';
|
||||||
|
`;
|
||||||
|
|
||||||
|
console.log('checkPermissions query:', dataQuery);
|
||||||
|
|
||||||
|
// Esegue la query per inserire o aggiornare i dati
|
||||||
|
const dataResponse = await axios.post(SERVER_A_URL + '/query', { query: dataQuery }, {
|
||||||
|
headers: { 'x-api-key': API_KEY }
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('checkPermissions result:', dataResponse.data);
|
||||||
|
|
||||||
|
if (dataResponse.data && dataResponse.data.affectedRows > 0) {
|
||||||
|
return `Operazione completata con successo.`;
|
||||||
|
} else {
|
||||||
|
return `Nessun permesso.`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Errore nel check dei Permessi: ", error.message);
|
||||||
|
if (options.outhtml) {
|
||||||
|
output = `
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Errore nell'inserimento o aggiornamento della Tabella ${options.nameTable}</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
color: #333;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.error-container {
|
||||||
|
background-color: #ffe6e6;
|
||||||
|
border: 1px solid #ff4d4d;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
max-width: 800px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.error-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #d8000c;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.error-message {
|
||||||
|
font-size: 16px;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="error-container">
|
||||||
|
<div class="error-title">Errore nell'inserimento o aggiornamento della Tabella ${options.nameTable}</div>
|
||||||
|
<div class="error-message">
|
||||||
|
${error.response.data.error || error.stack || error.message}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
`;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
return "Errore nell'inserimento o aggiornamento della tabella.";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Endpoint per mostrare i dati della tabella
|
// Endpoint per mostrare i dati della tabella
|
||||||
exports.viewTable = async (req, res) => {
|
exports.viewTable = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
@@ -429,6 +630,12 @@ exports.viewTable = async (req, res) => {
|
|||||||
out = tableContent;
|
out = tableContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tableContent && tableContent.length > 0) {
|
||||||
|
if (options.updatelocaldb) {
|
||||||
|
this.updateLocalDb(tableContent[0], options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return res.send({ code: server_constants.RIS_CODE_OK, data: out });
|
return res.send({ code: server_constants.RIS_CODE_OK, data: out });
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -437,6 +644,82 @@ exports.viewTable = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.updateLocalDb = async (tableContent, options) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
const ProductInfo = require('../models/productInfo');
|
||||||
|
const CatProd = require('../models/catprod');
|
||||||
|
|
||||||
|
let recproductInfo = {
|
||||||
|
code: tableContent.Ean13.trim(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let risrecUpdated = null;
|
||||||
|
|
||||||
|
const recfound = await ProductInfo.findOne({ code: recproductInfo.code }).lean();
|
||||||
|
if (recfound) {
|
||||||
|
|
||||||
|
ListaArgomenti = tableContent.ListaArgomenti;
|
||||||
|
|
||||||
|
let arrayPulito = ListaArgomenti
|
||||||
|
.trim() // Rimuove gli spazi all'inizio e alla fine
|
||||||
|
.replace(/[\(\)]/g, '') // Rimuove le parentesi tonde
|
||||||
|
.split(','); // Divide la stringa in un array usando la virgola come separatore
|
||||||
|
|
||||||
|
if (arrayPulito && arrayPulito.length > 0) {
|
||||||
|
let aggiornacat = false;
|
||||||
|
const precCatProds = recfound.idCatProds;
|
||||||
|
let reccatprods = [];
|
||||||
|
for (let i = 0; i < arrayPulito.length; i++) {
|
||||||
|
const idArgomento = parseInt(arrayPulito[i]);
|
||||||
|
reccateg = await CatProd.findOne({ idArgomento }).lean();
|
||||||
|
|
||||||
|
if (reccateg) {
|
||||||
|
// aggiungi solo se non esiste già
|
||||||
|
if (!reccatprods.includes(reccateg._id)) {
|
||||||
|
reccatprods.push(reccateg._id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ora controlla se l'array reccatprods e' diverso da precCatProds
|
||||||
|
if (reccatprods.length !== precCatProds.length) {
|
||||||
|
aggiornacat = true;
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < reccatprods.length; i++) {
|
||||||
|
if (reccatprods[i].toString() !== precCatProds[i].toString()) {
|
||||||
|
aggiornacat = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aggiornacat) {
|
||||||
|
recproductInfo.idCatProds = reccatprods;
|
||||||
|
aggiorna = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tableContent.DataPubblicazione.trim()) {
|
||||||
|
recproductInfo.date_pub = new Date(tools.convertiDataItaliana(tableContent.DataPubblicazione.trim()).date);
|
||||||
|
// convert data to timestamp
|
||||||
|
recproductInfo.date_pub_ts = recproductInfo.date_pub.getTime();
|
||||||
|
aggiorna = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aggiorna) {
|
||||||
|
risrecUpdated = await ProductInfo.findOneAndUpdate({ code: recproductInfo.code }, { $set: recproductInfo }, { new: true, upsert: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
return risrecUpdated;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Error: ', e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Endpoint per mostrare i dati della tabella
|
// Endpoint per mostrare i dati della tabella
|
||||||
exports.queryTable = async (req, res) => {
|
exports.queryTable = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
@@ -462,3 +745,30 @@ exports.queryTable = async (req, res) => {
|
|||||||
return res.send({ code: server_constants.RIS_CODE_ERR, error });
|
return res.send({ code: server_constants.RIS_CODE_ERR, error });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// Endpoint per salvare i dati di una tabella
|
||||||
|
exports.saveTable = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const options = req.body.options;
|
||||||
|
const tableContent = await setTableContent(options);
|
||||||
|
|
||||||
|
let out = {};
|
||||||
|
|
||||||
|
if (options.outhtml) {
|
||||||
|
out = `
|
||||||
|
<h2 class="text-center">Tabella: ${options.nameTable}</h2>
|
||||||
|
<div class="text-h7 row justify-center text-blue">Query: ${options.where}<br></div>
|
||||||
|
<div class="row justify-center">
|
||||||
|
${tableContent}
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
} else {
|
||||||
|
out = tableContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.send({ code: server_constants.RIS_CODE_OK, data: out });
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error: ', error);
|
||||||
|
return res.send({ code: server_constants.RIS_CODE_ERR, error });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -819,6 +819,7 @@ module.exports.getArrCatProds = async function (idapp, cosa) {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
addquery = [{ $match: { idapp } }];
|
addquery = [{ $match: { idapp } }];
|
||||||
}
|
}
|
||||||
@@ -841,7 +842,23 @@ module.exports.getArrCatProds = async function (idapp, cosa) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ $unwind: "$category" },
|
{ $unwind: "$category" },
|
||||||
{ $group: { _id: "$category._id", name: { $first: "$category.name" } } },
|
{
|
||||||
|
$group: {
|
||||||
|
_id: "$category._id",
|
||||||
|
name: { $first: "$category.name" },
|
||||||
|
idapp: { $first: "$category.idapp" },
|
||||||
|
idArgomento: { $first: "$category.idArgomento" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
|
$or: [
|
||||||
|
{ idapp: { $ne: tools.MACRO } },
|
||||||
|
{ idapp: tools.MACRO, idArgomento: { $exists: true, $gt: 0 } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
{ $sort: { name: 1 } }
|
{ $sort: { name: 1 } }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ async function findOrCreateCatProd(idapp, idArgomento, DescrArgomento) {
|
|||||||
function updateProductInfoCatProds(productInfo, reccatprod) {
|
function updateProductInfoCatProds(productInfo, reccatprod) {
|
||||||
if (productInfo) {
|
if (productInfo) {
|
||||||
// Controllo che nell'array productInfo.idCatProds ci sia esattamente 1 record e che sia uguale a reccatprod._id
|
// Controllo che nell'array productInfo.idCatProds ci sia esattamente 1 record e che sia uguale a reccatprod._id
|
||||||
const cond3 = Array.isArray(productInfo.idCatProds) && productInfo.idCatProds[0].toString() !== reccatprod._id.toString();
|
const cond3 = Array.isArray(productInfo.idCatProds) && productInfo.idCatProds.length > 0 && productInfo.idCatProds[0].toString() !== reccatprod._id.toString();
|
||||||
const isChanged =
|
const isChanged =
|
||||||
!Array.isArray(productInfo.idCatProds) || // Assicurati che sia un array
|
!Array.isArray(productInfo.idCatProds) || // Assicurati che sia un array
|
||||||
productInfo.idCatProds.length !== 1 || // L'array deve contenere esattamente 1 elemento
|
productInfo.idCatProds.length !== 1 || // L'array deve contenere esattamente 1 elemento
|
||||||
@@ -903,6 +903,8 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
|
|
||||||
const trovato = await ImportaIsbn.findOne({ isbn: product.code }).lean();
|
const trovato = await ImportaIsbn.findOne({ isbn: product.code }).lean();
|
||||||
if (trovato) {
|
if (trovato) {
|
||||||
|
// togli a recisbn l'_id
|
||||||
|
delete trovato._id;
|
||||||
recisbn = trovato;
|
recisbn = trovato;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,14 +918,18 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
recisbn.sottotitolo = productInfo.sottotitolo;
|
recisbn.sottotitolo = productInfo.sottotitolo;
|
||||||
// recisbn.idapp = idapp;
|
// recisbn.idapp = idapp;
|
||||||
|
|
||||||
let risisbn = await ImportaIsbn.findOneAndUpdate({ isbn: product.code }, { $set: recisbn }, { new: true, upsert: true, strict: false });
|
try {
|
||||||
|
let risisbn = await ImportaIsbn.findOneAndUpdate({ isbn: product.code }, { $set: recisbn }, { new: true, upsert: true, strict: false });
|
||||||
|
|
||||||
// Update ProductInfo, non crea nuovi record !
|
// Update ProductInfo, non crea nuovi record !
|
||||||
let risrecInfo = await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: productInfo }, { new: true, upsert: false });
|
let risrecInfo = await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: productInfo }, { new: true, upsert: false });
|
||||||
|
|
||||||
indprod++;
|
indprod++;
|
||||||
if (indprod % 100 === 0)
|
if (indprod % 100 === 0)
|
||||||
console.log(indprod + '/' + numprod);
|
console.log(indprod + '/' + numprod);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1052,6 +1058,7 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
totFat: product.totFat || 0,
|
totFat: product.totFat || 0,
|
||||||
vLast3M: product.vLast3M || 0,
|
vLast3M: product.vLast3M || 0,
|
||||||
fatLast3M: product.fatLast3M || 0,
|
fatLast3M: product.fatLast3M || 0,
|
||||||
|
fatLast6M: product.fatLast6M || 0,
|
||||||
vLast6M: product.vLast6M || 0,
|
vLast6M: product.vLast6M || 0,
|
||||||
vLastY: product.vLastY || 0,
|
vLastY: product.vLastY || 0,
|
||||||
vLast2Y: product.vLast2Y || 0,
|
vLast2Y: product.vLast2Y || 0,
|
||||||
@@ -1120,7 +1127,7 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
let imported = 0;
|
let imported = 0;
|
||||||
let errors = 0;
|
let errors = 0;
|
||||||
|
|
||||||
const ripopola = false; //++MODIFICARE!
|
const ripopola = true; //++MODIFICARE!
|
||||||
|
|
||||||
if (ripopola) {
|
if (ripopola) {
|
||||||
dataObjects = null;
|
dataObjects = null;
|
||||||
@@ -1221,7 +1228,12 @@ router.post('/import', authenticate, async (req, res) => {
|
|||||||
|
|
||||||
// se non esiste l'ISBN, allora me lo cerco in base a sku !
|
// se non esiste l'ISBN, allora me lo cerco in base a sku !
|
||||||
|
|
||||||
if (!product.isbn) {
|
let trova = false
|
||||||
|
if (product._id === '30310') {
|
||||||
|
trova = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!product.isbn || product.isbn.startsWith('field')) {
|
||||||
const rectrovare = await ImportaIsbn.findOne({ sku: product.sku }).lean();
|
const rectrovare = await ImportaIsbn.findOne({ sku: product.sku }).lean();
|
||||||
if (rectrovare) {
|
if (rectrovare) {
|
||||||
// se l'isbn non inizia con 'field' allora è buono
|
// se l'isbn non inizia con 'field' allora è buono
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const express = require("express");
|
const express = require("express");
|
||||||
const { getArticlesSalesHandler, exportArticlesSalesByJSON, viewTable, queryTable } = require("../controllers/articleController");
|
const { getArticlesSalesHandler, exportArticlesSalesByJSON, viewTable, saveTable, queryTable } = require("../controllers/articleController");
|
||||||
const { authenticate } = require("../middleware/authenticate");
|
const { authenticate } = require("../middleware/authenticate");
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
@@ -9,6 +9,7 @@ router.post("/articles-sales", authenticate, getArticlesSalesHandler);
|
|||||||
router.post("/export-articles-sales-json", authenticate, exportArticlesSalesByJSON);
|
router.post("/export-articles-sales-json", authenticate, exportArticlesSalesByJSON);
|
||||||
|
|
||||||
router.post("/view-table", authenticate, viewTable);
|
router.post("/view-table", authenticate, viewTable);
|
||||||
|
router.post("/save-table", authenticate, saveTable);
|
||||||
router.post("/query", authenticate, queryTable);
|
router.post("/query", authenticate, queryTable);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1160,6 +1160,7 @@ router.post('/duppage', authenticate, async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/exppage', authenticate, async (req, res) => {
|
router.post('/exppage', authenticate, async (req, res) => {
|
||||||
const params = req.body;
|
const params = req.body;
|
||||||
const idapp = req.body.idapp;
|
const idapp = req.body.idapp;
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ router.get('/id/:id', async function (req, res) {
|
|||||||
|
|
||||||
var product = await Product.getProductById(id);
|
var product = await Product.getProductById(id);
|
||||||
|
|
||||||
|
console.log('Product ID', id, product);
|
||||||
|
|
||||||
if (product) {
|
if (product) {
|
||||||
return res.send({ code: server_constants.RIS_CODE_OK, product: product });
|
return res.send({ code: server_constants.RIS_CODE_OK, product: product });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -789,30 +789,30 @@ router.post('/login', checkBlocked, async (req, res) => {
|
|||||||
resalreadysent = true;
|
resalreadysent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
res.status(401).send({ code: server_constants.RIS_CODE_LOGIN_ERR });
|
return res.status(401).send({ code: server_constants.RIS_CODE_LOGIN_ERR });
|
||||||
resalreadysent = true;
|
} else {
|
||||||
|
const myris = await user.generateAuthToken(req);
|
||||||
|
|
||||||
|
const usertosend = new User();
|
||||||
|
|
||||||
|
shared_consts.fieldsUserToChange().forEach((field) => {
|
||||||
|
usertosend[field] = user[field];
|
||||||
|
});
|
||||||
|
|
||||||
|
const subsExistonDb = await existSubScribe(usertosend._id, 'auth', req.get('User-Agent'));
|
||||||
|
|
||||||
|
res
|
||||||
|
.header('x-auth', myris.token)
|
||||||
|
.header('x-refrtok', myris.refreshToken)
|
||||||
|
.send({
|
||||||
|
usertosend,
|
||||||
|
code: server_constants.RIS_CODE_OK,
|
||||||
|
subsExistonDb,
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const myris = await user.generateAuthToken(req);
|
|
||||||
|
|
||||||
const usertosend = new User();
|
|
||||||
|
|
||||||
shared_consts.fieldsUserToChange().forEach((field) => {
|
|
||||||
usertosend[field] = user[field];
|
|
||||||
});
|
|
||||||
|
|
||||||
const subsExistonDb = await existSubScribe(usertosend._id, 'auth', req.get('User-Agent'));
|
|
||||||
|
|
||||||
res
|
|
||||||
.header('x-auth', myris.token)
|
|
||||||
.header('x-refrtok', myris.refreshToken)
|
|
||||||
.send({
|
|
||||||
usertosend,
|
|
||||||
code: server_constants.RIS_CODE_OK,
|
|
||||||
subsExistonDb,
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('ERRORE IN LOGIN: ' + e.message);
|
console.error('ERRORE IN LOGIN: ' + e.message);
|
||||||
if (!resalreadysent)
|
if (!resalreadysent)
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ module.exports = {
|
|||||||
|
|
||||||
if (to === '')
|
if (to === '')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// console.log('mylocalsconf', mylocalsconf);
|
// console.log('mylocalsconf', mylocalsconf);
|
||||||
|
|
||||||
// console.log("check EMAIL :" + checkifSendEmail());
|
// console.log("check EMAIL :" + checkifSendEmail());
|
||||||
@@ -88,7 +89,6 @@ module.exports = {
|
|||||||
// transport = this.getTransport(mylocalsconf);
|
// transport = this.getTransport(mylocalsconf);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// console.log('1 . transport', transport);
|
|
||||||
|
|
||||||
if (transport) {
|
if (transport) {
|
||||||
paramemail.transport = transport;
|
paramemail.transport = transport;
|
||||||
@@ -700,6 +700,9 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getdataemail: async (idapp, templemail_id) => {
|
getdataemail: async (idapp, templemail_id) => {
|
||||||
|
|
||||||
|
const pwd_from = await Settings.getValDbSettings(idapp, 'PWD_FROM');
|
||||||
|
|
||||||
// console.log('getdataemail');
|
// console.log('getdataemail');
|
||||||
const mydata = {
|
const mydata = {
|
||||||
content_after_events: await Settings.getValDbSettings(idapp, 'TEXT_AFTER_EV'),
|
content_after_events: await Settings.getValDbSettings(idapp, 'TEXT_AFTER_EV'),
|
||||||
@@ -718,7 +721,7 @@ module.exports = {
|
|||||||
height_logo: await Settings.getValDbSettings(idapp, 'HEIGHT_LOGO'),
|
height_logo: await Settings.getValDbSettings(idapp, 'HEIGHT_LOGO'),
|
||||||
from: await Settings.getValDbSettings(idapp, 'EMAIL_FROM'),
|
from: await Settings.getValDbSettings(idapp, 'EMAIL_FROM'),
|
||||||
email_reply: await Settings.getValDbSettings(idapp, 'EMAIL_REPLY', ''),
|
email_reply: await Settings.getValDbSettings(idapp, 'EMAIL_REPLY', ''),
|
||||||
pwd_from: await Settings.getValDbSettings(idapp, 'PWD_FROM'),
|
pwd_from: pwd_from,
|
||||||
email_service: await Settings.getValDbSettings(idapp, 'EMAIL_SERVICE_SEND'),
|
email_service: await Settings.getValDbSettings(idapp, 'EMAIL_SERVICE_SEND'),
|
||||||
email_port: await Settings.getValDbSettings(idapp, 'EMAIL_PORT'),
|
email_port: await Settings.getValDbSettings(idapp, 'EMAIL_PORT'),
|
||||||
templemail_id: templemail_id ? templemail_id : await Settings.getValDbSettings(idapp, 'TEMPLEMAIL_ID'),
|
templemail_id: templemail_id ? templemail_id : await Settings.getValDbSettings(idapp, 'TEMPLEMAIL_ID'),
|
||||||
@@ -732,6 +735,8 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getTransport: (mylocalsconf) => {
|
getTransport: (mylocalsconf) => {
|
||||||
|
console.log('getTransport');
|
||||||
|
|
||||||
// Create Transport
|
// Create Transport
|
||||||
let smtpTransport = null;
|
let smtpTransport = null;
|
||||||
|
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ const readline = require('readline');
|
|||||||
|
|
||||||
// Code goes here
|
// Code goes here
|
||||||
const keySize = 256;
|
const keySize = 256;
|
||||||
const ivSize = 128;
|
// const ivSize = 128;
|
||||||
const iterations = 100;
|
const iterations = 1000;
|
||||||
|
|
||||||
if (!!process.env.GCM_API_KEY && process.env.GCM_API_KEY !== '') {
|
if (!!process.env.GCM_API_KEY && process.env.GCM_API_KEY !== '') {
|
||||||
webpush.setGCMAPIKey(process.env.GCM_API_KEY);
|
webpush.setGCMAPIKey(process.env.GCM_API_KEY);
|
||||||
@@ -585,6 +585,7 @@ module.exports = {
|
|||||||
RISO: '13',
|
RISO: '13',
|
||||||
FIOREDELLAVITA: '15',
|
FIOREDELLAVITA: '15',
|
||||||
PIUCHEBUONO: '17',
|
PIUCHEBUONO: '17',
|
||||||
|
MACRO: '18',
|
||||||
|
|
||||||
IDAPP_BOTONGROUP: '1000',
|
IDAPP_BOTONGROUP: '1000',
|
||||||
|
|
||||||
@@ -3904,47 +3905,79 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
encrypt(msg, pass) {
|
encrypt(msg, pass) {
|
||||||
var salt = CryptoJS.lib.WordArray.random(128 / 8);
|
try {
|
||||||
|
// Genera salt e IV casuali
|
||||||
|
const salt = CryptoJS.lib.WordArray.random(128 / 8); // 16 byte
|
||||||
|
const iv = CryptoJS.lib.WordArray.random(128 / 8); // 16 byte
|
||||||
|
|
||||||
var key = CryptoJS.PBKDF2(pass, salt, {
|
// Deriva la chiave usando PBKDF2
|
||||||
keySize: keySize / 32,
|
const key = CryptoJS.PBKDF2(pass, salt, {
|
||||||
iterations: iterations,
|
keySize: keySize / 32,
|
||||||
});
|
iterations: iterations,
|
||||||
|
});
|
||||||
|
|
||||||
var iv = CryptoJS.lib.WordArray.random(128 / 8);
|
// Critta il messaggio
|
||||||
|
const encrypted = CryptoJS.AES.encrypt(msg, key, {
|
||||||
|
iv: iv,
|
||||||
|
padding: CryptoJS.pad.Pkcs7,
|
||||||
|
mode: CryptoJS.mode.CBC,
|
||||||
|
});
|
||||||
|
|
||||||
var encrypted = CryptoJS.AES.encrypt(msg, key, {
|
// Concatena salt, IV e ciphertext con un delimitatore
|
||||||
iv: iv,
|
const transitmessage = `${salt.toString()}|${iv.toString()}|${encrypted.toString()}`;
|
||||||
padding: CryptoJS.pad.Pkcs7,
|
return transitmessage;
|
||||||
mode: CryptoJS.mode.CBC,
|
} catch (error) {
|
||||||
|
console.error('❌❌❌ Errore durante la crittazione:', error.message);
|
||||||
});
|
throw error;
|
||||||
|
}
|
||||||
// salt, iv will be hex 32 in length
|
|
||||||
// append them to the ciphertext for use in decryption
|
|
||||||
var transitmessage = salt.toString() + iv.toString() + encrypted.toString();
|
|
||||||
return transitmessage;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
decrypt(transitmessage, pass) {
|
decrypt(transitmessage, pass) {
|
||||||
var salt = CryptoJS.enc.Hex.parse(transitmessage.substr(0, 32));
|
try {
|
||||||
var iv = CryptoJS.enc.Hex.parse(transitmessage.substr(32, 32));
|
let saltHex, ivHex, encrypted;
|
||||||
var encrypted = transitmessage.substring(64);
|
|
||||||
|
|
||||||
var key = CryptoJS.PBKDF2(pass, salt, {
|
// Controlla se il messaggio è nel nuovo formato (con delimitatore)
|
||||||
keySize: keySize / 32,
|
if (transitmessage.includes('|')) {
|
||||||
iterations: iterations,
|
const parts = transitmessage.split('|');
|
||||||
});
|
if (parts.length !== 3) {
|
||||||
|
throw new Error('❌❌❌ Formato del messaggio non valido.');
|
||||||
|
}
|
||||||
|
[saltHex, ivHex, encrypted] = parts;
|
||||||
|
} else {
|
||||||
|
// Vecchio formato: salt (32 caratteri), IV (32 caratteri), ciphertext (resto)
|
||||||
|
saltHex = transitmessage.substr(0, 32);
|
||||||
|
ivHex = transitmessage.substr(32, 32);
|
||||||
|
encrypted = transitmessage.substring(64);
|
||||||
|
}
|
||||||
|
|
||||||
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
|
// Converte salt e IV da esadecimale
|
||||||
iv: iv,
|
const salt = CryptoJS.enc.Hex.parse(saltHex);
|
||||||
padding: CryptoJS.pad.Pkcs7,
|
const iv = CryptoJS.enc.Hex.parse(ivHex);
|
||||||
mode: CryptoJS.mode.CBC,
|
|
||||||
|
|
||||||
});
|
// Deriva la chiave usando PBKDF2
|
||||||
return decrypted;
|
const key = CryptoJS.PBKDF2(pass, salt, {
|
||||||
|
keySize: keySize / 32,
|
||||||
|
iterations: iterations,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Decritta il messaggio
|
||||||
|
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {
|
||||||
|
iv: iv,
|
||||||
|
padding: CryptoJS.pad.Pkcs7,
|
||||||
|
mode: CryptoJS.mode.CBC,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Restituisci il messaggio originale in formato UTF-8
|
||||||
|
let ris = decrypted.toString(CryptoJS.enc.Utf8);
|
||||||
|
|
||||||
|
// console.log('RIS', ris);
|
||||||
|
|
||||||
|
return ris;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌❌❌ Errore durante la decrittazione:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
cryptdata(mydata) {
|
cryptdata(mydata) {
|
||||||
if (mydata === '')
|
if (mydata === '')
|
||||||
return '';
|
return '';
|
||||||
@@ -3954,13 +3987,17 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
decryptdata(mydatacrypted) {
|
decryptdata(mydatacrypted) {
|
||||||
if (mydatacrypted === '' || mydatacrypted === undefined)
|
if (!mydatacrypted) return '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
// console.log('SECRK', process.env.SECRK);
|
||||||
|
const decr = this.decrypt(mydatacrypted, process.env.SECRK);
|
||||||
|
// console.log('decr:', mydatacrypted, '->', decr);
|
||||||
|
return decr;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌❌❌❌❌ Decryption error:', error);
|
||||||
return '';
|
return '';
|
||||||
// Decrypt
|
}
|
||||||
// const bytes = CryptoJS.AES.decrypt(mydatacrypted.toString(), process.env.SECRK);
|
|
||||||
// return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
|
|
||||||
return this.decrypt(mydatacrypted, process.env.SECRK).
|
|
||||||
toString(CryptoJS.enc.Utf8);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
BoolToInt(mybool) {
|
BoolToInt(mybool) {
|
||||||
@@ -6025,6 +6062,44 @@ module.exports = {
|
|||||||
// Funzione per implementare il ritardo tra i tentativi
|
// Funzione per implementare il ritardo tra i tentativi
|
||||||
sleep(ms) {
|
sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converte una data in formato italiano GG/MM/YYYY in un oggetto Date e restituisce il timestamp.
|
||||||
|
* @param {string} dateString - La data in formato GG/MM/YYYY.
|
||||||
|
* @returns {Object} - Un oggetto contenente la data (Date) e il timestamp (number).
|
||||||
|
* Restituisce null se la data non è valida.
|
||||||
|
*/
|
||||||
|
convertiDataItaliana(dateString) {
|
||||||
|
// Verifica che la data sia una stringa valida
|
||||||
|
if (!dateString || typeof dateString !== 'string') {
|
||||||
|
console.error("Input non valido: la data deve essere una stringa.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rimuovi eventuali spazi bianchi e dividi la data in GG, MM, YYYY
|
||||||
|
const [giorno, mese, anno] = dateString.trim().split('/').map(Number);
|
||||||
|
|
||||||
|
// Controlla che i valori siano stati estratti correttamente
|
||||||
|
if (isNaN(giorno) || isNaN(mese) || isNaN(anno)) {
|
||||||
|
console.error("Formato data non valido:", dateString);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crea un oggetto Date (mese parte da 0 in JavaScript)
|
||||||
|
const dateObj = new Date(anno, mese - 1, giorno);
|
||||||
|
|
||||||
|
// Verifica che la data sia valida
|
||||||
|
if (isNaN(dateObj.getTime())) {
|
||||||
|
console.error("Data non valida:", dateString);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restituisci l'oggetto con la data e il timestamp
|
||||||
|
return {
|
||||||
|
date: dateObj,
|
||||||
|
timestamp: dateObj.getTime()
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.2.32
|
1.2.33
|
||||||
Reference in New Issue
Block a user