diff --git a/src/server/models/account.js b/src/server/models/account.js index fc43dfd..c889412 100755 --- a/src/server/models/account.js +++ b/src/server/models/account.js @@ -108,17 +108,13 @@ AccountSchema.statics.getAccountsByUsername = async function(idapp, username) { }; -AccountSchema.statics.addtoSaldo = async function(id, amount) { - const Account = this; +AccountSchema.methods.addtoSaldo = async function(amount) { + const account = this; - if (!id) - return false; - - const myaccount = await Account.findById(id); - if (myaccount) { - myaccount.saldo = myaccount.saldo + amount; - myaccount.date_updated = new Date(); - return await myaccount.save(); + if (account) { + account.saldo = account.saldo + amount; + account.date_updated = new Date(); + return await account.save(); } return null; @@ -158,11 +154,11 @@ AccountSchema.statics.getAccountByUsernameAndCircuitId = async function(idapp, u if (circuitId) mycircuit = await Circuit.getCircuitById(circuitId); else - mycircuit = await Circuit.findOne({name: circuitName}).lean(); + mycircuit = await Circuit.findOne({name: circuitName}); if (mycircuit) { - let myaccount = await Account.findOne(myquery).lean(); + let myaccount = await Account.findOne(myquery); if (!myaccount && createifnotexist) { myaccount = new Account({ diff --git a/src/server/models/circuit.js b/src/server/models/circuit.js index 43ef450..c94e962 100755 --- a/src/server/models/circuit.js +++ b/src/server/models/circuit.js @@ -65,7 +65,6 @@ const CircuitSchema = new Schema({ symbol: { type: String, maxlength: 7, - unique: true, }, color: { type: String, @@ -211,6 +210,8 @@ CircuitSchema.statics.getWhatToShow = function(idapp, username) { subname: 1, longdescr: 1, regulation: 1, + totCircolante: 1, + totTransato: 1, systemUserId: 1, createdBy: 1, date_created: 1, @@ -248,6 +249,8 @@ CircuitSchema.statics.getWhatToShow_Unknown = function(idapp, username) { systemUserId: 1, founderUserId: 1, nome_valuta: 1, + totCircolante: 1, + totTransato: 1, fido_scoperto_default: 1, qta_max_default: 1, symbol: 1, @@ -363,7 +366,7 @@ CircuitSchema.statics.getCircuitByName = async function(idapp, name) { }; try { - return await Circuit.findOne(myfind).lean(); + return await Circuit.findOne(myfind); } catch (e) { return null; @@ -378,7 +381,7 @@ CircuitSchema.statics.getCircuitById = async function(circuitId) { }; try { - return await Circuit.findOne(myfind).lean(); + return await Circuit.findOne(myfind); } catch (e) { return null; @@ -440,12 +443,24 @@ CircuitSchema.statics.getUserCircuits = async function(idapp, username) { }; +CircuitSchema.statics.getCircolanteSingolaTransaz = function(accountorigTable, accountdestTable) { + + let circolante = 0; + if (accountdestTable.saldo > 0) + circolante += accountdestTable.saldo; + if (accountorigTable.saldo > 0) + circolante += accountorigTable.saldo; + + return circolante; +}; + CircuitSchema.statics.sendCoins = async function(onlycheck, idapp, usernameOrig, extrarec) { const {Movement} = require('../models/movement'); const {Account} = require('../models/account'); let ris = { + result: false, cansend: true, errormsg: '', rec: null, @@ -453,47 +468,61 @@ CircuitSchema.statics.sendCoins = async function(onlycheck, idapp, usernameOrig, }; try { - let reccircuit = null; + let circuittable = null; if (extrarec.circuitname) - reccircuit = await Circuit.getCircuitByName(idapp, extrarec.circuitname); + circuittable = await Circuit.getCircuitByName(idapp, extrarec.circuitname); if (extrarec.circuitId) - reccircuit = await Circuit.getCircuitById(idapp, extrarec.circuitId); + circuittable = await Circuit.getCircuitById(idapp, extrarec.circuitId); - if (reccircuit) { - const myqty = extrarec.qty; + if (circuittable) { + const myqty = Math.abs(extrarec.qty); - const accountdest = await Account.getAccountByUsernameAndCircuitId(idapp, extrarec.dest, { circuitId: reccircuit._id }, true); - const accountorig = await Account.getAccountByUsernameAndCircuitId(idapp, usernameOrig, { circuitId: reccircuit._id }, true); + const accountdestTable = await Account.getAccountByUsernameAndCircuitId(idapp, extrarec.dest, { circuitId: circuittable._id }, true); + const accountorigTable = await Account.getAccountByUsernameAndCircuitId(idapp, usernameOrig, { circuitId: circuittable._id }, true); + + const circolantePrec = this.getCircolanteSingolaTransaz(accountorigTable, accountdestTable); // Check if Sender has enough money - if (accountorig.saldo - myqty < -accountorig.fidoConcesso) { + if (accountorigTable.saldo - myqty < -accountorigTable.fidoConcesso) { ris.cansend = false; ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_FIDO'); } - if (accountdest.saldo + myqty > accountorig.qta_maxConcessa) { + if (accountdestTable.saldo + myqty > accountorigTable.qta_maxConcessa) { ris.cansend = false; ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_QTAMAX'); } if (!onlycheck) { // Add a Transaction ! - ris.rec = await Movement.addMov(idapp, accountorig, accountdest, myqty, extrarec.causal); + ris.rec = await Movement.addMov(idapp, accountorigTable, accountdestTable, myqty, extrarec.causal); - ris.useraccounts = await Account.getUserAccounts(idapp, usernameOrig); + if (ris.cansend && ris.rec) { + + const circolanteAtt = this.getCircolanteSingolaTransaz(accountorigTable, accountdestTable); + + // Somma di tutte le transazioni + circuittable.totTransato += myqty; + circuittable.totCircolante = circuittable.totCircolante + (circolanteAtt - circolantePrec); + await circuittable.save(); + + ris.result = true; + console.log('Inviate Monete da', usernameOrig, extrarec.dest, myqty, extrarec.causal); + + ris.useraccounts = await Account.getUserAccounts(idapp, usernameOrig); - if (ris.cansend) { - console.log('Invia Monete da', usernameOrig, extrarec.dest, extrarec.qty, extrarec.causal); } else { - console.log('NON Inviate Monete da', usernameOrig, extrarec.dest, extrarec.qty, extrarec.causal); + console.log('NON Inviate Monete da', usernameOrig, extrarec.dest, myqty, extrarec.causal); } } + return ris; } } catch (e) { console.error('Err sendCoins', e); - return false; + ris.result = false; + return ris; } }; diff --git a/src/server/models/movement.js b/src/server/models/movement.js index 9a29fb6..6192c5f 100755 --- a/src/server/models/movement.js +++ b/src/server/models/movement.js @@ -84,7 +84,7 @@ MovementSchema.statics.executeQueryTable = function(idapp, params) { return tools.executeQueryTable(this, 0, params); }; -MovementSchema.statics.addMov = async function(idapp, accountFromId, accountToId, amount, causal) { +MovementSchema.statics.addMov = async function(idapp, accountFromIdTable, accountToIdTable, amount, causal) { try { let mymov = Movement( @@ -92,8 +92,8 @@ MovementSchema.statics.addMov = async function(idapp, accountFromId, accountToId _id: new ObjectID().toString(), idapp, transactionDate: new Date(), - accountFromId: accountFromId._id, - accountToId: accountToId._id, + accountFromId: accountFromIdTable._id, + accountToId: accountToIdTable._id, amount, causal, residual: 0, @@ -104,9 +104,9 @@ MovementSchema.statics.addMov = async function(idapp, accountFromId, accountToId const rismov = await mymov.save(); if (rismov) { // Update saldo dell'Account - Account.addtoSaldo(accountToId, amount); + await accountToIdTable.addtoSaldo(amount); - Account.addtoSaldo(accountFromId, -amount); + await accountFromIdTable.addtoSaldo(-amount); return rismov; } diff --git a/src/server/models/user.js b/src/server/models/user.js index 8f299e2..0fefa2d 100755 --- a/src/server/models/user.js +++ b/src/server/models/user.js @@ -2084,6 +2084,9 @@ UserSchema.statics.setCircuitCmd = async function(idapp, usernameOrig, circuitna const {SendNotif} = require('../models/sendnotif'); let ris = null; + let outres = { + result: false, + }; let update = {}; try { if (cmd === shared_consts.CIRCUITCMD.SET) { @@ -2116,7 +2119,7 @@ UserSchema.statics.setCircuitCmd = async function(idapp, usernameOrig, circuitna if (ris) { // Invia una notifica alla persona e agli Admin tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, value, true, username_action, extrarec); - ris = await Circuit.getInfoCircuitByName(idapp, circuitname); + outres.result = await Circuit.getInfoCircuitByName(idapp, circuitname); } } else if (cmd === shared_consts.CIRCUITCMD.REQ) { // Aggiungo la richiesta di Gruppo a me @@ -2147,21 +2150,19 @@ UserSchema.statics.setCircuitCmd = async function(idapp, usernameOrig, circuitna } } else { if (foundIfAlreadyAskCircuit) { - ris = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo il Gruppo da me + outres.result = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo il Gruppo da me // Invia una notifica alla persona await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } } - ris = await Circuit.getInfoCircuitByName(idapp, circuitname); - } else if (cmd === shared_consts.CIRCUITCMD.REMOVE_FROM_MYLIST) { // Remove if is also an Admin await Circuit.removeAdminOfMyCircuit(idapp, usernameOrig, circuitname); - ris = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me console.log('ris', ris); // Invia una notifica alla persona @@ -2176,51 +2177,50 @@ UserSchema.statics.setCircuitCmd = async function(idapp, usernameOrig, circuitna await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } - ris = await Circuit.deleteCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await Circuit.deleteCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me } else if (cmd === shared_consts.CIRCUITCMD.CANCEL_REQ) { - ris = await Circuit.removeReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await Circuit.removeReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me } else if (cmd === shared_consts.CIRCUITCMD.REFUSE_REQ) { - ris = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await this.removeFromCircuits(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me - ris = await Circuit.removeReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await Circuit.removeReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me - ris = await Circuit.refuseReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me + outres.result = await Circuit.refuseReqCircuit(idapp, usernameOrig, circuitname); // Rimuovo l'Amicizia da me // Invia una notifica alla persona await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } else if (cmd === shared_consts.CIRCUITCMD.ADDADMIN) { - ris = await Circuit.addToAdminOfCircuit(idapp, usernameOrig, circuitname); // Rimuovo la richiesta di entrare nel gruppo + outres.result = await Circuit.addToAdminOfCircuit(idapp, usernameOrig, circuitname); // Rimuovo la richiesta di entrare nel gruppo // Invia una notifica alla persona await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } else if (cmd === shared_consts.CIRCUITCMD.REMOVEADMIN) { - ris = await Circuit.removeAdminOfCircuit(idapp, usernameOrig, circuitname); // Rimuovo la richiesta di entrare nel gruppo + outres.result = await Circuit.removeAdminOfCircuit(idapp, usernameOrig, circuitname); // Rimuovo la richiesta di entrare nel gruppo // Invia una notifica alla persona await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ) { - let ris2 = await Circuit.sendCoins(true, idapp, usernameOrig, extrarec); - if (ris2.cansend) { - // Invia una notifica di moneta alla persona - await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); - } else { - ris2.cansend = false; - } + outres = await Circuit.sendCoins(true, idapp, usernameOrig, extrarec); - ris = ris2; + if (outres.cansend) { + // Invia una notifica di moneta alla persona + outres.result = await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); + } else { + outres.cansend = false; + } } else if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) { // Before to accept, I see if it's already set ! - let ris2 = { + outres = { cansend: false, errormsg: '', }; @@ -2234,26 +2234,41 @@ UserSchema.statics.setCircuitCmd = async function(idapp, usernameOrig, circuitna } if (!await SendNotif.checkIfCoinsAlreadySent(extrarec.notifId)) { if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) { - ris2 = await Circuit.sendCoins(false, idapp, usernameOrig, extrarec); + outres = await Circuit.sendCoins(false, idapp, usernameOrig, extrarec); } else { - ris2.cansend = true; + outres.cansend = true; } - if (ris2.cansend) { + if (outres.cansend) { // Invia una notifica di moneta alla persona await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec); } - ris2.recnotif = await SendNotif.getRecNotif(extrarec.notifId); + outres.recnotif = await SendNotif.getRecNotif(extrarec.notifId); - ris2.user = await User.getExtraInfoByUsername(idapp, username_action); } else { - ris2.cansend = false; + outres.cansend = false; - ris2.errormsg = i18n.__('CIRCUIT_COINS_ALREADY_PROCESSED', risStatus); + outres.errormsg = i18n.__('CIRCUIT_COINS_ALREADY_PROCESSED', risStatus); } - ris = ris2; + ris = true; } + + if (ris && username_action) { + + //++Todo: Ottimizzare ! Non occorre inviare tutti questi dati !!! Solo per il Circuito ?! + const user = await User.getExtraInfoByUsername(idapp, username_action); + if (user) { + outres.user = user; + } + outres.listcircuits = await Circuit.findAllIdApp(idapp); + } + + if (circuitname) + outres.circuit = await Circuit.getInfoCircuitByName(idapp, circuitname); + + return outres; + } catch (e) { console.error('Error setCircuitCmd: ', e); } @@ -3756,6 +3771,12 @@ UserSchema.statics.getExtraInfoByUsername = async function(idapp, username) { UserSchema.statics.addExtraInfo = async function(idapp, recUser) { try { + + if (recUser._doc.profile.notifs.length <= 0) { + recUser._doc.profile.notifs = shared_consts.DEFAULT_NOTIFS_USER; + await recUser.save(); + } + const listSentMyRequestFriends = await User.find({ idapp, 'profile.req_friends': { diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index 87834e5..1d6a25a 100755 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -338,10 +338,12 @@ router.post('/settable', authenticate, async (req, res) => { if (alreadyexist) { return res.send({code: server_constants.RIS_CODE_REC_ALREADY_EXIST_NAME}); } - alreadyexist = await Circuit.findOne({idapp, symbol: mydata.symbol}); + /*alreadyexist = await Circuit.findOne({idapp, symbol: mydata.symbol}); if (alreadyexist) { return res.send({code: server_constants.RIS_CODE_REC_ALREADY_EXIST_SYMBOL}); } + + */ } if (shared_consts.TABLES_UPDATE_LASTMODIFIED.includes(params.table)) { @@ -393,7 +395,7 @@ router.post('/settable', authenticate, async (req, res) => { } if (shared_consts.TABLES_CIRCUITS_NOTIFICATION.includes(params.table)) { typedir = shared_consts.TypeNotifs.TYPEDIR_CIRCUITS; - typeid = shared_consts.TypeNotifs.ID_GROUP_NEW_REC; + typeid = shared_consts.TypeNotifs.ID_CIRCUIT_NEW_REC; circuitnameDest = myrec ? myrec.name : ''; setnotif = true; } @@ -409,18 +411,18 @@ router.post('/settable', authenticate, async (req, res) => { return await User.setGroupsCmd(mydata.idapp, req.user.username, myrec.groupname, shared_consts.GROUPSCMD.SETGROUP, true, req.user.username).then((ris) => { - return res.send(myrec); + return res.send({rec: myrec, ris}); }); } else if (params.table === shared_consts.TAB_MYCIRCUITS && isnewrec) { // nuovo Record: // aggiungi il creatore al Circuito stesso return await User.setCircuitCmd(mydata.idapp, req.user.username, myrec.name, shared_consts.CIRCUITCMD.SET, true, req.user.username, extrarec).then((ris) => { - return res.send(myrec); + return res.send({rec: myrec, ris}); }); } - return res.send(myrec); + return res.send({rec: myrec, ris: null}); }).catch(async (e) => { console.error('settable', e.message); if (e.code === 11000) { @@ -432,7 +434,7 @@ router.post('/settable', authenticate, async (req, res) => { } return await mytablestrutt.findByIdAndUpdate(id, {$set: myfields}). then(async (rec) => { - return res.send(rec); + return res.send({rec}); }). catch((err) => { tools.mylog('error: ', err.message); diff --git a/src/server/telegram/telegrambot.js b/src/server/telegram/telegrambot.js index f795f13..3968f98 100755 --- a/src/server/telegram/telegrambot.js +++ b/src/server/telegram/telegrambot.js @@ -3946,7 +3946,7 @@ if (true) { if (circuit) { cmd = shared_consts.CIRCUITCMD.SET; - constF foundIfAlreadyCircuit = await User.ifAlreadyInCircuit(user.idapp, data.username, circuit.name); + const foundIfAlreadyCircuit = await User.ifAlreadyInCircuit(user.idapp, data.username, circuit.name); if (!foundIfAlreadyCircuit) { // Aggiungilo nel Circuito diff --git a/src/server/tools/shared_nodejs.js b/src/server/tools/shared_nodejs.js index 323231a..1579db2 100755 --- a/src/server/tools/shared_nodejs.js +++ b/src/server/tools/shared_nodejs.js @@ -129,6 +129,7 @@ module.exports = { TABLES_USER_INCLUDE_MY: ['mygroups', 'circuits'], TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods'], + //++Todo: per abilitare gli utenti ad inserire un Circuito aggiungere 'circuits' alla lista TABLES_PERM_NEWREC TABLES_PERM_NEWREC: ['skills', 'goods', 'subskills', 'mygroups', 'myhosps'], TABLES_REC_ID: ['skills', 'goods', 'subskills'], @@ -461,4 +462,27 @@ module.exports = { 'qualified']; }, + DEFAULT_NOTIFS_USER: [ + { + "dir": 1, + "value": 24 + }, + { + "dir": 2, + "value": 1 + }, + { + "dir": 3, + "value": 1 + }, + { + "dir": 4, + "value": 1 + }, + { + "dir": 5, + "value": 1 + } + ], + };