- Visu Saldo su Home

- SendRisTo
- Movimenti conto Comunitario
- Profilo
This commit is contained in:
Surya Paolo
2023-03-17 19:07:31 +01:00
parent e705594294
commit 7482b65743
10 changed files with 70 additions and 18 deletions

View File

@@ -1,4 +1,7 @@
Lun 06/02 ORE 23:13: Inviate Monete da paoloar77 a surya1977 1 RISTEST [] [Saldo 1: -50] [Saldo 2: 5] Lun 06/02 ORE 23:13: Inviate Monete da paoloar77 a surya1977 1 RISTEST [] [Saldo 1: -50] [Saldo 2: 5]
Lun 06/02 ORE 23:15: Inviate Monete da paoloar77 a surya1977 1 RISTEST [causale: ] [Saldo 1: -51 RISTEST] [Saldo 2: 6 RISTEST ] Lun 06/02 ORE 23:15: Inviate Monete da paoloar77 a surya1977 1 RISTEST [causale: ] [Saldo 1: -51 RISTEST] [Saldo 2: 6 RISTEST ]
Lun 06/02 ORE 23:17: Inviate Monete da paoloar77 a surya1977 1 RISTEST [causale: ] [Saldo paoloar77: -52 RISTEST] [Saldo surya1977: 7 RISTEST] Lun 06/02 ORE 23:17: Inviate Monete da paoloar77 a surya1977 1 RISTEST [causale: ] [Saldo paoloar77: -52 RISTEST] [Saldo surya1977: 7 RISTEST]
Dom 12/03 ORE 13:35: Inviate Monete da paoloar77 a 1 RIS [causale: ] [Saldo paoloar77: 3 RIS] [Saldo : 2 RIS]
Mer 15/03 ORE 22:15: Inviate Monete da pontiUmani (paoloar77) a paoloar77 1 RIS [causale: ] [Saldo pontiUmani (paoloar77): 1 RIS] [Saldo paoloar77: 4 RIS]
Mer 15/03 ORE 22:37: Inviate Monete da pontiUmani (paoloar77) a surya1977 1 RIS [causale: ] [Saldo pontiUmani (paoloar77): 0 RIS] [Saldo surya1977: 1 RIS]

View File

@@ -61,9 +61,9 @@
"COMUNITARIO": "Comunitario", "COMUNITARIO": "Comunitario",
"COLLETTIVO": "Collettivo", "COLLETTIVO": "Collettivo",
"CIRCUIT_SENDCOINSREQ_GROUP": "%s sta inviando <strong>%s %s</strong> al Conto %s '%s'.", "CIRCUIT_SENDCOINSREQ_GROUP": "%s sta inviando <strong>%s %s</strong> al Conto %s '%s'.",
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER": "il conto %s '%s' sta inviando <strong>%s %s</strong> a %s.", "CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER": "il conto %s '%s' (%s) sta inviando <strong>%s %s</strong> a %s.",
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_YOU": "il conto %s '%s' ti sta inviando <strong>%s %s</strong>", "CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_YOU": "il conto %s '%s' (%s) ti sta inviando <strong>%s %s</strong>",
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_GROUP": "il conto %s '%s' sta inviando <strong>%s %s</strong> al conto %s '%s'.", "CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_GROUP": "il conto %s '%s' (%s) sta inviando <strong>%s %s</strong> al conto %s '%s'.",
"CIRCUIT_SENDCOINSREQ_TO_ME": "Stai inviando <strong>%s %s</strong> a %s. \nIl destinatario deve accettare la transazione.", "CIRCUIT_SENDCOINSREQ_TO_ME": "Stai inviando <strong>%s %s</strong> a %s. \nIl destinatario deve accettare la transazione.",
"CIRCUIT_SENDCOINSREQ_TO_GROUP": "Stai inviando <strong>%s %s</strong> al Conto %s '%s'. \nIl destinatario deve accettare la transazione.", "CIRCUIT_SENDCOINSREQ_TO_GROUP": "Stai inviando <strong>%s %s</strong> al Conto %s '%s'. \nIl destinatario deve accettare la transazione.",
"ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_YOU": "<strong>%s %s</strong> accettati dal Conto %s '%s' (%s).", "ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_YOU": "<strong>%s %s</strong> accettati dal Conto %s '%s' (%s).",
@@ -74,6 +74,7 @@
"ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_YOU": "<strong>%s %s</strong> accettati da %s.", "ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_YOU": "<strong>%s %s</strong> accettati da %s.",
"ID_CIRCUIT_COINS_ACCEPTED": "<strong>%s %s</strong> accettati da %s.", "ID_CIRCUIT_COINS_ACCEPTED": "<strong>%s %s</strong> accettati da %s.",
"SALDO_UPDATE": "[Saldo <strong>%s %s</strong>]", "SALDO_UPDATE": "[Saldo <strong>%s %s</strong>]",
"SALDO_UPDATE_WHO": "[Saldo %s <strong>%s %s</strong>]",
"ID_CIRCUIT_COINS_ACCEPTED_TO_ME": "<strong>%s %s</strong> sono stati accettati da %s.", "ID_CIRCUIT_COINS_ACCEPTED_TO_ME": "<strong>%s %s</strong> sono stati accettati da %s.",
"ID_CIRCUIT_COINS_REFUSED": "%s %s rifiutati da %s.", "ID_CIRCUIT_COINS_REFUSED": "%s %s rifiutati da %s.",
"ID_CIRCUIT_COINS_REFUSED_TO_ME": "%s %s rifiutati da %s.", "ID_CIRCUIT_COINS_REFUSED_TO_ME": "%s %s rifiutati da %s.",

