From c939be279ee4c67619a27cb53a8a2f1caf4c52ba Mon Sep 17 00:00:00 2001 From: Paolo Arena Date: Mon, 8 Jun 2020 13:31:05 +0200 Subject: [PATCH] =?UTF-8?q?-=20Nuovo=20Sistema=20di=20Flotte=20per=20Tutor?= =?UTF-8?q?.=20X=20-=20Mettere=20anche=20la=20email=20del=20sognatore,=20p?= =?UTF-8?q?er=20chi=20=C3=A8=20abituato=20ad=20inviarla=20in=20quel=20modo?= =?UTF-8?q?...=20X=20-=20Controllare=20che=20sul=20sito=20compaiano=20le?= =?UTF-8?q?=20informazioni=20del=20Sognatore...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/passi.txt | 77 ++++- emails/standard/html.pug | 7 + emails/standard/subject.pug | 1 + src/server/models/flotta.js | 325 ++++++++++++++++++ src/server/models/graduatoria.js | 29 +- src/server/models/listaingresso.js | 67 +++- src/server/models/msg_template.js | 102 ++++++ src/server/models/nave.js | 255 +++++++++++--- src/server/models/navepersistente.js | 173 +++++++++- src/server/models/settings.js | 6 +- src/server/models/user.js | 244 ++++++++++++- src/server/router/api/actions.js | 7 +- src/server/router/dashboard_router.js | 83 ++++- src/server/router/index_router.js | 223 ++++++++++-- src/server/router/users_router.js | 65 ++-- src/server/sendemail.js | 27 ++ src/server/server.js | 17 +- src/server/telegram/telegrambot.js | 476 ++++++++++++++++++++++---- src/server/tools/general.js | 102 +++++- src/server/tools/server_constants.js | 1 + src/server/tools/shared_nodejs.js | 4 + 21 files changed, 2037 insertions(+), 254 deletions(-) create mode 100755 emails/standard/html.pug create mode 100755 emails/standard/subject.pug create mode 100755 src/server/models/flotta.js create mode 100755 src/server/models/msg_template.js diff --git a/docs/passi.txt b/docs/passi.txt index db768eb..07024e9 100644 --- a/docs/passi.txt +++ b/docs/passi.txt @@ -1,8 +1,5 @@ ------------ -// ++Todo: FATTO: DA CONTROLLARE - -X - Se sei imbarcata i tuoi due invitati usati per quella posizione sono bloccati. Se ne hai in più li puoi regalare - L'ultimo Utente della Creazione della Nave, compare ancora il Sognatore !!! Sistemato: TESTARE SE ORA È' OK... @@ -12,24 +9,61 @@ X - Se sei imbarcata i tuoi due invitati usati per quella posizione sono bloccat // ++Todo: PRIORITA' ALTA: -CONTROLLARE: +- Puoi imbarcarti non piu di 2 volte temporanee. + +- Togliere Sogno e Video. -- Sistemare la Creazione delle Navi... in semi-automatico. +- Profili Incompleti: + Poter inviare dei messaggi in automatico per ricordargli di completare ... -- Controllare gli Account di Andrea (sembrano mescolati....) socio856 è dentro invece non doveva esserci... - - socio856 non è stato raggruppato con socio85 (Andrea Lai) +- Se non hai fatto una registrazione con verifica email o BOT: + Mandare email dicendo che se non t'iscrivi, verrai cancellato. +- Se non si è qualificato entro 7 gg, manda un msg a lui e all'invitante che verrà cancellato entro 7 gg. -- Mettere il tragitto anche sul BOT. +- Se sei in conversazione e premi i menu, esci dalla conversazione ! + +- CHIEDERE ALLA PERSONA SE VUOLE ESSERE SOSPESO OPPURE CANCELLATO! + Se ha solo questo imbarco: + - Come da tua richiesta, sei stato sostituito. + - Vuoi cancellare questo profilo? -> "Nascosto" + - Vuoi Sospendere il profilo? -> "Sospeso" + +- Se l'utente entra ed è "Nascosto": + - Gli chiedo se vuole ripristinare l'account... + +- Rimettere "made_gift" a false se si ha sbagliato... + +- Mettere 3 giorni. + +- Fondo Ayni 9.152 : aggiungere registrazione Paolo2 Arena. e mettere paypal.me + +- Mandare msg ai Non Invitati, o inferiori di 2. + +- aggiungere le note di pagamento, a nome di chi è il pagamento? - Inviare il Link che punta alla Pagina del Sito, per effettuare il Dono! E per eventualmente Entrare nella GIFT CHAT! +- Mettere i messaggi del DONO in LINGUA (metterli sul server). + +- ULTIMA FLOTTA DA - A DEFINITIVA +- ULTIMA NAVE DEFINITIVA...N.NN + + +- Non poter sostituire i Ritessuti ! D8 + + + - Il LastNave non sembra essere corretto! + + +- Sistemare la Creazione delle Navi... in semi-automatico. + // ++Todo: PRIORITA' NORMALE: -- Se entro con la seconda utenza, gli mando messaggio che dice che deve collegarsi con la prima utenza.... +- AGGIUNGERCI L'USERNAME REALE ! ALTRIMENTI PRENDE IL PRINCIPALE !! - Fare funzione che passa un Utente secondario in un utente Primario! (c'è gia) @@ -37,7 +71,6 @@ CONTROLLARE: // ++Todo: DA FARE PIU AVANTI: -- Sistemare poter modificare le Pagine. - Per il Fondo Ayni, prevedere anche altri Metodi di Pagamento... Revolut, N26, ecc... ed inserirlo sul sito per il Sognatore (flag Pagato al Fondo: nave.offerta_al_fondo). @@ -74,9 +107,11 @@ SOSTITUISCI: - Sistemare che in Edit Pagina, se è troppo grande, va oltre l'altezza della finestra. +- Attivare le Traduttrici alle Pagine + +- Inviare messaggi solo per ITALIANI (o di lingua cmq). - Aggiornare le FAQ in lingua -- Attivare le Traduttrici alle Pagine - CONTROLLARE CON ARGENTINA E PORTOGALLO e Brasile: @@ -123,3 +158,23 @@ ANDREA //++TODO: *** FATTI *** + + +// ++Todo: FATTO: DA CONTROLLARE + +X - Se sei imbarcata i tuoi due invitati usati per quella posizione sono bloccati. Se ne hai in più li puoi regalare +X - Numero d'invitati sbagliato -> Nogalska +X - 50 persone non hanno un'imbarco -> Chiamare funzione che gliela rimette. + +X - Poter Inviare un msg preconfezionato a chi non la la nave ! +X Poter cliccare SI per aggiungersi ad un Nuovo Imbarco. +X - Se entro con la seconda utenza, gli mando messaggio che dice che deve collegarsi con la prima utenza.... + +X - Sistemare poter modificare le Pagine. + +X - SISTEMARE QUANDO L'ULTIMA NAVE DELLA FLOTTA C'E' UN SOGNATORE CHE HA LA NAVE DI RITORNO! +X - IL MEDIATORE DEVE AVERE LA SUA RITESSUTURA !!! ( TOGLIERE L'IF NEL CASO NON SIA SOGNATORE) + +X - Mettere anche la email del sognatore, per chi è abituato ad inviarla in quel modo... +X - Controllare che sul sito compaiano le informazioni del Sognatore... + diff --git a/emails/standard/html.pug b/emails/standard/html.pug new file mode 100755 index 0000000..a957076 --- /dev/null +++ b/emails/standard/html.pug @@ -0,0 +1,7 @@ +p #{dataemail.emailbody} + +style(type="text/css"). + html, body { + padding: 0; + margin: 0; + } diff --git a/emails/standard/subject.pug b/emails/standard/subject.pug new file mode 100755 index 0000000..28e7d70 --- /dev/null +++ b/emails/standard/subject.pug @@ -0,0 +1 @@ +=`${dataemail.emailtitle}` diff --git a/src/server/models/flotta.js b/src/server/models/flotta.js new file mode 100755 index 0000000..20cfbf3 --- /dev/null +++ b/src/server/models/flotta.js @@ -0,0 +1,325 @@ +const mongoose = require('mongoose'); +const _ = require('lodash'); + +const tools = require('../tools/general'); + +const { ListaIngresso } = require('./listaingresso'); +const { Settings } = require('./settings'); +const { User } = require('./user'); + +const { ObjectID } = require('mongodb'); + +const shared_consts = require('../tools/shared_nodejs'); + +mongoose.Promise = global.Promise; + +mongoose.level = "F"; +// Resolving error Unknown modifier: $pushAll +mongoose.plugin(schema => { + schema.options.usePushEach = true +}); + +mongoose.set('debug', process.env.DEBUG); + + +const FlottaSchema = new mongoose.Schema({ + idapp: { + type: String, + required: true, + }, + index: { + type: Number + }, + riga: { + type: Number, + }, + col_prima: { + type: Number, + }, + col_ultima: { + type: Number, + }, + date_start: { + type: Date + }, + date_close: { + type: Date + }, + provvisoria: { + type: Boolean, + }, + DoniAttesaDiConferma: { + type: Number, + }, + DoniMancanti: { + type: Number, + }, + DoniConfermati: { + type: Number, + }, + DoniTotali: { + type: Number, + }, + note_interne: { + type: String + }, + sognatore: { + type: String + }, + sognatore_nomecognome: { + type: String + }, + link_superchat: { + type: String, + }, + link_payment: { + type: String, + }, + email_paypal: { + type: String, + }, + note_payment: { + type: String, + }, + tutor1: { + type: String, + }, + tutor2: { + type: String, + }, + tutor3: { + type: String, + }, + tutorslo: { + type: String, + }, + msg_inviato: { + type: Boolean, + }, + +}); + +function getQueryProj(myfilter) { + + myobjField = { + _id: 1, + idapp: 1, + lang: 1, + ind_order: 1, + name: 1, + surname: 1, + username: 1, + 'profile.paymenttypes': 1, + 'profile.email_paypal': 1, + 'profile.cell': 1, + made_gift: 1, + commento_al_sognatore: 1, + sent_msg_howto_make_gift: 1, + date_made_gift: 1, + note: 1, + received_gift: 1, + date_received_gift: 1, + num_tess: 1, + parent_id: 1, + riga: 1, + col: 1, + created: 1, + // date_start: 1, + // date_gift_chat_open: 1, + // link_chat: 1, + // provvisoria: 1, + // note_bot: 1, + // note_interne: 1, + // tutor: 1, + // tutor_namesurname: 1, + }; + + const query = [ + { $match: myfilter }, + { + $lookup: { + from: "listaingressos", + localField: "ind_order", + foreignField: "ind_order", // field in the user collection + as: "mylista" + } + }, + { + $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$mylista", 0 ] }, "$$ROOT" ] } } + }, + { + $lookup: { + from: "users", + as: "user", + let: {username: '$username' }, + pipeline: [ + { + $match: { + $expr: { + $and: [ + { $eq: ['$username', '$$username'] }, + { $eq: ['$idapp', myfilter.idapp] }, + ] + } + } + } + ] + } + }, + { + $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: ["$user", 0] }, "$$ROOT"] } } + // $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: ["$user", 0] },] } } + }, + { $project: myobjField } + ]; + + return query; +} + + +FlottaSchema.statics.findById = function (idapp, id) { + const Flotta = this; + + const myquery = getQueryProj({ idapp, '_id': ObjectID(id) }); + + return Flotta.aggregate(myquery); + +}; + +FlottaSchema.statics.getFieldsForSearch = function () { + return [{ field: 'ind_order', type: tools.FieldType.number }, + { field: 'col', type: tools.FieldType.number }] +}; + +FlottaSchema.statics.executeQueryTable = function (idapp, params) { + params.fieldsearch = this.getFieldsForSearch(); + return tools.executeQueryTable(this, idapp, params); +}; + +FlottaSchema.statics.findAllIdApp = function (idapp) { + const Flotta = this; + + const myfind = { idapp }; + + return Flotta.find(myfind).sort({ riga: 1, col: 1 }); +}; + +FlottaSchema.statics.getListaFlotta = function (idapp) { + const Flotta = this; + + const myfind = { idapp }; + + return Flotta.find(myfind).sort({ riga: 1, col_prima: 1 }); +}; + +FlottaSchema.statics.getLastFlotta = function (idapp) { + const Flotta = this; + + const myfind = { idapp, date_start: { $lte: tools.IncDateNow(0) }, provvisoria: false }; + + return Flotta.findOne(myfind).sort({ riga: -1, col_prima: -1 }).limit(1); +}; + +FlottaSchema.statics.findByRigaColByDonatore = function (idapp, riga, col, offset) { + const Flotta = this; + + mypos = { + riga, + col, + numup: 3 + offset, + }; + tools.getRigaColByPosUp(mypos); + + return Flotta.findOne({ idapp, riga: mypos.riga, col_prima: mypos.col }); + +}; + +FlottaSchema.statics.findByRigaCol = function (idapp, riga, col) { + const Flotta = this; + + return Flotta.findOne({ idapp, riga, col }); + +}; + + +FlottaSchema.statics.getLastRigaCol = async function (idapp) { + return Flotta.findOne({ idapp }).sort({ riga: -1, col_prima: -1 }); +}; + +FlottaSchema.statics.getLastRigaColDefinitiva = async function (idapp) { + return Flotta.findOne({ idapp, provvisoria: false }).sort({ riga: -1, col_prima: -1 }); +}; + +FlottaSchema.pre('save', async function (next) { + if (this.isNew) { + const myrec = await Flotta.findOne().limit(1).sort({ _id: -1 }); + if (!!myrec) { + this.index = myrec._doc.index + 1; + } else { + this.index = 1; + } + } + + next(); +}); + + +FlottaSchema.statics.addRecordFlottaByParams = async function (params) { + + // Check if Exist: + const giapresente = await Flotta.findOne({ + idapp: params.idapp, + riga: params.riga, + col: params.col + }); + + if (!giapresente) { + // Prende la nave prima: + const lastnave = await Flotta.findOne({idapp}).sort({riga: -1, col: -1}); + + let nextgiftchat = null; + + if (((params.col - 1) % 8 === 0)) { + nextgiftchat = getNextDayNave(lastnave.date_gift_chat_open); + } else { + nextgiftchat = lastnave.date_gift_chat_open; + } + + const next_date_start = tools.AddDate(nextgiftchat, 7); + + let myFlotta = new Flotta({ + idapp: params.idapp, + riga: params.riga, + col: params.col, + riga1don: params.riga1don, + col1don: params.col1don, + date_gift_chat_open: nextgiftchat, + date_start: next_date_start, + provvisoria: true, + }); + return await myFlotta.save(); + } + + return false; +}; + +FlottaSchema.statics.getFlottaByNavePersistente = async function (idapp, navepers) { + const Flotta = this; + + // const indcolflottaprima = tools.getPrimaColFlotta(navepers.col1don + 7); + + const myflotta = await Flotta.findOne({ idapp, riga: navepers.riga, + $and: [ + { col_prima: { $lte: navepers.col1don } }, + { col_ultima: { $gte: navepers.col1don } } ] + }); + + return myflotta; +}; + + +const Flotta = mongoose.model('Flotta', FlottaSchema); + +module.exports = { Flotta }; + + diff --git a/src/server/models/graduatoria.js b/src/server/models/graduatoria.js index 3e1de6e..6d1bee6 100755 --- a/src/server/models/graduatoria.js +++ b/src/server/models/graduatoria.js @@ -78,6 +78,12 @@ const GraduatoriaSchema = new mongoose.Schema({ invitante_username: { type: String, }, + navestr: { + type: String, + }, + note: { + type: String, + }, date_added: { // Data d'Ingresso (Completato i Requisiti o premuto Bottone Magico) type: Date, }, @@ -197,11 +203,15 @@ GraduatoriaSchema.statics.addSingoloInGraduatoria_InFondo = async function (idap const { ListaIngresso } = require('../models/listaingresso'); - arrindex[recingr.username] = lastimbarco.indimbarco; + if (!!lastimbarco) { + arrindex[recingr.username] = lastimbarco.indimbarco; + } else { + arrindex[recingr.username] = 1; + } const newingr = await ListaIngresso.aggiornaRecListaIngr(idapp, recingr, arrindex); - const myrectoadd = addRecGraduatoria(idapp, newingr); + const myrectoadd = addRecGraduatoria(idapp, newingr, 100000); return await myrectoadd.save(myrectoadd) .then((ris) => { @@ -211,6 +221,7 @@ GraduatoriaSchema.statics.addSingoloInGraduatoria_InFondo = async function (idap console.error(e.message); }); + }; function addRecGraduatoria(idapp, ingr, index) { @@ -233,6 +244,8 @@ function addRecGraduatoria(idapp, ingr, index) { numinvitatiattiviTot: ingr.numinvitatiattiviTot, punteggio: ingr.punteggio, invitante_username: ingr.invitante_username, + navestr: ingr.navestr, + note: ingr.note, date_added: ingr.date_added, }); @@ -312,12 +325,24 @@ GraduatoriaSchema.statics.isWorking = function (idapp) { }; +GraduatoriaSchema.statics.isUpdating = function (idapp) { + + return Settings.getValDbSettings(idapp, tools.UPDATE_GRADUATORIA, false); + +}; + GraduatoriaSchema.statics.setWorking = function (idapp, stato) { return Settings.setBool(idapp, 'GRAD_WORK', stato); }; +GraduatoriaSchema.statics.setGradUpdating = function (idapp, stato) { + + return Settings.setBool(idapp, tools.UPDATE_GRADUATORIA, stato); + +}; + function getinvit(index, myrec) { let inv = myrec.numinvitati; let invattivi = myrec.numinvitatiattivi; diff --git a/src/server/models/listaingresso.js b/src/server/models/listaingresso.js index 54122ad..17baa74 100755 --- a/src/server/models/listaingresso.js +++ b/src/server/models/listaingresso.js @@ -54,6 +54,9 @@ const ListaIngressoSchema = new mongoose.Schema({ num_tess: { type: Number, }, + navestr: { + type: String, + }, note: { type: String, }, @@ -614,8 +617,8 @@ ListaIngressoSchema.statics.GeneraGraduatoria = async function (idapp, solonuovi let myquery = ''; //++Todo: DA TOGLIERE IL COMMENTO !!! - // if (await Graduatoria.isWorking(idapp)) - // return; + if (await Graduatoria.isWorking(idapp)) + return; await Graduatoria.setWorking(idapp, true); @@ -627,6 +630,7 @@ ListaIngressoSchema.statics.GeneraGraduatoria = async function (idapp, solonuovi surname: 1, username: 1, invitante_username: 1, + navestr: 1, email: 1, lang: 1, num_tess: 1, @@ -638,8 +642,13 @@ ListaIngressoSchema.statics.GeneraGraduatoria = async function (idapp, solonuovi try { let myfilter2 = { - surname: { $exists: true }, - $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], + + $or: [{ surname: { $exists: true } }, { deleted: { $exists: false } }, { + deleted: { + $exists: true, + $eq: false + } + }], }; if (solonuovi) { @@ -931,8 +940,13 @@ ListaIngressoSchema.statics.getarray = async function (idapp, filtri, myobjField let myfilter2 = { - surname: { $exists: true }, - $or: [{ 'user.deleted': { $exists: false } }, { 'user.deleted': { $exists: true, $eq: false } }], + + $or: [{ surname: { $exists: true } }, { 'user.deleted': { $exists: false } }, { + 'user.deleted': { + $exists: true, + $eq: false + } + }], }; let myquery = getQueryProj( @@ -949,8 +963,8 @@ ListaIngressoSchema.statics.getarrayIndOrder = async function (idapp, filtri, my const ListaIngresso = this; let myfilter2 = { - surname: { $exists: true }, - $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], + + $or: [{ surname: { $exists: true } }, { deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], }; let myquery = getQueryIndOrder( @@ -973,7 +987,8 @@ ListaIngressoSchema.statics.getIngrEUserByFilter = async function (idapp, myfilt ind_order: 1, name: 1, surname: 1, - index: 1 + index: 1, + num_tess: 1 }); if (!!arr) { @@ -989,7 +1004,7 @@ ListaIngressoSchema.statics.getInvitati = async function (idapp, username, inclu let myq = { idapp, - $or: [{ 'user.deleted': { $exists: false } }, { 'user.deleted': { $exists: true, $eq: false } }], + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], invitante_username: username, }; @@ -1043,7 +1058,7 @@ ListaIngressoSchema.statics.getnumInvitatiBase = async function (idapp, username idapp, invitante_username: username, // username: { $ne: username }, - $or: [{ 'user.deleted': { $exists: false } }, { 'user.deleted': { $exists: true, $eq: false } }], + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], }, { username: 1, ind_order: 1 }, myfilter2, @@ -1058,7 +1073,7 @@ ListaIngressoSchema.statics.getnumInvitatiBase = async function (idapp, username idapp, aportador_solidario: username, //$or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], - $or: [{ 'user.deleted': { $exists: false } }, { 'user.deleted': { $exists: true, $eq: false } }], + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], }; if (attivi) { @@ -1114,13 +1129,37 @@ ListaIngressoSchema.statics.getnumInvitati = async function (idapp, username) { }; -ListaIngressoSchema.statics.Esegui_CronTab = async function (idapp) { +ListaIngressoSchema.statics.Esegui_CronTab = async function (idapp, mydata) { const ListaIngresso = this; console.log('Lancia CronTab: [IDAPP=' + idapp + ']'); - await ListaIngresso.GeneraGraduatoria(idapp, true); + let num = 0; + try { + if (!await Graduatoria.isUpdating()) { + await Graduatoria.setGradUpdating(idapp, true); + + ris = await Nave.delNaviProvvisorie(idapp); + + mystr = await ListaIngresso.GeneraGraduatoria(idapp, true); + await Graduatoria.setWorking(idapp, false); + + num = await Nave.generaNave(idapp, mydata, false); + } + + } catch (e) { + console.error('ERRORE CronTab: [IDAPP=' + idapp + ']', e.message); + + } finally { + await Graduatoria.setGradUpdating(idapp, false); + await Graduatoria.setWorking(idapp, false); + + console.log('FINE CronTab: [IDAPP=' + idapp + ']'); + } + + + return num; }; ListaIngressoSchema.statics.getnumInvitatiAttivi = function (idapp, username) { diff --git a/src/server/models/msg_template.js b/src/server/models/msg_template.js new file mode 100755 index 0000000..06a74d9 --- /dev/null +++ b/src/server/models/msg_template.js @@ -0,0 +1,102 @@ +const mongoose = require('mongoose'); +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 MsgTemplateSchema = new Schema({ + idapp: { + type: String, + }, + typemsg: { + type: Number, + }, + title: { + type: String, + }, + title_it: { + type: String, + }, + msg_it: { + type: String, + }, + title_enUs: { + type: String, + }, + msg_enUs: { + type: String, + }, + title_si: { + type: String, + }, + msg_si: { + type: String, + }, + title_fr: { + type: String, + }, + msg_fr: { + type: String, + }, + title_es: { + type: String, + }, + msg_es: { + type: String, + }, + title_pt: { + type: String, + }, + msg_pt: { + type: String, + }, +}); + +MsgTemplateSchema.statics.getFieldsForSearch = function () { + return [{ field: 'title', type: tools.FieldType.string }, + ] +}; + +MsgTemplateSchema.statics.executeQueryTable = function (idapp, params) { + params.fieldsearch = this.getFieldsForSearch(); + return tools.executeQueryTable(this, idapp, params); +}; + +MsgTemplateSchema.statics.getMsgByLang = async function (idapp, typemsg, lang) { + const MsgTemplate = this; + + try { + const mymsg = await MsgTemplate.findOne({ idapp, typemsg }); + if (!!mymsg) { + if ((!!mymsg["msg_" + lang]) && (!!mymsg["title_" + lang])) { + return { body: mymsg["msg_" + lang], title: mymsg["title_" + lang] } + } + } + } catch (e) { + return { body: '', title: '' }; + } + + return { body: '', title: '' }; + +}; +MsgTemplateSchema.statics.findAllIdApp = async function (idapp) { + const MsgTemplate = this; + + const myfind = { idapp }; + + return await MsgTemplate.find(myfind, (err, arrrec) => { + return arrrec + }); +}; + +const MsgTemplate = mongoose.model('MsgTemplate', MsgTemplateSchema); + +module.exports = { MsgTemplate }; diff --git a/src/server/models/nave.js b/src/server/models/nave.js index 4f4bc32..388236e 100755 --- a/src/server/models/nave.js +++ b/src/server/models/nave.js @@ -7,6 +7,7 @@ const { ListaIngresso } = require('./listaingresso'); const { NavePersistente } = require('./navepersistente'); const { Settings } = require('./settings'); const { User } = require('./user'); +const { Flotta } = require('../models/flotta'); const { ObjectID } = require('mongodb'); @@ -73,6 +74,9 @@ const NaveSchema = new mongoose.Schema({ type: Number, default: 1 }, + commento_al_sognatore: { + type: String + }, note: { type: String }, @@ -272,6 +276,21 @@ NaveSchema.statics.getusersByNave = function (idapp, navemediatore) { }; +NaveSchema.statics.getusersByFlotta = function (idapp, riga, col_prima, col_ultima) { + + const miaquery = { + idapp, + riga: riga + 3, + $and: [ + { col: { $gte: col_prima } }, + { col: { $lte: col_ultima } } + ], + }; + + return Nave.find(miaquery); + +}; + NaveSchema.statics.findRecByRigaColParent = async function (idapp, riga, col, numparentUp) { const Nave = this; @@ -427,7 +446,10 @@ function getQueryProj(myfilter) { 'profile.paymenttypes': 1, 'profile.teleg_id': 1, 'profile.email_paypal': 1, + 'profile.link_payment': 1, + 'profile.note_payment': 1, 'profile.cell': 1, + commento_al_sognatore: 1, made_gift: 1, sent_msg_howto_make_gift: 1, date_made_gift: 1, @@ -502,6 +524,7 @@ function getQueryInvitante(myfilter) { username: 1, invitante_username: 1, made_gift: 1, + commento_al_sognatore: 1, sent_msg_howto_make_gift: 1, date_made_gift: 1, note: 1, @@ -574,13 +597,6 @@ NaveSchema.statics.getCol = function (idapp) { return Settings.getKeyNum(idapp, 'col', 1); }; -function getPrimoFuocoByIndCol(col) { - // let ris = Math.ceil(col - (col % 8)) + 1; - let ris = ((Math.ceil(col / 8) - 1) * 8) + 1; - if (ris <= 0) - ris = 1; - return ris -} async function getusertextbyrec(myrec, symbol, lettera, riga, col, ind) { let visu_test = false; @@ -619,10 +635,16 @@ function checkifNullThenEmpty(rec, riga, col) { NaveSchema.statics.getPlaccaGenerica = async function (idapp, riga, col, offset, solorecord) { const Nave = this; + const { Flotta } = require('../models/flotta'); + + try { let recsognatori = await Nave.findSognatoriByFuoco(idapp, riga, col, offset); let recmediatore = await Nave.findMediatoreByFuoco(idapp, riga, col, offset); let navepersistente = await NavePersistente.findByRigaColByDonatore(idapp, riga, col, offset); + let flotta = null; + if (!!navepersistente) + flotta = await Flotta.getFlottaByNavePersistente(idapp, navepersistente); if (!solorecord) { mystr = tools.ACAPO; @@ -658,7 +680,7 @@ NaveSchema.statics.getPlaccaGenerica = async function (idapp, riga, col, offset, let arrdonatori = []; // let numcol = Math.pow(2, indriga - 1); - let primofuoco = getPrimoFuocoByIndCol(col * Math.pow(2, offset)); + let primofuoco = tools.getPrimoFuocoByIndCol(col * Math.pow(2, offset)); let ind = 1; for (let indcol = primofuoco; indcol < primofuoco + 8; indcol++) { @@ -689,6 +711,7 @@ NaveSchema.statics.getPlaccaGenerica = async function (idapp, riga, col, offset, recsognatori, recmediatore, navepersistente, + flotta, arrdonatori }; @@ -1014,7 +1037,7 @@ async function addRecordNaveByParams(params, siRitesse) { const giapresente = await Nave.findOne({ idapp: params.idapp, ind_order: params.ind_order, - num_tess: params.num_tess + num_tess: params.num_tess, }); if (!!giapresente) { if (params.persistenti) { @@ -1037,10 +1060,14 @@ async function addRecordNaveByParams(params, siRitesse) { }); myNave.created = new Date(); + if (!!params.note) { + myNave.note = params.note; + } + // console.log('[' + params.riga + ',' + params.col + ']'); // console.log('parent = [' + params.rigaparent + ',' + params.colparent + ']'); - const recfindparent = await Nave.findByRigaCol(idapp, params.rigaparent, params.colparent, false); + const recfindparent = await Nave.findByRigaCol(params.idapp, params.rigaparent, params.colparent, false); // console.log('recfindparent = [' + recfindparent + ']'); // console.table(recfindparent); @@ -1058,14 +1085,17 @@ async function addRecordNaveByParams(params, siRitesse) { if (!!result) { if (params.persistenti) { - let fields_to_update = { added: true }; + let fields_to_update = { added: true, navestr: mypos.riga + '.' + mypos.col }; + await ListaIngresso.findOneAndUpdate({ _id: params.id.toString() }, { $set: fields_to_update }, { new: false }); + } else { + let fields_to_update = { navestr: mypos.riga + '.' + mypos.col }; await ListaIngresso.findOneAndUpdate({ _id: params.id.toString() }, { $set: fields_to_update }, { new: false }); } params.conta++; // Check if the Ship has Completed - if (idapp === tools.AYNI) { + if (params.idapp === tools.AYNI) { if ((params.col % 8) === 0) { // Completed 8 people if (!params.primavolta) { @@ -1089,8 +1119,8 @@ async function addRecordNaveByParams(params, siRitesse) { else params.colparent = Math.ceil(params.col / 2); - await Nave.setRiga(idapp, params.riga); - await Nave.setCol(idapp, params.col); + await Nave.setRiga(params.idapp, params.riga); + await Nave.setCol(params.idapp, params.col); return true; } @@ -1126,33 +1156,35 @@ NaveSchema.statics.addUserFromListaIngresso_IntoNave = async function (init, ida const { User } = require('./user'); - if (init) { - params.idapp = idapp; - params.conta = 0; - } + try { - params.primavolta = (params.riga === 1) && (params.col === 1); - params.riga = await Nave.getRiga(idapp); - params.col = await Nave.getCol(idapp); - params.maxcol = tools.getmaxcol(params.riga); - params.colparent = Math.ceil(params.col / 2); - params.rigaparent = params.riga - 1; + if (init) { + params.idapp = idapp; + params.conta = 0; + } - if (params.rigaparent === 0) - params.colparent = 0; + params.primavolta = (params.riga === 1) && (params.col === 1); + params.riga = await Nave.getRiga(idapp); + params.col = await Nave.getCol(idapp); + params.maxcol = tools.getmaxcol(params.riga); + params.colparent = Math.ceil(params.col / 2); + params.rigaparent = params.riga - 1; - myriga = params.riga; - mycol = params.col; + if (params.rigaparent === 0) + params.colparent = 0; - const inserito = await addRecordNaveByParams(params, false); - if (inserito) { - if (idapp === tools.AYNI) { - if ((((params.col) % 8) === 0) && (params.col % 64 !== 0)) { + myriga = params.riga; + mycol = params.col; + + const inserito = await addRecordNaveByParams(params, false); + if (inserito) { + if (idapp === tools.AYNI) { let recmediatore = await Nave.findMediatoreByFuoco(idapp, myriga, mycol, 0); - if (!!recmediatore) { - const ris = await Nave.checkifDeveRitessersi(recmediatore); - if (ris.deveritessersi) { - console.log('Si deve ritessere: [riga=', params.riga, 'col', params.col, ']'); + let sognatore = await Nave.getSognatoreByRigaColMediatore(idapp, recmediatore); + if ((((params.col) % 8) === 0) && ((params.col % 64 !== 0) || (sognatore.username !== recmediatore.username))) { + if (!!recmediatore) { + const ris = await Nave.checkifDeveRitessersi(recmediatore); + // console.log('Si deve ritessere: [riga=', params.riga, 'col', params.col, ']'); if (ris.deveritessersi) { params.ind_order = recmediatore.ind_order; params.id = recmediatore._id; @@ -1163,10 +1195,9 @@ NaveSchema.statics.addUserFromListaIngresso_IntoNave = async function (init, ida } } } - } - /** - if ((params.riga === 4 + 3) && (params.col === (8 * 2) + 3)) { + /** + if ((params.riga === 4 + 3) && (params.col === (8 * 2) + 3)) { // Si ritesse il Fondo AYNI nella Nave 3.3 const userFondo = await User.findByIndex(idapp, 0); params.ind_order = userFondo.ind_order; @@ -1176,12 +1207,15 @@ NaveSchema.statics.addUserFromListaIngresso_IntoNave = async function (init, ida await addRecordNaveByParams(params, true); } **/ + } } - } - // Se ho completato 8 persone, allora - if (addednowreal) { + // Se ho completato 8 persone, allora + if (addednowreal) { + } + } catch (e) { + console.error(e.message); } }; @@ -1233,6 +1267,7 @@ NaveSchema.statics.generaNave = async function (idapp, mydata, persistenti) { params.ind_order = reclista.ind_order; params.id = reclista.idListaIngresso; params.num_tess = reclista.num_tess; + params.note = reclista.note; params.persistenti = persistenti; await Nave.addUserFromListaIngresso_IntoNave(index === 0, idapp, params, false); @@ -1307,26 +1342,49 @@ NaveSchema.statics.pulisciNonPresenzeInNave = async function (idapp) { NaveSchema.statics.visuNaviUtentiEliminati = async function (idapp) { const Nave = this; - let numrec = 0; + const { ListaIngresso } = require('./listaingresso'); + const { User } = require('./user'); - const myquery = getQueryProj({ idapp }); - - arrrec = await Nave.aggregate(myquery).sort({ riga: 1, col: 1 }); + arrnavi = await Nave.find({ idapp }).sort({ riga: 1, col: 1 }); let mystr = 'ELIMINATI: \n'; let conta = 0; - for (const rec of arrrec) { - if (!rec.username) { - let navepersistente = await NavePersistente.findByRigaColByDonatore(idapp, rec.riga, rec.col, 0); + for (const nave of arrnavi) { + const recingr = await ListaIngresso.findOne({ + idapp, + ind_order: nave.ind_order, + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }] + }); + + let rec = null; + + if (!!recingr) { + rec = await User.findOne({ idapp, username: recingr.username }); + } + + if (!rec || !rec.username || rec.deleted) { + let navepersistente = await NavePersistente.findByRigaColByDonatore(idapp, nave.riga, nave.col, 0); if (!!navepersistente) { - mystr += '[' + conta + '] [NAVI ' + navepersistente.riga + '.' + navepersistente.col + '] [' + rec.riga + '.' + rec.col + '] ' + rec.ind_order; - mystr += ' num_tess = ' + rec.num_tess; + mystr += '[' + conta + '] [NAVI ' + navepersistente.riga + '.' + navepersistente.col + '] [' + nave.riga + '.' + nave.col + '] ' + ' ord= ' + nave.ind_order; + mystr += ' num_tess = ' + nave.num_tess + ' '; + if (!!rec) { + if (!!rec.username) { + mystr += ' [' + rec.username + '] '; + } + if (!!rec.name) { + mystr += ' (' + rec.name + ' ' + rec.surname + ') '; + } + if (rec.deleted) { + mystr += ' (CANCELLATO)'; + } + } mystr += '\n'; conta++; } } } + return { mystr, num: conta }; }; @@ -1421,6 +1479,58 @@ NaveSchema.statics.getDonatoridelSognatore = async function (idapp, riganave, co }; +NaveSchema.statics.getFlotta = async function (idapp, riga, col_prima, col_ultima) { + const Nave = this; + + const myquery = getQueryProj({ + idapp, + riga: riga + 3, + col: { $gte: col_prima, $lte: col_ultima } + }); + + const { Flotta } = require('../models/flotta'); + + const flotta = await Flotta.findOne({ idapp, riga, col_prima }); + + const { User } = require('./user'); + + const usersognatore = await User.findOne({idapp, username: flotta.sognatore }); + if (!!usersognatore) { + flotta.link_payment = usersognatore.profile.link_payment; + flotta.email_paypal = usersognatore.profile.email_paypal; + flotta.note_payment = usersognatore.profile.note_payment; + } + + const arrnaviout = []; + + const arrnavi = await Nave.aggregate(myquery); + + for (const nave of arrnavi) { + // Se è il mediatore, allora non includerlo nei Donatori! + mypos = { + riga: nave.riga, + col: nave.col, + numup: 3, + }; + + tools.getRigaColByPosUp(mypos); + + const navemediatore = await Nave.findByRigaCol(idapp, mypos.riga, mypos.col, true); + if (!!navemediatore) { + if (navemediatore.ind_order !== nave.ind_order) { + arrnaviout.push(nave); + } + } else { + arrnaviout.push(nave); + } + } + + flotta._doc.log_attivita = tools.readFlottaLog(idapp, flotta.riga, flotta.col_prima); + + return { arrdonatori: arrnaviout, flotta }; + +}; + NaveSchema.statics.isDefinitiva = async function (idapp, mynave) { const nave = await NavePersistente.findByRigaColByDonatore(idapp, mynave.riga, mynave.col, 0); return (!!nave) ? !nave.provvisoria : false; @@ -1553,9 +1663,47 @@ NaveSchema.statics.checkIfMadeGift = async function (idapp, username) { }; -NaveSchema.statics.getSognatoreByRigaColMediatore = async function (idapp, navemediatore) { +NaveSchema.statics.delNaviProvvisorie = async function (idapp) { + const Nave = this; - const ris = this.getRigaColSognatoreByMediatore(idapp, navemediatore.riga, navemediatore.col, 3); + let num = 0; + + const arrnavi = await Nave.find({ idapp }); + + for (const nave of arrnavi) { + let persistente = await NavePersistente.findByRigaColByDonatore(idapp, nave.riga, nave.col, 0); + if (!!persistente) { + if (persistente.provvisoria) { + let ris = await Nave.deleteOne({ _id: nave._id }); + if (!!ris) { + num++; + } + } + } + } + + // Pulisci gli added se era stato cancellato dalla nave + await Nave.pulisciNonPresenzeInNave(idapp); + + const data = await Nave.getLastRigaCol(idapp); + await Nave.setRiga(idapp, data.riga); + await Nave.setCol(idapp, data.col + 1); + + const maxcol = tools.getmaxcol(data.riga); + if (data.col === maxcol) { + await Nave.setRiga(idapp, data.riga + 1); + await Nave.setCol(idapp, 1); + } + + return { num }; + +}; + + +NaveSchema.statics.getSognatoreByRigaColMediatore = async function (idapp, navemediatore) { + const Nave = this; + + const ris = tools.getRigaColSognatoreByMediatore(idapp, navemediatore.riga, navemediatore.col); const myquery = getQueryProj({ idapp, @@ -1573,7 +1721,6 @@ NaveSchema.statics.getSognatoreByRigaColMediatore = async function (idapp, navem return null; }; - const Nave = mongoose.model('Nave', NaveSchema); module.exports = { Nave }; diff --git a/src/server/models/navepersistente.js b/src/server/models/navepersistente.js index 6fcd055..626fbff 100755 --- a/src/server/models/navepersistente.js +++ b/src/server/models/navepersistente.js @@ -7,6 +7,8 @@ const { ListaIngresso } = require('./listaingresso'); const { Settings } = require('./settings'); const { User } = require('./user'); +const { Flotta } = require('./flotta'); + const { ObjectID } = require('mongodb'); const shared_consts = require('../tools/shared_nodejs'); @@ -92,6 +94,8 @@ function getQueryProj(myfilter) { username: 1, 'profile.paymenttypes': 1, 'profile.email_paypal': 1, + 'profile.link_payment': 1, + 'profile.note_payment': 1, 'profile.cell': 1, made_gift: 1, sent_msg_howto_make_gift: 1, @@ -125,13 +129,13 @@ function getQueryProj(myfilter) { } }, { - $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$mylista", 0 ] }, "$$ROOT" ] } } + $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: ["$mylista", 0] }, "$$ROOT"] } } }, { $lookup: { from: "users", as: "user", - let: {username: '$username' }, + let: { username: '$username' }, pipeline: [ { $match: { @@ -209,7 +213,7 @@ NavePersistenteSchema.statics.getListaNavi = function (idapp) { NavePersistenteSchema.statics.getLastNave = function (idapp) { const NavePersistente = this; - const myfind = { idapp, date_start: { $lte: tools.IncDateNow(0) }, provvisoria: false }; + const myfind = { idapp, date_start: { $lte: tools.IncDateNow(0) }, provvisoria: false }; return NavePersistente.findOne(myfind, { @@ -250,10 +254,13 @@ NavePersistenteSchema.statics.findByRigaCol = function (idapp, riga, col) { NavePersistenteSchema.statics.getLastRigaCol = async function (idapp) { + const NavePersistente = this; return NavePersistente.findOne({ idapp }).sort({ riga: -1, col: -1 }); }; NavePersistenteSchema.statics.getLastRigaColDefinitiva = async function (idapp) { + const NavePersistente = this; + return NavePersistente.findOne({ idapp, provvisoria: false }).sort({ riga: -1, col: -1 }); }; @@ -272,7 +279,8 @@ NavePersistenteSchema.pre('save', async function (next) { function getNextDayNave(miadata) { - const dayofweek = [1, 3, 5]; // LUNEDI, MERCOLEDI, VENERDI + // const dayofweek = [1, 2, 4, 5]; // LUNEDI, MARTEDI', GIOVEDI, VENERDI + const dayofweek = [1, 4]; // LUNEDI, GIOVEDI let mydate = tools.AddDate(miadata, 1); @@ -285,6 +293,7 @@ function getNextDayNave(miadata) { } NavePersistenteSchema.statics.addRecordNavePersistenteByParams = async function (params) { + const NavePersistente = this; // Check if Exist: const giapresente = await NavePersistente.findOne({ @@ -295,7 +304,7 @@ NavePersistenteSchema.statics.addRecordNavePersistenteByParams = async function if (!giapresente) { // Prende la nave prima: - const lastnave = await NavePersistente.findOne({idapp}).sort({riga: -1, col: -1}); + const lastnave = await NavePersistente.findOne({ idapp: params.idapp }).sort({ riga: -1, col: -1 }); let nextgiftchat = null; @@ -323,6 +332,160 @@ NavePersistenteSchema.statics.addRecordNavePersistenteByParams = async function return false; }; +NavePersistenteSchema.statics.generaFlotte = async function (idapp) { + const NavePersistente = this; + + // await Flotta.deleteMany({ idapp }); + + const arrnavi = await NavePersistente.find({ idapp, col: { $mod: [8, 1] } }).sort({ riga: 1, col: 1 }); + + let num = 0; + + for (const navepers of arrnavi) { + + const ris = await NavePersistente.aggiornaFlottaByNavePersistente(idapp, navepers); + if (ris) + num++; + } + + return { num } + +}; + +NavePersistenteSchema.statics.changeField = async function (idapp, flotta, fieldvalue) { + + let myval = {}; + + if ('date_close' in fieldvalue) { + myval['date_gift_chat_open'] = fieldvalue['date_close']; + } else { + myval = fieldvalue; + } + + const ris = await NavePersistente.updateMany({ + idapp, + riga: flotta.riga, + $and: [ + { col1don: { $gte: flotta.col_prima } }, + { col1don: { $lte: flotta.col_ultima } }, + ] + }, { $set: myval }); + + return ris; +}; + +NavePersistenteSchema.statics.aggiornaFlottaByNavePersistente = async function (idapp, naveinput) { + + const { Nave } = require('../models/nave'); + const { User } = require('./user'); + + let num = 0; + + try { + let nuovo = false; + // let primacol = false; + + indcolflottaprima = tools.getPrimaColFlotta(naveinput.col1don + 7); + + console.log(num, ' -> [', naveinput.riga, '.', naveinput.col, '] indcolflottaprima=', indcolflottaprima); + + let ini = Math.ceil(indcolflottaprima / 8); + let fine = ini + 7; + + const arrnavi = await NavePersistente.find({ + idapp, + riga: naveinput.riga, + $and: [{ col: { $gte: ini } }, { col: { $lte: fine } }] + }).sort({ riga: 1, col: 1 }); + + let primogiro = true; + + let myflotta = await Flotta.findOne({ idapp, riga: naveinput.riga, col_prima: indcolflottaprima }); + + if (!myflotta) { + myflotta = new Flotta({ + _id: new ObjectID(), + idapp, + }); + nuovo = true; + } + + for (const navepers of arrnavi) { + + if (primogiro) { + myflotta.DoniAttesaDiConferma = 0; + myflotta.DoniMancanti = 0; + myflotta.DoniConfermati = 0; + myflotta.DoniTotali = 0; + primogiro = false; + } + + if (nuovo) { + myflotta.riga = navepers.riga; + myflotta.col_prima = indcolflottaprima; + myflotta.col_ultima = indcolflottaprima + 63; + + myflotta.sognatore = ''; + myflotta.sognatore_nomecognome = ''; + myflotta.link_superchat = ''; + myflotta.msg_inviato = false; + } + + myflotta.date_start = navepers.date_start; + myflotta.date_close = navepers.date_gift_chat_open; + + let sognatore = await Nave.getSognatoreByRigaColMediatore(idapp, { riga: navepers.riga, col: navepers.col }); + if (myflotta.sognatore_nomecognome === '') { + myflotta.sognatore = sognatore.username; + if (!!sognatore.username) + myflotta.sognatore_nomecognome = await User.getNameSurnameByUsername(idapp, sognatore.username); + } + + if (nuovo) { + myflotta.email_paypal = ''; + myflotta.link_payment = ''; + myflotta.note_payment = ''; + if (!!sognatore) { + myflotta.email_paypal = sognatore.profile.email_paypal; + myflotta.link_payment = sognatore.profile.link_payment; + myflotta.note_payment = sognatore.profile.note_payment; + } + } + + if (!!sognatore) { + if (!myflotta.email_paypal) + myflotta.email_paypal = sognatore.profile.email_paypal; + if (!myflotta.link_payment) + myflotta.link_payment = sognatore.profile.link_payment; + if (!myflotta.note_payment) + myflotta.note_payment = sognatore.profile.note_payment; + } + + myflotta.provvisoria = navepers.provvisoria; + + if (!!navepers.DoniAttesaDiConferma && !isNaN(navepers.DoniAttesaDiConferma)) + myflotta.DoniAttesaDiConferma += navepers.DoniAttesaDiConferma; + if (!!navepers.DoniMancanti && !isNaN(navepers.DoniMancanti)) + myflotta.DoniMancanti += navepers.DoniMancanti; + if (!!navepers.DoniConfermati && !isNaN(navepers.DoniConfermati)) + myflotta.DoniConfermati += navepers.DoniConfermati; + if (!!navepers.DoniTotali && !isNaN(navepers.DoniTotali)) + myflotta.DoniTotali += navepers.DoniTotali; + + + } + + await myflotta.save(); + + return true; + + } catch (e) { + console.log(e.message); + return false; + } + +}; + const NavePersistente = mongoose.model('NavePersistente', NavePersistenteSchema); diff --git a/src/server/models/settings.js b/src/server/models/settings.js index 2c86378..51929c8 100755 --- a/src/server/models/settings.js +++ b/src/server/models/settings.js @@ -56,7 +56,7 @@ SettingsSchema.statics.getValDbSettings = function (idapp, key, def) { return Settings.findOne({ idapp, key }) .then((myrec) => { // console.log('getValDbSettings', myrec, 'idapp', idapp); - if (myrec) { + if (!!myrec) { if (myrec.type === tools.FieldType.date) return myrec.value_date; else if (myrec.type === tools.FieldType.number) @@ -112,6 +112,8 @@ SettingsSchema.statics.setKeyNum = async function (idapp, key, value) { myrec = await Settings.findOneAndUpdate({ idapp, key }, { $set: { value_num: value } }, { new: false }); } + return myrec + }; SettingsSchema.statics.setBool = async function (idapp, key, valbool) { @@ -130,6 +132,8 @@ SettingsSchema.statics.setBool = async function (idapp, key, valbool) { myrec = await Settings.findOneAndUpdate({ idapp, key }, { $set: { value_bool: valbool } }, { new: false }); } + return myrec + }; diff --git a/src/server/models/user.js b/src/server/models/user.js index 8c9450d..7fcc583 100755 --- a/src/server/models/user.js +++ b/src/server/models/user.js @@ -6,6 +6,7 @@ const _ = require('lodash'); const tools = require('../tools/general'); +const { Flotta } = require('../models/flotta'); const { Settings } = require('../models/settings'); const { ListaIngresso } = require('../models/listaingresso'); const { Graduatoria } = require('../models/graduatoria'); @@ -153,6 +154,15 @@ const UserSchema = new mongoose.Schema({ sospeso: { type: Boolean }, + non_voglio_imbarcarmi: { + type: Boolean + }, + navinonpresenti: { + type: Boolean + }, + subaccount: { + type: Boolean + }, profile: { img: { type: String @@ -175,6 +185,12 @@ const UserSchema = new mongoose.Schema({ email_paypal: { type: String }, + link_payment: { + type: String + }, + note_payment: { + type: String + }, paymenttypes: [], username_telegram: { type: String @@ -203,10 +219,13 @@ const UserSchema = new mongoose.Schema({ saw_zoom_presentation: { type: Boolean }, - special_req: { + qualified: { type: Boolean }, - vuole_ritessersi: { + qualified_2invitati: { + type: Boolean + }, + special_req: { type: Boolean }, sex: { @@ -345,7 +364,17 @@ UserSchema.statics.findByCredentials = function (idapp, username, password) { return User.findOne({ idapp, username: username, - $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }] + $or: [ + { deleted: { $exists: false } }, + { deleted: { $exists: true, $eq: false } }, + { + $and: [ + { deleted: { $exists: true, $eq: true } }, + { subaccount: { $exists: true, $eq: true } } + ] + } + ], + }).then((user) => { if (!user) { // Check if with email: @@ -354,7 +383,7 @@ UserSchema.statics.findByCredentials = function (idapp, username, password) { $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }] }) } else { - return !user.deleted ? user : null + return !user.deleted || (user.deleted && user.subaccount) ? user : null } }).then(user => { if (!user) @@ -409,6 +438,7 @@ UserSchema.statics.getUserShortDataByUsername = async function (idapp, username) 'username': username, $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }], }, { + idapp: 1, lang: 1, index: 1, ind_order: 1, @@ -421,8 +451,12 @@ UserSchema.statics.getUserShortDataByUsername = async function (idapp, username) verified_email: 1, 'profile.teleg_id': 1, 'profile.saw_zoom_presentation': 1, + 'profile.qualified': 1, + 'profile.qualified_2invitati': 1, 'profile.saw_and_accepted': 1, 'profile.email_paypal': 1, + 'profile.link_payment': 1, + 'profile.note_payment': 1, 'profile.my_dream': 1, 'profile.paymenttypes': 1, 'profile.cell': 1, @@ -467,8 +501,12 @@ UserSchema.statics.getDownlineByUsername = async function (idapp, username, incl verified_email: 1, 'profile.teleg_id': 1, 'profile.saw_zoom_presentation': 1, + 'profile.qualified': 1, + 'profile.qualified_2invitati': 1, 'profile.saw_and_accepted': 1, 'profile.email_paypal': 1, + 'profile.link_payment': 1, + 'profile.note_payment': 1, 'profile.my_dream': 1, 'profile.paymenttypes': 1, 'profile.cell': 1, @@ -558,7 +596,6 @@ UserSchema.statics.getQueryQualified = function () { } - UserSchema.statics.isUserQualified7 = async function (idapp, username) { const User = this; @@ -576,6 +613,72 @@ UserSchema.statics.isUserQualified7 = async function (idapp, username) { return !!myrec; }; +UserSchema.statics.isUserAlreadyQualified = async function (idapp, username) { + const User = this; + + if (username === undefined) + return false; + + const myquery = { + 'idapp': idapp, + 'username': username, + 'profile.qualified': { $exists: true, $eq: true }, + }; + + const myrec = await User.findOne(myquery); + + return !!myrec; +}; + +UserSchema.statics.isUserAlreadyQualified_2Invitati = async function (idapp, username) { + const User = this; + + if (username === undefined) + return false; + + const myquery = { + 'idapp': idapp, + 'username': username, + 'profile.qualified_2invitati': { $exists: true, $eq: true }, + }; + + const myrec = await User.findOne(myquery); + + return !!myrec; +}; + +UserSchema.statics.setUserQualified = async function (idapp, username) { + const User = this; + + if (username === undefined) + return false; + + const myquery = { + 'idapp': idapp, + 'username': username, + }; + + const myrec = await User.findOneAndUpdate(myquery, { $set: { 'profile.qualified': true } }, { new: false } ); + + return !!myrec; +}; + +UserSchema.statics.setUserQualified_2Invitati = async function (idapp, username) { + const User = this; + + if (username === undefined) + return false; + + const myquery = { + 'idapp': idapp, + 'username': username, + }; + + const myrec = await User.findOneAndUpdate(myquery, { $set: { 'profile.qualified_2invitati': true } }, { new: false } ); + + return !!myrec; +}; + UserSchema.statics.isUserQualified9 = async function (idapp, username) { const User = this; @@ -873,6 +976,22 @@ UserSchema.statics.SetTelegramCheckCode = async function (idapp, id, teleg_check }; +UserSchema.statics.NonVoglioImbarcarmi = async function (idapp, username) { + const User = this; + + const fields_to_update = { + non_voglio_imbarcarmi: true + }; + + return await User.findOneAndUpdate({ + idapp, + username, + }, { $set: fields_to_update }, { new: false }).then((record) => { + return !!record; + }); + +}; + UserSchema.statics.SetTelegramIdSuccess = async function (idapp, id, teleg_id) { const User = this; @@ -923,7 +1042,7 @@ UserSchema.statics.SetTelegramWasBlocked = async function (idapp, teleg_id) { 'profile.teleg_id': 0, }; - if (process.env.PROD === 1) { + if (process.env.PROD === "1") { const ris = await User.findOneAndUpdate({ idapp, @@ -1007,10 +1126,15 @@ UserSchema.statics.getRecByIndOrder = async function (idapp, ind_order) { ind_order: 1, old_order: 1, username: 1, + email: 1, name: 1, lang: 1, surname: 1, 'profile.teleg_id': 1, + 'profile.email_paypal': 1, + 'profile.link_payment': 1, + 'profile.note_payment': 1, + 'profile.paymenttypes': 1, }; const rec = await ListaIngresso.getarray(idapp, @@ -1161,6 +1285,7 @@ UserSchema.statics.getFieldsForSearch = function () { { field: 'email', type: tools.FieldType.string }, { field: 'profile.cell', type: tools.FieldType.string }, { field: 'profile.email_paypal', type: tools.FieldType.string }, + { field: 'profile.link_payment', type: tools.FieldType.string }, { field: 'profile.teleg_id', type: tools.FieldType.number }, { field: 'profile.username_telegram', type: tools.FieldType.string }, { field: 'aportador_solidario', type: tools.FieldType.string }] @@ -1235,6 +1360,8 @@ UserSchema.statics.getDashboard = async function (idapp, aportador_solidario, us for (let mypos of dashboard.arrposizioni) { mypos.rec = await Nave.getNaveByRigaCol(idapp, mypos.riga, mypos.col); mypos.nave_partenza = await NavePersistente.findByRigaColByDonatore(idapp, mypos.riga, mypos.col, 0); + if (!!mypos.nave_partenza) + mypos.flotta = await Flotta.getFlottaByNavePersistente(idapp, mypos.nave_partenza); } @@ -1924,6 +2051,111 @@ UserSchema.statics.changeInvitante = async function (idapp, username, invitante_ }; +UserSchema.statics.NessunaNavePresenteByUsername = async function (idapp, username) { + const User = this; + + const rec = await User.findOne({ idapp, username }, { username: 1, ind_order: 1 }); + if (!!rec) { + // Controlla se è qualificato! + const qualified = await User.isUserQualified7(idapp, rec.username); + if (qualified) { + + // Ha un'imbarco almeno? + const arrimbarchi = await ListaIngresso.findOne({ + idapp, username: rec.username, + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }] + }); + + const arrnavi = await Nave.findOne({ + idapp, ind_order: rec.old_order, + }); + + + if (!arrimbarchi && !arrnavi) { + // NEANCHE 1 ! + const recout = await User.findOneAndUpdate({ + idapp, + username + }, { $set: { navinonpresenti: true } }, { new: false }); + + return (!!recout); + } + } + } + + return false; + +}; + +UserSchema.statics.flagUtentiNaviNonPresenti = async function (idapp) { + const User = this; + + let num = 0; + + await User.updateMany({ idapp }, { $set: { navinonpresenti: false } }); + + arrusers = await User.find({ + 'idapp': idapp, + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }, + { subaccount: { $exists: false } }, { subaccount: { $exists: true, $eq: false } }] + }); + + for (const rec of arrusers) { + + const nessunanave = await User.NessunaNavePresenteByUsername(idapp, rec.username); + if (nessunanave) + num++; + } + + return { num }; +}; + +UserSchema.statics.addNavePerUtentiNaviNonPresenti = async function (idapp) { + const User = this; + + let num = 0; + + arrusers = await User.find({ + 'idapp': idapp, + navinonpresenti: true + }); + + for (const user of arrusers) { + // Controlla se è qualificato! + mydata = tools.AddDate(user.date_reg, 7); + + const newrecingr = await ListaIngresso.addUserInListaIngresso(idapp, user.username, user.aportador_solidario, user.lang, true, true, mydata); + await tools.snooze(1000); + + num++; + } + + return { num }; +}; + +UserSchema.statics.convSubAccount = async function (idapp) { + const User = this; + + + // Solo i Cancellati ! + arrusers = await User.find({ 'idapp': idapp, deleted: true }); + let num = 0; + for (const rec of arrusers) { + // Cerca il suo Principale! + const trovato = await User.findOne({ + idapp, + 'profile.teleg_id': rec.profile.teleg_id, + $or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }] + }); + if (trovato) { + num++; + await User.findByIdAndUpdate(rec._id, { subaccount: true }, { new: false }); + } + } + + return { num }; +}; + UserSchema.statics.DbOp = async function (idapp, mydata) { const User = this; try { diff --git a/src/server/router/api/actions.js b/src/server/router/api/actions.js index 0a40792..7f0a430 100755 --- a/src/server/router/api/actions.js +++ b/src/server/router/api/actions.js @@ -13,7 +13,7 @@ const tools = require('../../tools/general'); const telegrambot = require('../../telegram/telegrambot'); module.exports = { - doOtherThingsAfterDeleted: async function (tablename, rec, notifBot) { + doOtherThingsAfterDeleted: async function (tablename, rec, notifBot, req) { try { let ris = null; if (tablename === 'users') { @@ -42,12 +42,13 @@ module.exports = { ris = await Graduatoria.deleteOne({ idListaIngresso: ObjectID(rec._id) }); if (!!ris) { - let msg = 'Eliminato Imbarco di ' + rec.name + ' ' + rec.surname + ' [Index = ' + rec.index + ']'; + let msg = 'Eliminato Imbarco di ' + rec.name + ' ' + rec.surname + ' (ind_order=' + rec.ind_order + ', num_tess=' + rec.num_tess + ') [Num = ' + rec.index + `] (da ${req.user.name} ${req.user.surname} )` ; await telegrambot.sendMsgTelegramToTheManagers(rec.idapp, msg); + tools.writeSostituzioniLog(msg); } // Elimina anche la Nave se è temporanea! - const arrnave = await Nave.find({ idapp: rec.idapp, ind_order: rec.ind_order }); + const arrnave = await Nave.find({ idapp: rec.idapp, ind_order: rec.ind_order, num_tess: rec.num_tess }); for (const mynave of arrnave) { if (!!mynave) { if (!await Nave.isDefinitiva(rec.idapp, mynave)) { diff --git a/src/server/router/dashboard_router.js b/src/server/router/dashboard_router.js index 352561a..70f61ef 100755 --- a/src/server/router/dashboard_router.js +++ b/src/server/router/dashboard_router.js @@ -10,7 +10,9 @@ const { authenticate } = require('../middleware/authenticate'); const { User } = require('../models/user'); const { Nave } = require('../models/nave'); +const { Flotta } = require('../models/flotta'); const { NavePersistente } = require('../models/navepersistente'); +const { MsgTemplate } = require('../models/msg_template'); const mongoose = require('mongoose'); const Subscription = mongoose.model('subscribers'); @@ -94,10 +96,11 @@ router.post('/msgnave', authenticate, async (req, res) => { if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_SINGOLO) { let mymsg = ''; if (!!mydata.username_mitt) { - mymsg = '[' + tools.getres__('MSG_SEND_FROM', res) + ' ' + mydata.username_mitt + ']:' + tools.ACAPO; + mymsg = '[' + tools.getres__('MSG_SEND_FROM', res) + ' ' + mydata.username_mitt + ' a ' + mydata.username + ']:' + tools.ACAPO; } mymsg += mydata.msgpar1; - ris = await telegrambot.sendMsgTelegram(idapp, mydata.username, mymsg, true, mydata.username_mitt); // Anche a STAFF + // ris = await telegrambot.sendMsgTelegram(idapp, mydata.username, mymsg, true, mydata.username_mitt); // Anche a STAFF + ris = await telegrambot.sendMsgTelegram(idapp, mydata.username, mymsg, true); // Anche a STAFF } else ris = await telegrambot.sendMsgTelegramToNave(idapp, mydata); @@ -113,6 +116,27 @@ router.post('/msgnave', authenticate, async (req, res) => { }); +router.post('/msgflotta', authenticate, async (req, res) => { + const idapp = req.body.idapp; + let mydata = req.body; + + try { + + let ris = null; + ris = await telegrambot.sendMsgTelegramToNave(idapp, mydata); + + if (ris) + res.send({ code: server_constants.RIS_CODE_OK, ris }); + else + res.send({ code: server_constants.RIS_CODE_ERR, ris: null }); + + + } catch (e) { + res.status(400).send(e); + } + +}); + router.post('/getnave', authenticate, async (req, res) => { const idapp = req.body.idapp; const riga = req.body.riga; @@ -144,6 +168,9 @@ router.post('/getnave', authenticate, async (req, res) => { router.post('/getnavi', authenticate, async (req, res) => { const idapp = req.body.idapp; + const { Flotta } = require('../models/flotta'); + + let arrnavi = await NavePersistente.findAllIdApp(idapp); // let arrnavi = await NavePersistente.find({idapp, date_gift_chat_open: { $gte: tools.IncDateNow(-1000 * 3600 * 24 * 7 ) } }).sort({ riga: 1, col: 1 }); @@ -163,6 +190,8 @@ router.post('/getnavi', authenticate, async (req, res) => { // } // nave._doc.rec.donatore.navepersistente = await NavePersistente.findByRigaColByDonatore(idapp, riganave, colnave, 0); nave._doc.rec.donatore.navepersistente = await NavePersistente.findOne({ idapp, riga: riganave, col: colnave }); + if (!!nave._doc.rec.donatore.navepersistente) + nave._doc.rec.donatore.flotta = await Flotta.getFlottaByNavePersistente(idapp, nave._doc.rec.donatore.navepersistente); } const navi_partenza = await NavePersistente.findAllIdApp(idapp); @@ -176,6 +205,48 @@ router.post('/getnavi', authenticate, async (req, res) => { }); +router.post('/getmsg_templates', authenticate, async (req, res) => { + const idapp = req.body.idapp; + + let ris = await MsgTemplate.findAllIdApp(idapp); + + if (!!ris) + res.send({ code: server_constants.RIS_CODE_OK, ris }); + else + res.status(400).send(e); + + +}); + +router.post('/getflotte', authenticate, async (req, res) => { + const idapp = req.body.idapp; + + let arrflotte = await Flotta.findAllIdApp(idapp); + + if (!!arrflotte) + res.send({ code: server_constants.RIS_CODE_OK, arrflotte }); + else + res.status(400).send(e); + +}); + +router.post('/getflotta', authenticate, async (req, res) => { + const idapp = req.body.idapp; + const riga = req.body.riga; + const col_prima = req.body.col_prima; + const col_ultima = req.body.col_ultima; + + let ris = await Nave.getFlotta(idapp, riga, col_prima, col_ultima); + + ris.flotta._doc.log_attivita = tools.readFlottaLog(idapp, ris.flotta.riga, ris.flotta.col_prima); + + if (!!ris) + res.send({ code: server_constants.RIS_CODE_OK, flotta: ris.flotta, arrdonatori: ris.arrdonatori }); + else + res.status(400).send(e); + +}); + router.post('/getdoninavi', authenticate, async (req, res) => { const idapp = req.body.idapp; const ricalcola = req.body.ricalcola; @@ -185,7 +256,7 @@ router.post('/getdoninavi', authenticate, async (req, res) => { if (showall) arrnavi = await NavePersistente.findAllIdApp(idapp); else - arrnavi = await NavePersistente.find({idapp, date_gift_chat_open: { $gte: tools.IncDateNow(-1000 * 3600 * 24 * 7 ) } }).sort({ riga: 1, col: 1 }); + arrnavi = await NavePersistente.find({idapp, date_gift_chat_open: { $gte: tools.IncDateNow(-1000 * 3600 * 24 * 10 ) } }).sort({ riga: 1, col: 1 }); let test = false; @@ -201,6 +272,7 @@ router.post('/getdoninavi', authenticate, async (req, res) => { } } else { // arrnavi = await NavePersistente.findAllIdApp(idapp); + let index = 1; for (nave of arrnavi) { if (nave.provvisoria || nave.DoniTotali !== nave.DoniConfermati) { nave._doc.rec = await Nave.getNaveByRigaCol(idapp, nave.riga1don, nave.col1don); @@ -214,8 +286,13 @@ router.post('/getdoninavi', authenticate, async (req, res) => { nave._doc.rec = {}; nave._doc.rec.donatore = {}; nave._doc.rec.donatore.navepersistente = await NavePersistente.findByRigaColByDonatore(idapp, rigapos, colpos, tools.Placca.SONOFUOCO); + index++; + } + if (index > 8 * 6 ) { + break; } } + } ris = { arrnavi }; diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index 36fb6af..8bc5a4f 100755 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -30,6 +30,7 @@ const _ = require('lodash'); const { User } = require('../models/user'); const { Nave } = require('../models/nave'); +const { Flotta } = require('../models/flotta'); const { NavePersistente } = require('../models/navepersistente'); // const { ExtraList } = require('../models/extralist'); const { Booking } = require('../models/booking'); @@ -49,6 +50,7 @@ const { MailingList } = require('../models/mailinglist'); const { Settings } = require('../models/settings'); const { SendMsg } = require('../models/sendmsg'); const { Permission } = require('../models/permission'); +const { MsgTemplate } = require('../models/msg_template'); const tools = require('../tools/general'); @@ -220,6 +222,10 @@ function getTableByTableName(tablename) { mytable = MailingList; else if (tablename === 'navi') mytable = Nave; + else if (tablename === 'flotte') + mytable = Flotta; + else if (tablename === 'msg_templates') + mytable = MsgTemplate; else if (tablename === 'navepersistente') mytable = NavePersistente; else if (tablename === 'listaingressos') @@ -285,6 +291,9 @@ router.post('/gettable', authenticate, (req, res) => { async function checkIfSbloccatiRequisiti(idapp, allData, id) { + if (!allData.myuser) + return false; + if (await Nave.checkIfNaveExist(idapp, allData.myuser.username)) { // Se già sei dentro la Nave, allora sei OK return true; @@ -298,22 +307,27 @@ async function checkIfSbloccatiRequisiti(idapp, allData, id) { if (userlista.length === 0) { // Se non sono ancora dentro alla lista, allora controllo - if (!allData.precDataUser.is7req && is7req) { - // ORA HAI I 7 REQUISITI ! - // const msgtext = telegrambot.getCiao(idapp, allData.myuser.username, allData.myuser.lang) + tools.gettranslate('HAI_I_7_REQUISITI', allData.myuser.lang); - // telegrambot.sendMsgTelegram(idapp, allData.myuser.username, msgtext, true); // Anche a STAFF + if (!!allData.precDataUser) { + if ((!allData.precDataUser.is7req && is7req) && !await User.isUserAlreadyQualified(idapp, allData.myuser.username)) { + await User.setUserQualified(idapp, allData.myuser.username); + // ORA HAI I 7 REQUISITI ! + // const msgtext = telegrambot.getCiao(idapp, allData.myuser.username, allData.myuser.lang) + tools.gettranslate('HAI_I_7_REQUISITI', allData.myuser.lang); + // telegrambot.sendMsgTelegram(idapp, allData.myuser.username, msgtext, true); // Anche a STAFF - if (tools.isAbilitaNave(idapp)) { // Aggiungilo alla ListaIngresso risingr = await ListaIngresso.addUserInListaIngresso(idapp, allData.myuser.username, allData.myuser.aportador_iniziale, allData.myuser.lang, true, false); } } } - if (!allData.precDataUser.is9req && is9req) { - // ORA HAI I 9 REQUISITI ! - const msgtext = telegrambot.getCiao(idapp, allData.myuser.username, allData.myuser.lang) + tools.gettranslate('HAI_I_9_REQUISITI', allData.myuser.lang); - telegrambot.sendMsgTelegram(idapp, allData.myuser.username, msgtext, false); // Anche a STAFF + if (!!allData.precDataUser) { + if ((!allData.precDataUser.is9req && is9req) && !await User.isUserAlreadyQualified_2Invitati(idapp, allData.myuser.username)) { + await User.setUserQualified_2Invitati(idapp, allData.myuser.username); + // ORA HAI I 9 REQUISITI ! + const msgtext = telegrambot.getCiao(idapp, allData.myuser.username, allData.myuser.lang) + tools.gettranslate('HAI_I_9_REQUISITI', allData.myuser.lang); + telegrambot.sendMsgTelegram(idapp, allData.myuser.username, msgtext, false); // Anche a STAFF + } + } // CHECK APORTADOR SOLIDARIO: @@ -391,7 +405,10 @@ router.patch('/chval', authenticate, async (req, res) => { if (camporequisiti) { allData = {}; allData.myuser = await User.getUserById(idapp, id); - allData.precDataUser = await getInfoUser(idapp, allData.myuser.username); + if (!!allData.myuser) + allData.precDataUser = await getInfoUser(idapp, allData.myuser.username); + else + allData.precDataUser = null; // allData.useraportador = await ListaIngresso.getUserByInvitante_Username(idapp, allData.myuser.aportador_solidario); // allData.precDataAportador = await getInfoUser(idapp, allData.myuser.aportador_solidario); } @@ -404,9 +421,42 @@ router.patch('/chval', authenticate, async (req, res) => { if (!rec) { return res.status(404).send(); } else { + let addmsg = ''; + + if (mydata.table === 'navi' && ('made_gift' in fieldsvalue)) { + if (fieldsvalue['made_gift'] && !rec.received_gift) { + if (mydata.tipomsg) { + + let mypos = { + idapp, + riga: rec.riga, + col: rec.col, + numup: 3 + }; + tools.getRigaColByPosUp(mypos); + + const myuser = await User.findByIndOrder(idapp, rec.ind_order); + if (!!myuser) { + const mydatamsg = { + tipomsg: tools.TipoMsg.SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE, + navemediatore: { riga: mypos.riga, col: mypos.col }, + }; + const rismsg = await telegrambot.getMsgByTipoMsg(mydatamsg, myuser.lang, myuser, false); + addmsg = rismsg.body; + } + } + + await mytable.findByIdAndUpdate(id, { $set: { received_gift: true } }); + } + } + + // SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE + if (mydata.notifBot) { // Send Notification to the BOT await telegrambot.sendMsgTelegram(idapp, mydata.notifBot.un, mydata.notifBot.txt); + if (!!addmsg) + await telegrambot.sendMsgTelegram(idapp, mydata.notifBot.un, addmsg); addtext = '[Msg Inviato a ' + mydata.notifBot.un + ']:' + '\n' + mydata.notifBot.txt; telegrambot.sendMsgTelegramToTheManagers(idapp, addtext, true); } @@ -417,6 +467,12 @@ router.patch('/chval', authenticate, async (req, res) => { } } + if (mydata.table === 'flotte') { + if (('date_start' in fieldsvalue) || ('date_close' in fieldsvalue)) { + await NavePersistente.changeField(idapp, rec, fieldsvalue); + } + } + if (mydata.table === 'users') { if ('aportador_solidario' in fieldsvalue) { ind_order_ingr = mydata.ind_order_ingr; @@ -446,7 +502,13 @@ router.patch('/chval', authenticate, async (req, res) => { return false; } } else if ('deleted' in fieldsvalue) { - await telegrambot.sendMsgTelegramToTheManagers(idapp, `L\'utente ${rec.name} ${rec.surname} (${rec.username}) è stato cancellato (nascosto) da ${req.user.name} ${req.user.surname}`); + let msg = ''; + if (fieldsvalue.deleted) + msg = 'cancellato (nascosto)'; + else + msg = 'Ripristinato'; + + await telegrambot.sendMsgTelegramToTheManagers(idapp, `L\'utente ${rec.name} ${rec.surname} (${rec.username}) è stato ${msg} da ${req.user.name} ${req.user.surname}`); } } @@ -475,6 +537,13 @@ router.patch('/chval', authenticate, async (req, res) => { // return false; } } + if ('note' in fieldsvalue) { + // Aggiornalo anche in Graduatorie + await Graduatoria.findOneAndUpdate({ + idapp, + idListaIngresso: id + }, { $set: { note: fieldsvalue.note } }, { new: false }) + } } if (tools.ModificheConsentite(mydata.table, fieldsvalue)) { @@ -496,7 +565,10 @@ router.patch('/chval', authenticate, async (req, res) => { } else if (mydata.table === 'navi') { if ('made_gift' in fieldsvalue) { if (!!fieldsvalue.riga) { - await Nave.ricalcolaNave(idapp, null, fieldsvalue.riga, fieldsvalue.col, true, index) + const navepers = await Nave.ricalcolaNave(idapp, null, fieldsvalue.riga, fieldsvalue.col, true, index); + + if (!!navepers) + await NavePersistente.aggiornaFlottaByNavePersistente(idapp, navepers); } } } @@ -539,8 +611,29 @@ router.patch('/askfunz', authenticate, async (req, res) => { if (!!userfree) return res.send({ code: server_constants.RIS_CODE_OK, out: userfree }); + /*} else if (mydata.myfunc === shared_consts.CallFunz.GET_VALBYTABLE) { + const mytable = getTableByTableName(mydata.table); + const coltoshow = { + [mydata.coltoshow]: 1 + }; + + const ris = await mytable.findOne({ _id: id }, coltoshow); + + return ris; + } else if (mydata.myfunc === shared_consts.CallFunz.SET_VALBYTABLE) { + const mytable = getTableByTableName(mydata.table); + const value = mydata.value; + const coltoset = { + [mydata.coltoshow]: value + }; + + const ris = await mytable.findOneAndUpdate({ _id: id }, { $set: coltoset }, { new: false }); + if (!!ris) + return res.send({ code: server_constants.RIS_CODE_OK });*/ } + return res.send({ code: server_constants.RIS_CODE_ERR }); + }); router.patch('/callfunz', authenticate, async (req, res) => { @@ -586,10 +679,11 @@ router.patch('/callfunz', authenticate, async (req, res) => { if (!!myusernuovo) { if (!mydata.data.AddImbarco && !!mianavedasost && mianavedasost.ind_order > 0) { - // Controlla prima se è in una Nave Temporanea, allora lo elimina dalla PRIMA Nave Temporanea + // Controlla prima se è in una Nave Temporanea, allora lo elimina dall'ultima Nave Temporanea miaarrnavi = await Nave.getArrPosizioniByUsername(idapp, username); if (miaarrnavi) { + miaarrnavi = miaarrnavi.reverse(); // parto dall'ultima for (const mianave of miaarrnavi) { let persistente = await NavePersistente.findByRigaColByDonatore(idapp, mianave.riga, mianave.col, 0); if (persistente.provvisoria) { @@ -629,7 +723,7 @@ router.patch('/callfunz', authenticate, async (req, res) => { const risdel = await ListaIngresso.deleteOne({ _id: olduseringresso.id }); if (!!risdel) { - await actions.doOtherThingsAfterDeleted('listaingressos', myrecuser, false) + await actions.doOtherThingsAfterDeleted('listaingressos', myrecuser, false, req) } } } @@ -651,6 +745,28 @@ router.patch('/callfunz', authenticate, async (req, res) => { await telegrambot.sendMsgTelegramToTheManagers(idapp, `L\'utente ${myuservecchio.name} ${myuservecchio.surname} (${myuservecchio.username}) è stato cancellato (nascosto) perchè sostituito (da ${req.user.name} ${req.user.surname} )`); } } + + if (mydata.data.notifBot) { + + const mydatamsg = { + tipomsg: tools.TipoMsg.SEND_MSG_A_UTENTE_SOSTITUITO, + navemediatore: { riga: navepersistente.riga, col: navepersistente.col }, + }; + + mydatamsg.flotta = await Flotta.getFlottaByNavePersistente(idapp, navepersistente); + + const rismsg = await telegrambot.getMsgByTipoMsg(mydatamsg, myuservecchio.lang, myuservecchio, false); + + if (!!rismsg) { + let messaggio = rismsg.body; + mytitle = rismsg.title; + if (!!messaggio) { + await telegrambot.sendMsgTelegram(idapp, myusernuovo.username, messaggio); + } + } + } + + } @@ -681,7 +797,6 @@ router.patch('/callfunz', authenticate, async (req, res) => { }, { $set: { ind_order: -1 } }, { new: false }); - // Aggiorna la Nave con il Nuovo fieldsvalue = { ind_order @@ -695,31 +810,50 @@ router.patch('/callfunz', authenticate, async (req, res) => { if (!rec) { return res.status(404).send(); } else { - // Send Notification to the BOT - let messaggio = tools.get__('SPOSTATO', req.user.lang); - if (!!navepersistente.date_start) { - messaggio += tools.ACAPO + tools.get__('DATA_PART_NAVE', req.user.lang) + tools.getstrDateLong(navepersistente.date_gift_chat_open) + tools.ACAPO; - } - if (!!navepersistente.link_chat) { - messaggio += tools.ACAPO + '👉🏻👉🏻 ' + tools.get__('ENTRA_GIFT_CHAT', req.user.lang) + ' ' + tools.ACAPO; - } + const mydatamsg = { + tipomsg: tools.TipoMsg.SEND_MSG_EFFETTUA_IL_DONO, + navemediatore: { riga: navepersistente.riga, col: navepersistente.col }, + }; - const myplacca = await Nave.getNavePos(idapp, navepersistente.riga, navepersistente.col); - messaggio += tools.ACAPO + myplacca; + mydatamsg.flotta = await Flotta.getFlottaByNavePersistente(idapp, navepersistente); - const mymsg = mydata.notifBot.txt + ' ' + myusernuovo.name + ' ' + myusernuovo.surname + ' [da ' + dachi + ']' + tools.ACAPO + 'Inviato messaggio: ' + messaggio; + const rismsg = await telegrambot.getMsgByTipoMsg(mydatamsg, myusernuovo.lang, myusernuovo, false); - if (mydata.data.notifBot && !!navepersistente.link_chat) { + let messaggio = rismsg.body; + mytitle = rismsg.title; + + // const myplacca = await Nave.getNavePos(idapp, navepersistente.riga, navepersistente.col); + // messaggio += tools.ACAPO + myplacca; + + let testostaff = ''; + if (mydata.notifBot) + testostaff = mydata.notifBot.txt; + + const mymsg = testostaff + ' ' + myusernuovo.name + ' ' + myusernuovo.surname + ' [da ' + dachi + ']' + tools.ACAPO + 'Inviato messaggio: ' + messaggio; + + if (mydata.data.notifBot) { await telegrambot.sendMsgTelegram(idapp, myusernuovo.username, messaggio); - await telegrambot.sendMsgTelegramToTheManagers(idapp, mymsg); - await telegrambot.sendMsgTelegram(idapp, req.user.username, mydata.notifBot.txt); - await telegrambot.sendMsgTelegram(idapp, req.user.username, myplacca); + if (mydata.data.inviaemail) { + await sendemail.sendEmail_ByText(myusernuovo.lang, myusernuovo.email, myusernuovo, idapp, { + emailbody: messaggio, + emailtitle: mytitle + }); + } + + await telegrambot.sendMsgTelegramToTheManagers(idapp, testostaff); + await telegrambot.sendMsgTelegram(idapp, req.user.username, testostaff); + // await telegrambot.sendMsgTelegram(idapp, req.user.username, myplacca); + } else { + tools.writeManagersLog(mymsg); } - tools.writeManagersLog(mymsg); + const msgsost = '[NAVE ' + navepersistente.riga + '.' + navepersistente.col + '] Sostituito ' + myuservecchio.username + ' (' + myuservecchio.name + ' ' + myuservecchio.surname + ') ' + ' con -> ' + myusernuovo.username + ' (' + myusernuovo.name + ' ' + myusernuovo.surname + ') ' + ' [da ' + dachi + ']'; + tools.writeSostituzioniLog(msgsost); + tools.writeFlottaLog(idapp, msgsost, mydatamsg.flotta.riga, mydatamsg.flotta.col_prima); + await telegrambot.sendMsgTelegramToTheManagers(idapp, msgsost); // const nomecognomeprima = myuser.name + ' ' + myuser.surname + '(' + myuser.username + ')'; // const nomecognomenuovo = await User.getNameSurnameByUsername(idapp,); @@ -728,7 +862,7 @@ router.patch('/callfunz', authenticate, async (req, res) => { } }).catch((e) => { - tools.mylogserr('Error patch USER: ', e); + tools.mylogserr('Error patch USER: ', e.message); res.status(400).send(); }) } @@ -759,15 +893,28 @@ router.patch('/callfunz', authenticate, async (req, res) => { const myrec = await ListaIngresso.getIngrEUserByFilter(idapp, { idapp, _id: ObjectID(mydata.data.id) }); if (!!myrec) { - const risdel = await ListaIngresso.deleteOne({ _id: mydata.data.id }); + const myingr = await ListaIngresso.find({ _id: mydata.data.id }); + // Controlla se ci sono 2 navi + const arrnavi = await Nave.find({ idapp, ind_order: mydata.ind_order }); - if (!!risdel) { - return await actions.doOtherThingsAfterDeleted('listaingressos', myrec, false) + let risdel = false; + if (arrnavi.length === 1) { + // Solo 1 nave da cancellare, quindi cancello anche l'ingresso + risdel = await ListaIngresso.deleteOne({ _id: mydata.data.id }); + } else { + // non cancellare la listaingresso (perchè con lo stesso ind_order ho piu navi ! + risdel = true + } + + if (risdel) { + return await actions.doOtherThingsAfterDeleted('listaingressos', myrec, false, req) .then((ris) => { - if (!!ris) - // tools.mylog('DELETED Others things ...'); + if (!!ris) { + + // tools.mylog('DELETED Others things ...'); return res.send({ code: server_constants.RIS_CODE_OK, msg: '' }); + } }); } } @@ -871,7 +1018,7 @@ router.delete('/delrec/:table/:id', authenticate, async (req, res) => { if (cancellato) { // Do extra things after deleted - return actions.doOtherThingsAfterDeleted(tablename, myrec, notifBot); + return actions.doOtherThingsAfterDeleted(tablename, myrec, notifBot, req); } res.send({ code: server_constants.RIS_CODE_ERR, msg: '' }); diff --git a/src/server/router/users_router.js b/src/server/router/users_router.js index 7a38db5..a0dae7a 100755 --- a/src/server/router/users_router.js +++ b/src/server/router/users_router.js @@ -3,6 +3,7 @@ const router = express.Router(); const { User } = require('../models/user'); const { Nave } = require('../models/nave'); +const { Flotta } = require('../models/flotta'); const { NavePersistente } = require('../models/navepersistente'); const { ListaIngresso } = require('../models/listaingresso'); const { Graduatoria } = require('../models/graduatoria'); @@ -135,7 +136,10 @@ router.post('/', async (req, res) => { user.profile.saw_and_accepted = recorig.profile.saw_and_accepted; user.profile.my_dream = recorig.profile.my_dream; user.profile.email_paypal = recorig.profile.email_paypal; + user.profile.link_payment = recorig.profile.link_payment; + user.profile.note_payment = recorig.profile.note_payment; user.profile.paymenttypes = recorig.profile.paymenttypes; + user.profile.qualified = recorig.profile.qualified; let msgseconda = '!!! REGISTRATA '; if (numero === '2') msgseconda += 'SECONDA'; @@ -312,6 +316,13 @@ router.post('/login', (req, res) => { tools.mylogshow(msg); // telegrambot.sendMsgTelegramToTheManagers(body.idapp, msg); res.status(404).send({ code: server_constants.RIS_CODE_LOGIN_ERR }); + } else if (!!user.subaccount && user.subaccount) { + await tools.snooze(1000); + // const msg = "Tentativo di Login ERRATO [" + body.username + ' , ' + body.password + ']\n' + '[IP: ' + tools.getiPAddressUser(req) + ']'; + // tools.mylogshow(msg); + // telegrambot.sendMsgTelegramToTheManagers(body.idapp, msg); + res.status(404).send({ code: server_constants.RIS_CODE_LOGIN_ERR_SUBACCOUNT }); + return null; } return user }) @@ -364,7 +375,7 @@ router.post('/login', (req, res) => { } }) .catch((e) => { - tools.mylog("ERRORE IN LOGIN: " + e); + tools.mylog("ERRORE IN LOGIN: " + e.message); if (!resalreadysent) res.status(400).send({ code: server_constants.RIS_CODE_LOGIN_ERR_GENERIC }); }); @@ -411,16 +422,7 @@ async function eseguiDbOp(idapp, mydata, locale) { try { if (mydata.dbop === 'rigeneraTutto') { - - mydata.dbop = 'delNaviProvvisorie'; - await eseguiDbOp(idapp, mydata, locale); - - mydata.dbop = 'GeneraGraduatoria'; - await eseguiDbOp(idapp, mydata, locale); - - mydata.dbop = 'creaNavi'; - ris = await eseguiDbOp(idapp, mydata, locale); - + await ListaIngresso.Esegui_CronTab(idapp, mydata); } else if (mydata.dbop === 'creaNavi') { const num = await Nave.generaNave(idapp, mydata, false); ris = { num }; @@ -439,36 +441,8 @@ async function eseguiDbOp(idapp, mydata, locale) { // ris = { num }; } else if (mydata.dbop === 'delNaviProvvisorie') { - let num = 0; + ris = await Nave.delNaviProvvisorie(idapp); - const arrnavi = await Nave.find({ idapp }); - - for (const nave of arrnavi) { - let persistente = await NavePersistente.findByRigaColByDonatore(idapp, nave.riga, nave.col, 0); - if (!!persistente) { - if (persistente.provvisoria) { - let ris = await Nave.deleteOne({ _id: nave._id }); - if (!!ris) { - num++; - } - } - } - } - - // Pulisci gli added se era stato cancellato dalla nave - await Nave.pulisciNonPresenzeInNave(idapp); - - const data = await Nave.getLastRigaCol(idapp); - await Nave.setRiga(idapp, data.riga); - await Nave.setCol(idapp, data.col + 1); - - const maxcol = tools.getmaxcol(data.riga); - if (data.col === maxcol) { - await Nave.setRiga(idapp, data.riga + 1); - await Nave.setCol(idapp, 1); - } - - ris = { num }; } else if (mydata.dbop === 'visuListaNave') { mystr = await Nave.showListaOrd(idapp); ris = { mystr }; @@ -494,6 +468,14 @@ async function eseguiDbOp(idapp, mydata, locale) { ris = { mystr }; } else if (mydata.dbop === 'visuNaviUtentiEliminati') { ris = await Nave.visuNaviUtentiEliminati(idapp); + } else if (mydata.dbop === 'convSubAccount') { + ris = await User.convSubAccount(idapp); + } else if (mydata.dbop === 'flagUtentiNaviNonPresenti') { + ris = await User.flagUtentiNaviNonPresenti(idapp); + } else if (mydata.dbop === 'generaFlotte') { + ris = await NavePersistente.generaFlotte(idapp); + } else if (mydata.dbop === 'addNavePerUtentiNaviNonPresenti') { + ris = await User.addNavePerUtentiNaviNonPresenti(idapp); } else if (mydata.dbop === 'creaTessituraeConv') { ris = await ListaIngresso.creaTessituraeConv(idapp); ris = { mystr }; @@ -506,6 +488,7 @@ async function eseguiDbOp(idapp, mydata, locale) { } else if (mydata.dbop === 'convNaviTessinListaIngressoRec') { let num = 0; + const arrnavitess = await Nave.find({ idapp, num_tess: { $gte: 3 } }); for (const recnave of arrnavitess) { @@ -699,7 +682,7 @@ async function eseguiDbOp(idapp, mydata, locale) { } else if (mydata.dbop === 'visuPlacca') { mystr = '✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n' + - 'ECCO LE NUOVE NAVI DEFINITIVE CHE APRONO DOMANI LA GIFT CHAT !!! DALLA ' + mydata.riga + '.' + mydata.col + ' ALLA ' + mydata.riga + '.' + (parseInt(mydata.col) + 7) + '\n' + + 'NAVI CHE SALPANO DALLA ' + mydata.riga + '.' + mydata.col + ' ALLA ' + mydata.riga + '.' + (parseInt(mydata.col) + 7) + '\n' + 'AUGURI ALLA NUOVA SOGNATRICE !!!\n' + '✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨'; diff --git a/src/server/sendemail.js b/src/server/sendemail.js index 8c4d86c..209d64b 100755 --- a/src/server/sendemail.js +++ b/src/server/sendemail.js @@ -306,6 +306,33 @@ module.exports = { // Send Email also to the Admin // this.sendEmail_base('admin/sendmsg/' + lang, tools.getAdminEmailByIdApp(idapp), mylocalsconf); }, + + sendEmail_ByText: async function (lang, emailto, user, idapp, rec) { + + tools.mylog('sendEmail_ByText'); + + mylocalsconf = { + idapp, + dataemail: await this.getdataemail(idapp), + locale: lang, + nomeapp: tools.getNomeAppByIdApp(idapp), + name: user.name, + surname: user.surname, + usernameorig: user.name + ' ' + user.surname, + emailto: emailto, + }; + + mylocalsconf.dataemail.emailbody = rec.emailbody; + mylocalsconf.dataemail.emailtitle = rec.emailtitle; + + const replyto = tools.getreplyToEmailByIdApp(idapp); + + return this.sendEmail_base('standard', emailto, mylocalsconf, replyto); + + // Send Email also to the Admin + // this.sendEmail_base('admin/sendmsg/' + lang, tools.getAdminEmailByIdApp(idapp), mylocalsconf); + }, + Add_to_MailingList_AndSendEmailNotify: async function (lang, user, idapp, sendnews) { // console.log('idapp', idapp, tools.getNomeAppByIdApp(idapp)); diff --git a/src/server/server.js b/src/server/server.js index 32c235c..10b81d0 100755 --- a/src/server/server.js +++ b/src/server/server.js @@ -62,6 +62,9 @@ const users_router = require('./router/users_router'); const site_router = require('./router/site_router'); const admin_router = require('./router/admin_router'); + +const { ListaIngresso } = require('./models/listaingresso'); + const { MyEvent } = require('./models/myevent'); const telegrambot = require('./telegram/telegrambot'); @@ -256,10 +259,12 @@ function mycron() { async function mycron_30min() { for (const app of MYAPPS) { - const enablecrontab = await Settings.getValDbSettings(app.idapp, tools.ENABLE_CRONTAB, false); + let enablecrontab = false; + + enablecrontab = await Settings.getValDbSettings(app.idapp, tools.ENABLE_CRONTAB, false); if (enablecrontab) { - ListaIngresso.Esegui_CronTab(app.idapp); + ListaIngresso.Esegui_CronTab(app.idapp, {}); } } } @@ -293,12 +298,18 @@ cron.schedule('*/2 * * * *', () => { mycron(); }); + // Cron every X minutes -cron.schedule('*/30 * * * *', async () => { +cron.schedule('*/60 * * * *', async () => { mycron_30min(); }); +// mycron_30min(); + +// tools.writelogfile('test', 'prova.txt'); + + async function resetProcessingJob() { arrrec = await Newstosent.find({}); diff --git a/src/server/telegram/telegrambot.js b/src/server/telegram/telegrambot.js index faedaba..c196e75 100755 --- a/src/server/telegram/telegrambot.js +++ b/src/server/telegram/telegrambot.js @@ -12,10 +12,16 @@ const { CalZoom } = require('../models/calzoom'); const { Nave } = require('../models/nave'); const shared_consts = require('../tools/shared_nodejs'); +const { ListaIngresso } = require('../models/listaingresso'); +const { MsgTemplate } = require('../models/msg_template'); + const emoji = require('node-emoji'); + const i18n = require("i18n"); +let url = process.env.URL || 'https://'; + const Benvenuto = emoji.get('heartbeat') + emoji.get('heartbeat') + emoji.get('heartbeat') + ' Benvenuto!'; const emo = { @@ -151,8 +157,10 @@ const Menu = { MSG_TO_NAVE: emoji.get('incoming_envelope') + 'Msg_to_Navi', MSG_NO_7_REQ: emoji.get('incoming_envelope') + 'No 7 Req.', MSG_NO_9_REQ: emoji.get('incoming_envelope') + 'No 9 Req', + NESSUN_IMBARCO_7REQ: emoji.get('incoming_envelope') + 'No Imbarco (7 Req)', MSG_SI_INVITATI_NO_7REQ_INVITATI: emoji.get('incoming_envelope') + 'Inv e NO 7 Req', MSGSTAFF: emoji.get('incoming_envelope') + ' Invia a STAFF', + MSGPAOLO: emoji.get('incoming_envelope') + ' Invia a PAOLO', MSGATUTTI: emoji.get('incoming_envelope') + ' Invia a TUTTI', it: { ACCEDI: emo.PERSON + ' Accedi', @@ -231,8 +239,15 @@ const Menu = { const CONTA_SOLO = 'contasolo'; const RICEVI_EMAIL = 'riceviemail'; +const NOME_COGNOME = 'nomecognome'; +const CHEDI_SE_IMBARCARTI = 'chiedi_se_imbarcarti'; -const SendMsgCmd = [CONTA_SOLO, RICEVI_EMAIL]; +const InlineCmd = { + VOGLIO_IMBARCARMI: 'voglio_imbarcarmi', + NON_VOGLIO_IMBARCARMI: 'non_voglio_imbarcarmi' +}; + +const SendMsgCmd = [CONTA_SOLO, RICEVI_EMAIL, NOME_COGNOME, CHEDI_SE_IMBARCARTI]; const MenuNoLogin = { @@ -276,11 +291,11 @@ const MenuYesNo = { }; const MenuAdmin = { - it: { menu: [[Menu.MSGSTAFF, Menu.MSGATUTTI, Menu.it.INDIETRO], [Menu.MSG_NO_7_REQ, Menu.MSG_NO_9_REQ], [Menu.MSG_TO_NAVE, Menu.MSG_SI_INVITATI_NO_7REQ_INVITATI]] }, + it: { menu: [[Menu.MSGSTAFF, Menu.MSGATUTTI, Menu.it.INDIETRO], [Menu.MSG_NO_7_REQ, Menu.MSG_NO_9_REQ, Menu.NESSUN_IMBARCO_7REQ], [Menu.MSGPAOLO, Menu.MSG_TO_NAVE, Menu.MSG_SI_INVITATI_NO_7REQ_INVITATI]] }, }; const MenuSend = { - it: { menu: [[CONTA_SOLO, RICEVI_EMAIL], [Menu.it.INDIETRO]] }, + it: { menu: [[CONTA_SOLO, RICEVI_EMAIL, NOME_COGNOME], [CHEDI_SE_IMBARCARTI, Menu.it.INDIETRO]] }, }; const MenuChat = { @@ -298,6 +313,7 @@ const Sex = { }; const Status = { + EXIT: -5, NONE: 0, VERIFIED: 1, WAITFOR_USERNAME_BO: 102, @@ -313,6 +329,8 @@ const Destin = { SI_INVITATI_NO_7REQ_INVITATI: 5, A_UTENTE: 6, MSG_TO_NAVE: 7, + NESSUN_IMBARCO_7REQ: 8, + PAOLO: 9, }; const StatusMSGALL = { @@ -446,7 +464,7 @@ const TelegramBot = require('node-telegram-bot-api'); module.exports = { - ADMIN_IDTELEGRAM_SERVER: '12429864', + ADMIN_IDTELEGRAM_SERVER: '12429864', //Paolo ADMIN_USER_SERVER: 'paoloar77', ADMIN_USER_NAME_SERVER: 'Paolo', @@ -509,105 +527,239 @@ module.exports = { }, - getMsgByTipoMsg: function (mydata, lang, user, sonosognatore) { + getMsgByTipoMsg: async function (mydata, lang, user, sonosognatore) { if (!!mydata.msgextra) { - return mydata.msgextra; + return { body: mydata.msgextra, title: ''} ; } + let title = ''; + let msg = ''; + if (mydata.tipomsg === tools.TipoMsg.SEND_LINK_CHAT_DONATORI) { if (sonosognatore) - return printf(tools.gettranslate('SEND_LINK_CHAT_SOGNATORE', lang), user.name, mydata.navemediatore.riga + '.' + mydata.navemediatore.col, mydata.msgpar1); + msg = printf(tools.gettranslate('SEND_LINK_CHAT_SOGNATORE', lang), user.name, mydata.navemediatore.riga + '.' + mydata.navemediatore.col, mydata.msgpar1); else - return printf(tools.gettranslate('SEND_LINK_CHAT_DONATORI', lang), user.name, mydata.navemediatore.riga + '.' + mydata.navemediatore.col, mydata.msgpar1); + msg = printf(tools.gettranslate('SEND_LINK_CHAT_DONATORI', lang), user.name, mydata.navemediatore.riga + '.' + mydata.navemediatore.col, mydata.msgpar1); } else if (mydata.tipomsg === tools.TipoMsg.SEND_MSG || mydata.tipomsg === tools.TipoMsg.SEND_MSG_SINGOLO) { - let mymsg = ''; if (!!mydata.username_mitt) { - mymsg = '[' + tools.gettranslate('MSG_SEND_FROM', lang) + ' ' + mydata.username_mitt + ']:' + tools.ACAPO; + msg = '[' + tools.gettranslate('MSG_SEND_FROM', lang) + ' ' + mydata.username_mitt + ']:' + tools.ACAPO; } - mymsg += mydata.msgpar1; - return mymsg; + msg += mydata.msgpar1; + } else if (mydata.tipomsg >= 1000) { + const ris = await MsgTemplate.getMsgByLang(user.idapp, mydata.tipomsg, lang); + msg = ris.body; + title = ris.title; } + if (!!user) { + msg = msg.replace('{username}', user.username); + msg = msg.replace('{name}', user.name); + msg = msg.replace('{surname}', user.surname); + if (!!user.profile.link_payment) + msg = msg.replace('{link_paypalme}', user.profile.link_payment); + if (!!user.profile.email_paypal) + msg = msg.replace('{email_paypal}', user.profile.email_paypal); + if (!!user.profile.note_payment) + msg = msg.replace('{note_payment}', user.profile.note_payment); + } + + if (!!mydata.flotta) { + // SOSTITUISCI LE PAROLE CHIAVI + if (!!mydata.flotta.date_start) + msg = msg.replace('{date_start}', tools.getstrDateLong(new Date(mydata.flotta.date_start), user.lang)); + if (!!mydata.flotta.date_close) + msg = msg.replace('{date_close}', tools.getstrDateLong(new Date(mydata.flotta.date_close), user.lang)); + if (!!mydata.flotta.link_superchat) + msg = msg.replace('{link_superchat}', mydata.flotta.link_superchat); + if (!!mydata.flotta.tutor1) + msg = msg.replace('{tutor1}', mydata.flotta.tutor1); + if (!!mydata.flotta.tutor2) + msg = msg.replace('{tutor2}', mydata.flotta.tutor2); + if (!!mydata.flotta.tutor3) + msg = msg.replace('{tutor3}', mydata.flotta.tutor3); + if (!!mydata.flotta.tutorslo) + msg = msg.replace('{tutorslo}', mydata.flotta.tutorslo); + if (!!mydata.flotta.sognatore_nomecognome) + msg = msg.replace('{sognatore}', mydata.flotta.sognatore_nomecognome); + } + + return { body: msg, title }; }, sendMsgTelegramToNave: async function (idapp, mydata) { + let nummsgtosend = 0; let nummsgsent = 0; let strout = ''; + let flotta = mydata.flotta; + + const sendemail = require('../sendemail'); try { - const arrnavi = await Nave.getusersByNave(idapp, mydata.navemediatore); + let arrnavi = null; + if (flotta) { + arrnavi = await Nave.getusersByFlotta(idapp, flotta.riga, flotta.col_prima, flotta.col_ultima); + + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_A_SOGNATORE) { + arrnavi = await User.find({ idapp, username: flotta.sognatore }); + } + } else { + arrnavi = await Nave.getusersByNave(idapp, mydata.navemediatore); + } + // console.log('usersmanagers', usersmanagers); + let mymsg = ""; + let mymsgprimo = ""; + + tipomsgorig = mydata.tipomsg; + if (arrnavi) { - tools.writeManagersLog('sendMsgTelegramToNave', mydata.navemediatore.riga + '.' + mydata.navemediatore.col); + if (!flotta) + tools.writeManagersLog('sendMsgTelegramToNave', mydata.navemediatore.riga + '.' + mydata.navemediatore.col); + let index = 1; + + if (mydata.inviareale) { + let mystrmsg = tools.getStrMsgByTipoMsg(tipomsgorig); + if (!!mystrmsg) { + tools.writeFlottaLog(idapp, mystrmsg, flotta.riga, flotta.col_prima); + } + } + for (const nave of arrnavi) { - const user = await User.findByIndOrder(idapp, nave.ind_order); + + mydata.tipomsg = tipomsgorig; + + let user = null; + + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_A_SOGNATORE) { + user = nave; + } else { + user = await User.findByIndOrder(idapp, nave.ind_order); + + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_SOLLECITO_DONATORI_NO_DONO) { + // Solo a quelli che non hanno fatto il dono + if (nave.made_gift) + user = null; + } + + if ((nave.num_tess % 2) === 0) { + // MEDIATORE ! + // Se l'ultimo Donatore è un Mediatore, allora NON GLI MANDO IL MESSAGGIO ! + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_EFFETTUA_IL_DONO) { + user = null; + } + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_SOLLECITO_DONATORI_NO_DONO) { + user = null; + } + } else { + // DONATORE + + if (mydata.tipomsg === tools.TipoMsg.SEND_MSG_A_MEDIATORI) { + user = null; // Se sto mandando msg a Mediatore, allora questo no! + } + } + } + + //mydata.tipomsg = tools.TipoMsg.SEND_MSG_A_MEDIATORI; if (!!user) { const lang = user.lang; const idteleg = user.profile.teleg_id; - const mymsg = this.getMsgByTipoMsg(mydata, lang, user, false); + mydata.nave = nave; + const rismsg = await this.getMsgByTipoMsg(mydata, lang, user, false); + + mymsg = rismsg.body; + mytitle = rismsg.title; + + if (mymsgprimo === '') { + mymsgprimo = mymsg; + } if (!!idteleg) { - strout += '\n' + user.name + ' ' + user.surname + ':'; + strout += '\n (' + index + ') ' + user.name + ' ' + user.surname + ':'; if (mydata.inviareale) { await this.sendMsgTelegramByIdTelegram(idapp, idteleg, mymsg, undefined, undefined, true); await tools.snooze(300); - strout += ' -> MSG INVIATO'; + strout += ' -> (MSG OK)'; + + if (mydata.inviaemail && !!user.email) { + // user.email = 'paolo.arena77@gmail.com'; + await sendemail.sendEmail_ByText(user.lang, user.email, user, idapp, {emailbody: mymsg, emailtitle: mytitle}); + strout += ' -> (EMAIL OK)'; + } + + nummsgsent++; } else { - strout += ' (Pronto da Inviare)'; - } - nummsgsent++; - } - if ((nummsgsent === 1) && (mydata.inviareale)) { - try { - await this.sendMsgTelegramToTheManagers(idapp, 'Inviato messaggio a tutti i Donatori della Nave ' + mydata.navemediatore.riga + '.' + mydata.navemediatore.col + '\n' + mymsg) - } catch (e) { - + strout += ' (Ok)'; + nummsgtosend++; } } } + index++; } + } - if (mydata.tipomsg === tools.TipoMsg.SEND_LINK_CHAT_DONATORI) { + if (!mydata.inviareale) { + await this.sendMsgTelegramToTheManagers(idapp, 'TEST INVIO MESSAGGIO:\n' + mymsgprimo + '\n\n(Messaggi da Inviare: ' + nummsgtosend + ')'); + } - const usersognatore = await Nave.getSognatoreByRigaColMediatore(idapp, mydata.navemediatore); - - console.log('Sognatore: ', usersognatore.username); - - if (!!usersognatore) { - const lang = usersognatore.lang; - const idteleg = usersognatore.profile.teleg_id; - const mymsg = this.getMsgByTipoMsg(mydata, lang, usersognatore, true); - - // Invia Msg al Sognatore ! - if (mydata.inviareale) { - await this.sendMsgTelegramByIdTelegram(idapp, idteleg, mymsg, undefined, undefined, true); - await tools.snooze(300); - nummsgsent++; - strout += '\n' + usersognatore.name + ' ' + usersognatore.surname + ':'; - strout += ' -> MSG INVIATO'; - } else { - strout += ' (Pronto da Inviare)'; - } + if ((nummsgsent > 1) && (mydata.inviareale)) { + try { + let msg = ''; + if (!!flotta) { + msg = 'Inviato messaggio a tutta la FLOTTA DA ' + flotta.riga + '.' + flotta.col_prima + ' A ' + flotta.riga + '.' + flotta.col_ultima + ' \n' + mymsg; + } else { + msg = 'Inviato messaggio a tutti i Donatori della Nave ' + mydata.navemediatore.riga + '.' + mydata.navemediatore.col + '\n' + mymsg; } + await this.sendMsgTelegramToTheManagers(idapp, msg) + } catch (e) { } + } - if (nummsgsent > 0) { - if (mydata.tipomsg === tools.TipoMsg.SEND_LINK_CHAT_DONATORI) { - const fields_to_update = { - sent_msg_howto_make_gift: true - }; - await Nave.findOneAndUpdate({ _id: mydata.navemediatore.id }, { $set: fields_to_update }, { new: false }); + /* + if (mydata.tipomsg === tools.TipoMsg.SEND_LINK_CHAT_DONATORI) { + + + const usersognatore = await Nave.getSognatoreByRigaColMediatore(idapp, mydata.navemediatore); + + console.log('Sognatore: ', usersognatore.username); + + if (!!usersognatore) { + const lang = usersognatore.lang; + const idteleg = usersognatore.profile.teleg_id; + const mymsg = this.getMsgByTipoMsg(mydata, lang, usersognatore, true); + + // Invia Msg al Sognatore ! + if (mydata.inviareale) { + await this.sendMsgTelegramByIdTelegram(idapp, idteleg, mymsg, undefined, undefined, true); + await tools.snooze(300); + nummsgsent++; + strout += '\n' + usersognatore.name + ' ' + usersognatore.surname + ':'; + strout += ' -> MSG INVIATO'; + } else { + strout += ' (Pronto da Inviare)'; } } } + */ + + if (nummsgsent > 0) { + if (mydata.tipomsg === tools.TipoMsg.SEND_LINK_CHAT_DONATORI) { + const fields_to_update = { + sent_msg_howto_make_gift: true + }; + await Nave.findOneAndUpdate({ _id: mydata.navemediatore.id }, { $set: fields_to_update }, { new: false }); + } + } + + return { nummsgsent, strout }; } catch (e) { console.error(e.message); + strout = 'Error: ' + e.message + '\n' + strout; return { nummsgsent, strout }; } }, @@ -1137,10 +1289,14 @@ class Telegram { await this.menumsgAll(msg) } else if (msg.text === Menu.MSGSTAFF) { await this.menumsgStaff(msg) + } else if (msg.text === Menu.MSGPAOLO) { + await this.menumsgPaolo(msg) } else if (msg.text === Menu.MSG_NO_7_REQ) { await this.menumsg_No_7_Req(msg) } else if (msg.text === Menu.MSG_NO_9_REQ) { await this.menumsg_No_9_Req(msg) + } else if (msg.text === Menu.NESSUN_IMBARCO_7REQ) { + await this.menumsgGenerico(msg, Destin.NESSUN_IMBARCO_7REQ); } else if (cmd1 === Menu.MSG_TO_NAVE) { await this.menumsg_to_Nave(msg, cmd2) } else if (msg.text === Menu.MSG_SI_INVITATI_NO_7REQ_INVITATI) { @@ -1460,6 +1616,8 @@ class Telegram { return 'TUTTI'; else if (destin === Destin.STAFF) return 'STAFF'; + else if (destin === Destin.PAOLO) + return 'PAOLO'; else if (destin === Destin.NO_7_REQ) return 'No 7 Requisiti'; else if (destin === Destin.NO_9_REQ) @@ -1468,6 +1626,8 @@ class Telegram { return '2 Invitati ma NO Requisiti'; else if (destin === Destin.MSG_TO_NAVE) return 'Nave ' + rec.extraparam; + else if (destin === Destin.NESSUN_IMBARCO_7REQ) + return 'No Imbarcati (7 Req) '; else if (destin === Destin.A_UTENTE) { const rec = this.getRecInMem(msg); return rec.msgall_username_specifico @@ -1483,6 +1643,10 @@ class Telegram { await this.menumsgGenerico(msg, Destin.STAFF); } + async menumsgPaolo(msg) { + await this.menumsgGenerico(msg, Destin.PAOLO); + } + async menumsg_No_7_Req(msg) { await this.menumsgGenerico(msg, Destin.NO_7_REQ); } @@ -1592,7 +1756,7 @@ class Telegram { } getRecInMem(msg) { - return this.arrUsers.find((rec) => rec.id === msg.from.id); + return this.arrUsers.find((rec) => rec.id === this.getchatid(msg)); } getRecInMemById(id) { @@ -1608,7 +1772,7 @@ class Telegram { } deleteRecInMem(msg) { - this.arrUsers = this.arrUsers.filter((rec) => rec.id !== msg.from.id); + this.arrUsers = this.arrUsers.filter((rec) => rec.id !== this.getchatid(msg)); } async getUser(msg, rec, conmsg) { @@ -1776,7 +1940,15 @@ class Telegram { tools.writeEventsLog(this.getDestinStr(msg, destin, rec) + ':\n' + texttosend); + // let chiedisino = false; + + // TEST usersall = await User.getUsersTelegALL(rec.user.idapp, 'paoloar77'); + for (const utente of usersall) { + + let FormDaMostrare = null; + const lang = utente.lang; + if (!utente.deleted && !utente.sospeso) { if (this.isSelMenu(msg, texttosend === 'LAVAGNA')) { textdainviare = await this.getLavagnaByUser(utente, msg); @@ -1791,12 +1963,16 @@ class Telegram { invia = User.isManager(utente.perm); } else if (destin === Destin.TUTTI) { invia = true; + } else if (destin === Destin.PAOLO) { + invia = utente.username === 'paoloar77'; } else if (destin === Destin.A_UTENTE) { invia = utente.username === rec.msgall_username_specifico; } else if (destin === Destin.NO_7_REQ) { invia = !await User.isUserQualified7(this.idapp, utente.username); } else if (destin === Destin.NO_9_REQ) { invia = !await User.isUserQualified9(this.idapp, utente.username); + } else if (destin === Destin.NESSUN_IMBARCO_7REQ) { + invia = await User.NessunaNavePresenteByUsername(this.idapp, utente.username); } else if (destin === Destin.MSG_TO_NAVE) { invia = !await Nave.findDonatoreByNave(this.idapp, rec.extraparam); } else if (destin === Destin.SI_INVITATI_NO_7REQ_INVITATI) { @@ -1804,21 +1980,56 @@ class Telegram { const numinvitatiattivi = await ListaIngresso.getnumInvitatiAttivi(this.idapp, utente.username); invia = (numinvitati >= 2) && (numinvitatiattivi < 2); } + + // TEST invia = true; + if (invia) { + let inviaveramente = false; + if (cmd === RICEVI_EMAIL) { preparatesto += utente.email + ', '; + } else if (cmd === NOME_COGNOME) { + preparatesto += utente.name + ' ' + utente.surname + '(' + utente.username + ')' + '\n'; } else if (cmd === CONTA_SOLO) { // Niente + } else if (cmd === CHEDI_SE_IMBARCARTI) { + textdainviare = tools.gettranslate('VUOI_IMBARCARTI', lang); + // chiedisino = true; + // rec.msgall_status = StatusMSGALL.CONFIRM; + FormDaMostrare = this.getInlineKeyboard(lang, [ + { text: Menu[lang].SI, callback_data: InlineCmd.VOGLIO_IMBARCARMI }, + { text: Menu[lang].NO, callback_data: InlineCmd.NON_VOGLIO_IMBARCARMI }, + ]); + inviaveramente = true; } else { + inviaveramente = true; + } + + + if (inviaveramente) { if (destin === Destin.A_UTENTE) { await this.sistemaRecDest(rec, msg); await this.sendMsg(utente.profile.teleg_id, '[' + rec.username_bo + ' ti scrive]:\n' + textdainviare, MenuChat); } else { - await this.sendMsg(utente.profile.teleg_id, textdainviare); + + // if (chiedisino) { + // this.ChiediSINO(msg, textdainviare); + // } else { + // TEST + + let telegid = utente.profile.teleg_id; + // if (process.env.PROD === "0") { + // telegid = 12429864; + // } + await this.sendMsg(telegid, textdainviare, null, FormDaMostrare); + + // break; } - await tools.snooze(300) + await tools.snooze(300); + + nummsgsent++; } - nummsgsent++; + if (!SendMsgCmd.includes(cmd)) { if ((nummsgsent % 50) === 0) { @@ -1834,6 +2045,10 @@ class Telegram { let msgris = ""; if (cmd === CONTA_SOLO) { msgris = nummsgsent + ' ' + getstr(this.getlang(msg), 'MSG_MSG_TOSENT'); + } else if (cmd === NOME_COGNOME) { + msgris = nummsgsent + ' ' + 'Utenti'; + await this.sendMsg(msg.chat.id, msgris); + msgris = preparatesto; } else if (cmd === RICEVI_EMAIL) { msgris = nummsgsent + ' ' + 'Email'; await this.sendMsg(msg.chat.id, msgris); @@ -1870,17 +2085,28 @@ class Telegram { || (msg.text === Menu.LANG_FR) || (msg.text === Menu.LANG_SI) || (msg.text === Menu.LANG_PT)) } - async receiveMsg(msg) { + async setInit(msg) { let status = this.getstatusInMemory(msg); if (status === Status.NONE) { await this.start(msg); let status = this.getstatusInMemory(msg); if (status !== Status.VERIFIED) - return + return Status.EXIT; } else { await this.setUser(msg) } + return status; + } + + async receiveMsg(msg) { + + let status = await this.setInit(msg); + + if (status === Status.EXIT) { + return + } + const rec = this.getRecInMem(msg); status = this.getstatus(rec); @@ -1912,6 +2138,8 @@ class Telegram { domanda = 'Confermi di vedere a quante persone arriverebbe questo messaggio, a ' + achi + ' ?\n' + rec.msgtosent; else if (cmd === RICEVI_EMAIL) domanda = 'Confermi di vedere la lista delle email di ' + achi + '?'; + else if (cmd === NOME_COGNOME) + domanda = 'Confermi di vedere la lista di persone ' + achi + '?'; else { if (rec.msgall_achi === Destin.A_UTENTE) domanda = 'Confermi d\'Iniziare una Chat messaggi con ' + achi + ' ?\n' + rec.msgtosent; @@ -1940,7 +2168,8 @@ class Telegram { async askVerifiedCode(msg) { - const rec = this.arrUsers.find((rec) => rec.id === msg.from.id); + const rec = this.getRecInMem(msg); + if (!rec) { await this.addUser(msg); @@ -1954,9 +2183,10 @@ class Telegram { } async setUser(msg) { - const id = msg.from.id; + let id = this.getchatid(msg); + const user = await User.UserByIdTelegram(this.idapp, id); - let rec = this.arrUsers.find((rec) => rec.id === msg.from.id); + let rec = this.getRecInMem(msg); if (user && rec) { rec.user = user; } @@ -1971,12 +2201,19 @@ class Telegram { } + getchatid(msg) { + if (msg.from.is_bot) + return msg.chat.id; + else + return msg.from.id; + } + async alreadyExist(msg) { - const id = msg.from.id; + const id = this.getchatid(msg); let rec = null; try { const user = await User.UserByIdTelegram(this.idapp, id); - let rec = this.arrUsers.find((rec) => rec.id === msg.from.id); + let rec = this.getRecInMem(msg); if (user && !rec) { rec = this.addUser(msg); } @@ -1998,7 +2235,7 @@ class Telegram { const code = 100000 + Math.round(Math.random() * 899999); const rec = { - id: msg.from.id, + id: this.getchatid(msg), code, lang, status: Status.WAITFOR_USERNAME_BO, @@ -2060,7 +2297,7 @@ class Telegram { } - async _inviaMsg(id, text, form, menu, msg_id, chat_id, ripr_menuPrec) { + async _inviaMsg(id, text, form, menu, msg_id, chat_id, ripr_menuPrec, opt) { if (!text) return 0; @@ -2095,6 +2332,12 @@ class Telegram { } try { + + text = text.replace(/
/g, "\n"); + text = text.replace(/
/g, ""); + text = text.replace(/<\/div>/g, "\n"); + text = text.replace(/ /g, " "); + if (!form) { form = { "parse_mode": "HTML", @@ -2169,6 +2412,48 @@ class Telegram { return mymenuout; } + getInlineKeyboard(lang, arrrisp1, arrrisp2, arrrisp3) { + let mykeyb = { + parse_mode: 'HTML', + reply_markup: { + inline_keyboard: [] + } + }; + + // text + // callback_data + + // url + + const arrriga1 = []; + if (!!arrrisp1) { + for (const ris of arrrisp1) { + arrriga1.push(ris); + } + } + const arrriga2 = []; + if (!!arrrisp2) { + for (const ris of arrrisp2) { + arrriga2.push(ris); + } + } + const arrriga3 = []; + if (!!arrrisp3) { + for (const ris of arrrisp3) { + arrriga3.push(ris); + } + } + + if (arrriga1.length > 0) + mykeyb.reply_markup.inline_keyboard.push(arrriga1); + if (arrriga2.length > 0) + mykeyb.reply_markup.inline_keyboard.push(arrriga2); + if (arrriga3.length > 0) + mykeyb.reply_markup.inline_keyboard.push(arrriga3); + + return mykeyb; + } + async ChiediSINO(msg, domanda) { const lang = this.getlang(msg); @@ -2246,6 +2531,15 @@ if (!tools.testing()) { if (!!token) { const bot = new TelegramBot(token, { polling: true }); + if (url === '0') { + const ngrok = require('ngrok'); + ngrok.connect(port, function onConnect(error, u) { + if (error) throw error; + url = u; + console.log(`Game tunneled at ${url}`); + }); + } + arrTelegram.push({ idapp, cl: new Telegram(idapp, bot) }); bot.onText(/\/start/, (msg) => { @@ -2290,10 +2584,52 @@ if (!tools.testing()) { }); // Handle callback queries - bot.on('callback_query', function onCallbackQuery(callbackQuery) { - console.log('callback_query', callbackQuery); + bot.on('callback_query', async (callbackQuery) => { + // console.log('callback_query', callbackQuery); - bot.answerCallbackQuery(callbackQuery.id, { url }); + const myclTelegram = getclTelegBytoken(bot.token); + + const action = callbackQuery.data; + const msg = callbackQuery.message; + const opts = { + chat_id: msg.chat.id, + message_id: msg.message_id, + }; + + const status = await myclTelegram.setInit(msg); + + const rec = myclTelegram.getRecInMem(msg); + if (!!rec) { + if (!!rec.user) { + if (action === InlineCmd.VOGLIO_IMBARCARMI) { + // Controlla se è qualificato! + const mydata = tools.AddDate(rec.user.date_reg, 7); + + const newrecingr = await ListaIngresso.addUserInListaIngresso(rec.user.idapp, rec.user.username, rec.user.aportador_solidario, rec.user.lang, true, true, mydata); + + bot.editMessageText(tools.gettranslate('ADDED_TOLISTAINGRESSO', rec.user.lang), opts); + + } else if (action === InlineCmd.NON_VOGLIO_IMBARCARMI) { + await User.NonVoglioImbarcarmi(rec.user.idapp, rec.user.username); + + const msgadd = '[' + rec.user.username + '] ' + rec.user.name + ' ' + rec.user.surname + ' ha risposto che NON VUOLE IMBARCARSI !'; + + await local_sendMsgTelegramToTheManagers(rec.user.idapp, msgadd, msg, false); // Anche a STAFF + } + } + } + + /* + let text; + + if (action === 'edit') { + text = 'Edited Text'; + } + + bot.editMessageText(text, opts); + */ + + // bot.answerCallbackQuery(callbackQuery.id, { url }); }); } diff --git a/src/server/tools/general.js b/src/server/tools/general.js index 87a2fc4..8652394 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -25,6 +25,7 @@ const webpush = require('web-push'); const FILELOG = 'filelog.txt'; const FILEEVENTS = 'logevents.txt'; const FILEMANAGERS = 'logmanagers.txt'; +const FILESOSTITUZIONI = 'log_sostituzioni.txt'; const FILENAVE = 'logNave.txt'; const subject = process.env.URLBASE_APP1; const publicVapidKey = process.env.PUBLIC_VAPI_KEY; @@ -114,6 +115,7 @@ textlang = { 'TEMPORANEA': 'TEMPORANEA', 'NAVE': 'NAVE', 'MSG_SEND_FROM': 'Msg Inviato da', + 'VUOI_IMBARCARTI': 'Attenzione! Ci risulta che attualmente non ti è stato assegnato Nessun Imbarco.\nQuesto può essere dovuto ad un errore durante la fase di aggiornamento del sito, oppure perchè tu stesso hai cancellato l\'imbarco.\n\nVuoi Aggiungerti ora al prossimo Imbarco per continuare nel tuo Viaggio in AYNI? ', }, si: { "Email je že bila preverjena": "Email je že bila preverjenaL'Email è già stata Verificata", @@ -181,6 +183,7 @@ textlang = { 'TEMPORANEA': 'ZAČASNA', 'NAVE': 'LADJE', 'MSG_SEND_FROM': 'sporočilo, ki ga je poslal', + 'VUOI_IMBARCARTI': 'Pozor! Opazili smo, da ti trenutno ni bila dodeljena Nobena ladjica.\nTo je lahko posledica napake med fazo posodabljanja spletnega mesta ali ker si sam zbrisal svoj vpis.\n\nAli želiš nadaljevati plovbo, če želiš nadaljevati potovanje z AYNI ?', }, es: { "L'Email è già stata Verificata": "El correo electrónico ya ha sido verificado", @@ -246,6 +249,7 @@ textlang = { 'TEMPORANEA': 'TEMPORAL', 'NAVE': 'NAVE', 'MSG_SEND_FROM': 'Mensaje enviado por', + 'VUOI_IMBARCARTI': '¡Atención! Entendemos que actualmente no está asignado a No Boarding.\nEsto puede deberse a un error durante la fase de actualización del sitio web, o porque usted mismo ha cancelado el embarque.\n\n¿Quieres añadirte ahora al próximo embarque para continuar tu viaje en AYNI?', }, enUs: { "partecipanti": "participants", @@ -308,6 +312,7 @@ textlang = { 'TEMPORANEA': 'TEMPORARY', 'NAVE': 'SHIP', 'MSG_SEND_FROM': 'Msg sent by', + 'VUOI_IMBARCARTI': 'Attention! We understand that you have No Boarding assigned.\nThis may be due to an error during the site update phase, or because you have cancelled boarding yourself.\n\nDo you want to add now to the Next Boarding to continue your AYNI Trip?', }, fr: { "L'Email è già stata Verificata": "Le courrier électronique a déjà été vérifié", @@ -374,6 +379,7 @@ textlang = { 'TEMPORANEA': 'TEMPORAIRE', 'NAVE': 'NAVIRE', 'MSG_SEND_FROM': 'Message envoyé par', + 'VUOI_IMBARCARTI': 'Attention ! Nous comprenons que vous n\'êtes actuellement pas affecté Pas d\'embarquement.\nCela peut être dû à une erreur lors de la phase de mise à jour du site, ou parce que vous avez vous-même annulé l\'embarquement.\n\nVoulez-vous vous ajouter maintenant au prochain embarquement pour continuer votre voyage AYNI ? ', }, pt: { "L'Email è già stata Verificata": "", @@ -440,6 +446,7 @@ textlang = { 'TEMPORANEA': 'TEMPORÁRIO', 'NAVE': 'NAVE', 'MSG_SEND_FROM': 'Mensagem enviada por', + 'VUOI_IMBARCARTI': 'Atenção! Compreendemos que actualmente não lhe é atribuído Sem Embarque.\nIsto pode ser devido a um erro durante a fase de actualização do site, ou porque você mesmo cancelou o embarque.\n\nDeseja juntar-se agora ao próximo embarque para continuar a sua viagem AYNI?', }, }; @@ -449,6 +456,7 @@ module.exports = { ACAPO: '\n', ENABLE_CRONTAB: 'CRONTAB', + UPDATE_GRADUATORIA: 'UPDATE_GRAD', LANGADMIN: 'it', @@ -465,6 +473,12 @@ module.exports = { SEND_MSG: 2, SEND_MSG_SINGOLO: 3, SEND_TO_ALL: 10, + SEND_MSG_EFFETTUA_IL_DONO: 1000, + SEND_MSG_SOLLECITO_DONATORI_NO_DONO: 1005, + SEND_MSG_A_MEDIATORI: 1010, + SEND_MSG_A_SOGNATORE: 1020, + SEND_MSG_A_UTENTE_SOSTITUITO: 1030, + SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE: 1040, }, Placca: { @@ -982,6 +996,8 @@ module.exports = { 'note': { $exists: true }, "$expr": { "$gt": [{ "$strLenCP": "$note" }, 1] } }); + if (params.filterand.includes(shared_consts.FILTER_QUALIFIED)) + filtriadded.push({ 'profile.qualified': true }); if (params.filterand.includes(shared_consts.FILTER_USER_NO_ZOOM)) filtriadded.push({ 'profile.saw_zoom_presentation': false }); if (params.filterand.includes(shared_consts.FILTER_USER_NO_INVITANTE)) @@ -1010,6 +1026,11 @@ module.exports = { filtriadded.push({ deleted: { $exists: true, $eq: true } }); + if (params.filterand.includes(shared_consts.FILTER_NAVI_NON_PRESENTI)) + filtriadded.push({ + navinonpresenti: { $exists: true, $eq: true }, + $or: [{ subaccount: { $exists: false } }, { subaccount: { $exists: true, $eq: false } }] + }); } @@ -1210,7 +1231,7 @@ module.exports = { numup }; - if (idapp === tools.AYNI) { + if (idapp === this.AYNI) { this.getRigaColByPosUp(mypos); ris = this.getlimiti(mypos); } @@ -1294,6 +1315,15 @@ module.exports = { } }, + getstrDateLongFile(mydate, lang) { + if (mydate) { + // console.log('getstrDate', mytimestamp) + return mydate.getFullYear() + '-' + this.appendLeadingZeroes(mydate.getMonth() + 1) + '-' + this.appendLeadingZeroes(mydate.getDate()) + ' (' + this.getWeekDayByLang(mydate, lang) + ')' + } else { + return ''; + } + }, + getlinkzoom(idconf) { if (idconf === '') idconf = '6668882000'; @@ -1378,12 +1408,22 @@ module.exports = { // console.log('Saved!'); // }); - // mystr = this.getstrDateTimeShort(Date.now()) + ' ' + mystr; + mystr = this.getstrDateTimeShort(new Date(), 'it') + ': ' + mystr; + const stream = fs.createWriteStream(filename, { flags: 'a' }); stream.write('\n' + mystr); stream.end(); }, + readlogfile(idapp, filename) { + + try{ + return fs.readFileSync(idapp + '/' + filename, 'utf8'); + }catch (e) { + return ''; + } + }, + writelog(mystr) { this.writelogfile(mystr, FILELOG); }, @@ -1396,6 +1436,20 @@ module.exports = { this.writelogfile(mystr, FILEMANAGERS); }, + writeSostituzioniLog(mystr) { + this.writelogfile(mystr, FILESOSTITUZIONI); + }, + + writeFlottaLog(idapp, mystr, riga, col) { + this.mkdirpath(idapp + '/'); + this.writelogfile(mystr, idapp + '/' + riga + '_' + col + '.txt'); + }, + + readFlottaLog(idapp, riga, col) { + const nomefile = riga + '_' + col + '.txt'; + return this.readlogfile(idapp, nomefile); + }, + writeNaveLog(mystr) { this.writelogfile(mystr, FILENAVE); }, @@ -1523,6 +1577,9 @@ module.exports = { if ('username' in fieldsvalue) { return true; } + if ('note' in fieldsvalue) { + return true; + } } if (table === 'navi') { @@ -1541,12 +1598,15 @@ module.exports = { return true; } } + if (table === 'flotte') { + return true; + } return false; }, NotifyIfDelRecord(table) { - if ((table === 'users') || (table === 'extralist') || (table === 'listaingressos')) { + if ((table === 'users') || (table === 'extralist') || (table === 'listaingressos') || (table === 'graduatorias')) { return true; } @@ -1572,5 +1632,41 @@ module.exports = { return Math.pow(2, riga - 1); }, + getPrimoFuocoByIndCol(col) { + // let ris = Math.ceil(col - (col % 8)) + 1; + let ris = ((Math.ceil(col / 8) - 1) * 8) + 1; + if (ris <= 0) + ris = 1; + return ris + }, + + getPrimaColFlotta(col) { + // let ris = Math.ceil(col - (col % 8)) + 1; + let ris = ((Math.ceil(col / 64) - 1) * 64) + 1; + if (ris <= 0) + ris = 1; + return ris + }, + + getStrMsgByTipoMsg(tipomsg) { + + let mystr = ''; + + if (tipomsg === this.TipoMsg.SEND_MSG_EFFETTUA_IL_DONO) + mystr = 'Inviato Messaggio per Effettuare il Dono a Tutta la Flotta'; + else if (tipomsg === this.TipoMsg.SEND_MSG_SOLLECITO_DONATORI_NO_DONO) + mystr = 'Inviato Messaggio per RICORDARE di Effettuare il Dono a chi ancora non l\'ha fatto'; + else if (tipomsg === this.TipoMsg.SEND_MSG_A_MEDIATORI) + mystr = 'Inviato Messaggio ai Mediatori'; + else if (tipomsg === this.TipoMsg.SEND_MSG_A_SOGNATORE) + mystr = 'Inviato Messaggio al Sognatore'; + else if (tipomsg === this.TipoMsg.SEND_MSG_A_UTENTE_SOSTITUITO) + mystr = 'Inviato Messaggio all\'utente Sostituito'; + else if (tipomsg === this.TipoMsg.SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE) + mystr = 'Inviato Messaggio Dono Ricevuto Correttamente'; + + return mystr; + } + }; diff --git a/src/server/tools/server_constants.js b/src/server/tools/server_constants.js index 9546f43..7ce747b 100755 --- a/src/server/tools/server_constants.js +++ b/src/server/tools/server_constants.js @@ -16,6 +16,7 @@ module.exports = Object.freeze({ RIS_CODE_ERR_UNAUTHORIZED: -30, RIS_CODE_LOGIN_ERR_GENERIC: -20, RIS_CODE_LOGIN_ERR: -10, + RIS_CODE_LOGIN_ERR_SUBACCOUNT: -8, RIS_CODE_OK: 1, RIS_CODE_LOGIN_OK: 1, diff --git a/src/server/tools/shared_nodejs.js b/src/server/tools/shared_nodejs.js index 16af737..da2895b 100755 --- a/src/server/tools/shared_nodejs.js +++ b/src/server/tools/shared_nodejs.js @@ -20,6 +20,8 @@ module.exports = { FILTER_USER_TELEGRAM_BLOCKED: 1024, FILTER_ATTIVI: 2048, FILTER_NASCOSTI: 4096, + FILTER_NAVI_NON_PRESENTI: 8192, + FILTER_QUALIFIED: 16384, Permissions: { Admin: 1, @@ -49,6 +51,8 @@ module.exports = { AGGIUNGI_NUOVO_IMBARCO: 380, CANCELLA_IMBARCO: 385, DAMMI_PRIMO_UTENTE_LIBERO: 390, + GET_VALBYTABLE: 400, + SET_VALBYTABLE: 410, }, fieldsUserToChange() {