View File

@@ -692,7 +692,13 @@ CircuitSchema.statics.sendCoins = async function (onlycheck, idapp, usernameOrig
extrarec.saldoOrig = accountorigTable.saldo; extrarec.saldoOrig = accountorigTable.saldo;
extrarec.saldoDest = accountdestTable.saldo; extrarec.saldoDest = accountdestTable.saldo;
let orig = usernameOrig + (extrarec.grouporig ? extrarec.grouporig : '') + (extrarec.contoComOrig ? extrarec.contoComOrig : ''); let orig = usernameOrig;
if (extrarec.grouporig) {
orig = extrarec.grouporig + ' (' + usernameOrig + ')'
}
if (extrarec.contoComOrig) {
orig = extrarec.contoComOrig + ' (' + usernameOrig + ')'
}
let dest = (extrarec.dest ? extrarec.dest : '') + (extrarec.groupDest ? extrarec.groupDest : '') + (extrarec.contoComDest ? extrarec.contoComDest : ''); let dest = (extrarec.dest ? extrarec.dest : '') + (extrarec.groupDest ? extrarec.groupDest : '') + (extrarec.contoComDest ? extrarec.contoComDest : '');
ris.result = true; ris.result = true;

View File

@@ -122,13 +122,13 @@ MovementSchema.statics.addMov = async function (idapp, accountFromIdTable, accou
} }
}; };
MovementSchema.statics.getQueryMovsByCircuitId = async function (idapp, username, circuitId) { MovementSchema.statics.getQueryMovsByCircuitId = async function (idapp, username, groupname, contocom, circuitId) {
try { try {
if (!circuitId) { if (!circuitId) {
return []; return [];
} }
const myaccount = await Account.getAccountByUsernameAndCircuitId(idapp, username, circuitId, ''); const myaccount = await Account.getAccountByUsernameAndCircuitId(idapp, username, circuitId, false, groupname, contocom);
if (myaccount) { if (myaccount) {
@@ -363,10 +363,10 @@ MovementSchema.statics.getQueryMovsByCircuitId = async function (idapp, username
'userto.username': 1, 'userto.username': 1,
'userto.profile.img': 1, 'userto.profile.img': 1,
'groupfrom.groupname': 1, 'groupfrom.groupname': 1,
'groupfrom.descr': 1, 'groupfrom.title': 1,
'groupfrom.photos': 1, 'groupfrom.photos': 1,
'groupto.groupname': 1, 'groupto.groupname': 1,
'groupto.descr': 1, 'groupto.title': 1,
'groupto.photos': 1, 'groupto.photos': 1,
'contocomfrom.path': 1, 'contocomfrom.path': 1,
'contocomfrom.name': 1, 'contocomfrom.name': 1,
@@ -387,6 +387,7 @@ MovementSchema.statics.getQueryMovsByCircuitId = async function (idapp, username
return []; return [];
}; };
MovementSchema.statics.getQueryAllUsersMovsByCircuitId = async function (idapp, circuitId) { MovementSchema.statics.getQueryAllUsersMovsByCircuitId = async function (idapp, circuitId) {
try { try {
@@ -635,13 +636,15 @@ MovementSchema.statics.getQueryAllUsersMovsByCircuitId = async function (idapp,
'userto.username': 1, 'userto.username': 1,
'userto.profile.img': 1, 'userto.profile.img': 1,
'groupfrom.groupname': 1, 'groupfrom.groupname': 1,
'groupfrom.descr': 1, 'groupfrom.title': 1,
'groupto.groupname': 1, 'groupto.groupname': 1,
'groupto.descr': 1, 'groupto.title': 1,
'contocomfrom.path': 1, 'contocomfrom.path': 1,
'contocomfrom.name': 1, 'contocomfrom.name': 1,
'contocomfrom.title': 1,
'contocomto.path': 1, 'contocomto.path': 1,
'contocomto.name': 1, 'contocomto.name': 1,
'contocomto.title': 1,
}, },
}, },
@@ -659,7 +662,7 @@ MovementSchema.statics.getQueryAllUsersMovsByCircuitId = async function (idapp,
MovementSchema.statics.getMovsByCircuitId = async function (idapp, username, circuitId) { MovementSchema.statics.getMovsByCircuitId = async function (idapp, username, circuitId) {
const MyMovement = this; const MyMovement = this;
const myquery = await MyMovement.getQueryMovsByCircuitId(idapp, username, circuitId); const myquery = await MyMovement.getQueryMovsByCircuitId(idapp, username, '', '', circuitId);
if (myquery && myquery.length > 0) { if (myquery && myquery.length > 0) {
ris = await MyMovement.aggregate(myquery); ris = await MyMovement.aggregate(myquery);

View File

@@ -384,9 +384,9 @@ sendNotifSchema.statics.getDescrAndLinkByRecNotif = async function (recnotif, us
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_GROUP', tools.getAhref(username_action, await tools.getLinkUserTelegram(recnotif.idapp, username_action)), qty, newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_GROUP', tools.getAhref(username_action, await tools.getLinkUserTelegram(recnotif.idapp, username_action)), qty,
symbol, strtipocontoDest, groupOComdest); symbol, strtipocontoDest, groupOComdest);
} else if (groupOComorig && (sender === recnotif.paramsObj.usernameDest)) { } else if (groupOComorig && (sender === recnotif.paramsObj.usernameDest)) {
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_YOU', strtipocontoOrig, groupOComorig, qty, symbol, recnotif.paramsObj.extrarec.dest); newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_YOU', strtipocontoOrig, groupOComorig, username_action, qty, symbol, recnotif.paramsObj.extrarec.dest);
} else if (groupOComorig) { } else if (groupOComorig) {
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER', strtipocontoOrig, groupOComorig, qty, symbol, recnotif.paramsObj.extrarec.dest); newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER', strtipocontoOrig, groupOComorig, username_action, qty, symbol, recnotif.paramsObj.extrarec.dest);
} else { } else {
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ', tools.getAhref(username_action, await tools.getLinkUserTelegram(recnotif.idapp, username_action)), qty, newdescr = i18n.__('CIRCUIT_SENDCOINSREQ', tools.getAhref(username_action, await tools.getLinkUserTelegram(recnotif.idapp, username_action)), qty,
symbol); symbol);
@@ -398,9 +398,9 @@ sendNotifSchema.statics.getDescrAndLinkByRecNotif = async function (recnotif, us
if (myorig) { if (myorig) {
if (groupOComdest) { if (groupOComdest) {
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_GROUP', strtipocontoOrig, myorig, qty, symbol, strtipocontoDest, groupOComdest); newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_GROUP', strtipocontoOrig, myorig, username_action, qty, symbol, strtipocontoDest, groupOComdest);
} else { } else {
newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER', strtipocontoOrig, myorig, qty, symbol, mydest); newdescr = i18n.__('CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER', strtipocontoOrig, myorig, username_action, qty, symbol, mydest);
} }
} else { } else {
if (groupOComdest) { if (groupOComdest) {
@@ -440,9 +440,13 @@ sendNotifSchema.statics.getDescrAndLinkByRecNotif = async function (recnotif, us
if (!destinatario) { if (!destinatario) {
destinatario = username_action destinatario = username_action
} }
let saldostr = i18n.__('SALDO_UPDATE', recnotif.paramsObj.extrarec.saldoOrig, symbol);
if (groupOComorig) {
saldostr = i18n.__('SALDO_UPDATE_WHO', groupOComorig, recnotif.paramsObj.extrarec.saldoOrig, symbol);
}
newdescr = i18n.__('ID_CIRCUIT_COINS_ACCEPTED_TO_ME', qty, symbol, destinatario) newdescr = i18n.__('ID_CIRCUIT_COINS_ACCEPTED_TO_ME', qty, symbol, destinatario)
+ `\n` + i18n.__('SALDO_UPDATE', recnotif.paramsObj.extrarec.saldoOrig, symbol); + `\n` + saldostr;
tag = 'sendcoin'; tag = 'sendcoin';
} else if (recnotif.typeid === shared_consts.TypeNotifs.ID_CIRCUIT_COINS_REFUSED) { } else if (recnotif.typeid === shared_consts.TypeNotifs.ID_CIRCUIT_COINS_REFUSED) {
newdescr = i18n.__('ID_CIRCUIT_COINS_REFUSED', qty, symbol, username_action); newdescr = i18n.__('ID_CIRCUIT_COINS_REFUSED', qty, symbol, username_action);

View File

@@ -443,6 +443,9 @@ const UserSchema = new mongoose.Schema({
}, },
noNameSurname: { noNameSurname: {
type: Boolean, type: Boolean,
},
noFoto: {
type: Boolean,
} }
}, },
}); });
@@ -1578,6 +1581,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
'profile.born_city_id': 1, 'profile.born_city_id': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
'profile.handshake': 1, 'profile.handshake': 1,
'profile.friends': 1, 'profile.friends': 1,
@@ -1621,6 +1625,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
'profile.born_city_id': 1, 'profile.born_city_id': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
'profile.handshake': 1, 'profile.handshake': 1,
'profile.friends': 1, 'profile.friends': 1,
@@ -1665,6 +1670,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
'profile.born_city_id': 1, 'profile.born_city_id': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
'profile.handshake': 1, 'profile.handshake': 1,
'profile.friends': 1, 'profile.friends': 1,
@@ -2705,6 +2711,7 @@ function getWhatToShow(idapp, username) {
'profile.born_city_id': 1, 'profile.born_city_id': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
email: 1, email: 1,
date_reg: 1, date_reg: 1,
@@ -2728,6 +2735,7 @@ function getWhatToShow_Unknown(idapp, username) {
'profile.sex': 1, 'profile.sex': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
date_reg: 1, date_reg: 1,
'profile.handshake': 1, 'profile.handshake': 1,
@@ -2749,6 +2757,7 @@ UserSchema.statics.getWhatToShow_IfFriends = async function (idapp, username) {
'profile.sex': 1, 'profile.sex': 1,
'profile.born_province': 1, 'profile.born_province': 1,
'profile.born_country': 1, 'profile.born_country': 1,
'profile.resid_province': 1,
'profile.calc': 1, 'profile.calc': 1,
reported: 1, reported: 1,
date_report: 1, date_report: 1,

View File

@@ -53,6 +53,7 @@ router.post('/load', async (req, res) => {
lastssharedlink: await User.getLastSharedLink(idapp), lastssharedlink: await User.getLastSharedLink(idapp),
diffusorilist: await User.getDiffusoriUsers(idapp), diffusorilist: await User.getDiffusoriUsers(idapp),
receiveRislist: await User.getReceiveRISUsers(idapp), receiveRislist: await User.getReceiveRISUsers(idapp),
// receiveRislist: await User.find({idapp}).limit(20),
receiveRislistgroup: await MyGroup.getReceiveRISGroups(idapp), receiveRislistgroup: await MyGroup.getReceiveRISGroups(idapp),
strettelist: await User.getBestStretteDiManoUsers(idapp), strettelist: await User.getBestStretteDiManoUsers(idapp),
checkuser: await User.checkUser(idapp, username), checkuser: await User.checkUser(idapp, username),

View File

@@ -1246,6 +1246,9 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
} else if (mydata.dbop === 'noNameSurname') { } else if (mydata.dbop === 'noNameSurname') {
await User.findOneAndUpdate({ _id: mydata._id }, await User.findOneAndUpdate({ _id: mydata._id },
{ $set: { 'profile.noNameSurname': mydata.value } }); { $set: { 'profile.noNameSurname': mydata.value } });
} else if (mydata.dbop === 'noFoto') {
await User.findOneAndUpdate({ _id: mydata._id },
{ $set: { 'profile.noFoto': mydata.value } });
} else if (mydata.dbop === 'ricreaTabCitiesProvinces') { } else if (mydata.dbop === 'ricreaTabCitiesProvinces') {
// Svuota e Ricrea // Svuota e Ricrea

View File

@@ -1983,6 +1983,8 @@ module.exports = {
}); });
if (params.filterand.includes(shared_consts.FILTER_USER_TELEGRAM_BLOCKED)) if (params.filterand.includes(shared_consts.FILTER_USER_TELEGRAM_BLOCKED))
filtriadded.push({ 'profile.teleg_id_old': { $gt: 1 } }); filtriadded.push({ 'profile.teleg_id_old': { $gt: 1 } });
if (params.filterand.includes(shared_consts.FILTER_USER_PROVINCE))
filtriadded.push({ 'profile.resid_province': { $exists: true } });
if (params.filterand.includes(shared_consts.FILTER_ATTIVI)) if (params.filterand.includes(shared_consts.FILTER_ATTIVI))
filtriadded.push({ filtriadded.push({
$or: [ $or: [
@@ -2295,7 +2297,22 @@ module.exports = {
const { Movement } = require('../models/movement'); const { Movement } = require('../models/movement');
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, params.username, params.myid); const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, params.username, '', '', params.myid);
query.push(...myquery);
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_MOVEMENTS_GROUPNAME) {
const { Movement } = require('../models/movement');
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, '', params.groupname, '', params.myid);
query.push(...myquery);
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_MOVEMENTS_CONTOCOM) {
const { Movement } = require('../models/movement');
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, '', '', params.contocom, params.myid);
query.push(...myquery); query.push(...myquery);

View File

@@ -11,6 +11,8 @@ module.exports = {
QUERYTYPE_REFUSED_USER_CIRCUIT: 12, QUERYTYPE_REFUSED_USER_CIRCUIT: 12,
QUERYTYPE_LIST_MOVEMENTS: 15, QUERYTYPE_LIST_MOVEMENTS: 15,
QUERYTYPE_LIST_ALLMOVEMENTS: 16, QUERYTYPE_LIST_ALLMOVEMENTS: 16,
QUERYTYPE_LIST_MOVEMENTS_GROUPNAME: 17,
QUERYTYPE_LIST_MOVEMENTS_CONTOCOM: 18,
QUERYTYPE_GROUP_CIRCUIT: 20, QUERYTYPE_GROUP_CIRCUIT: 20,
QUERYTYPE_REFUSED_GROUP_CIRCUIT: 22, QUERYTYPE_REFUSED_GROUP_CIRCUIT: 22,
// --------------------- // ---------------------
@@ -39,6 +41,7 @@ module.exports = {
FILTER_USER_NO_VERIFIED_APORTADOR: 2097152, FILTER_USER_NO_VERIFIED_APORTADOR: 2097152,
FILTER_USER_SI_TELEGRAM_ID: 4194304, FILTER_USER_SI_TELEGRAM_ID: 4194304,
FILTER_USER_WITHOUT_USERNAME_TELEGRAM: 8388608, FILTER_USER_WITHOUT_USERNAME_TELEGRAM: 8388608,
FILTER_USER_PROVINCE: 16777216,
OPTIONS_SEARCH_ONLY_FULL_WORDS: 1, OPTIONS_SEARCH_ONLY_FULL_WORDS: 1,
OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2, OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2,
@@ -143,6 +146,8 @@ module.exports = {
TABLES_VISU_STAT_IN_HOME: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups', 'circuits'], TABLES_VISU_STAT_IN_HOME: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups', 'circuits'],
TABLES_ADV_NOTIFICATION: ['myskills', 'myhosps', 'mygoods'], TABLES_ADV_NOTIFICATION: ['myskills', 'myhosps', 'mygoods'],
TABLES_ORDER_DATE_UPDATED: ['myskills', 'myhosps', 'mygoods'],
TABLES_ORDER_DESCR: ['mygroups'],
TABLES_EVENTS_NOTIFICATION: ['mybachecas'], TABLES_EVENTS_NOTIFICATION: ['mybachecas'],
TABLES_GROUPS_NOTIFICATION: ['mygroups'], TABLES_GROUPS_NOTIFICATION: ['mygroups'],
TABLES_CIRCUITS_NOTIFICATION: ['circuits'], TABLES_CIRCUITS_NOTIFICATION: ['circuits'],