- aggiornati form registrazione

- Login
- Password dimenticata
- Aggiorna password.
- Email registrazione
- Ammetti Utente
This commit is contained in:
Surya Paolo
2025-11-24 17:42:56 +01:00
parent 00bdc278d8
commit c61572a715
18 changed files with 1278 additions and 284 deletions

View File

@@ -0,0 +1,371 @@
doctype html
html(lang="it")
head
meta(charset="UTF-8")
meta(name="viewport" content="width=device-width, initial-scale=1.0")
style(type="text/css").
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: #f5f5f5;
padding: 20px;
line-height: 1.6;
}
.header-logo {
width: 120px;
height: auto;
margin-bottom: 16px;
display: block;
margin-left: auto;
margin-right: auto;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background: white;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.email-header {
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
color: white;
padding: 40px 24px;
text-align: center;
}
.email-header h1 {
margin: 0 0 8px 0;
font-size: 26px;
font-weight: 600;
line-height: 1.3;
}
.email-header .subtitle {
margin: 8px 0 0 0;
font-size: 17px;
opacity: 0.95;
font-style: italic;
}
.alert-icon {
font-size: 56px;
margin-bottom: 12px;
}
.email-body {
padding: 32px 24px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
}
.request-card {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border: 2px solid #f0ad4e;
border-radius: 8px;
padding: 24px;
margin: 20px 0;
text-align: center;
}
.request-card h3 {
font-size: 14px;
text-transform: uppercase;
color: #f0ad4e;
margin-bottom: 12px;
letter-spacing: 0.5px;
font-weight: 600;
}
.request-card .member-name {
font-size: 28px;
color: #1a1a1a;
font-weight: 700;
margin-bottom: 8px;
}
.request-card .member-detail {
font-size: 15px;
color: #555;
margin: 6px 0;
}
.request-card .member-detail strong {
color: #f0ad4e;
}
.question-box {
background: #fff3cd;
border-left: 4px solid #f0ad4e;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
text-align: center;
}
.question-box p {
font-size: 20px;
color: #1a1a1a;
font-weight: 600;
margin: 0;
line-height: 1.4;
}
.cta-section {
text-align: center;
margin: 32px 0;
padding: 24px 0;
border-top: 2px solid #e0e0e0;
border-bottom: 2px solid #e0e0e0;
}
.cta-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 20px;
}
.cta-button {
display: inline-block;
padding: 18px 56px;
font-size: 20px;
font-weight: 700;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 6px 20px rgba(124, 179, 66, 0.4);
transition: all 0.3s ease;
}
.button-icon {
font-size: 20px;
margin-right: 10px;
vertical-align: middle;
}
.info-box {
background: #e8f5e9;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.info-box p {
margin: 0 0 8px 0;
color: #2e7d32;
font-size: 15px;
line-height: 1.6;
}
.info-box p:last-child {
margin-bottom: 0;
}
.warning-box {
background: #f8d7da;
border-left: 4px solid #dc3545;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.warning-box p {
margin: 0;
color: #721c24;
font-size: 15px;
line-height: 1.6;
}
.warning-box strong {
color: #dc3545;
}
.responsibility-box {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.responsibility-box h3 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.responsibility-item {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
padding: 6px 0;
}
.responsibility-icon {
font-size: 20px;
margin-right: 10px;
min-width: 24px;
flex-shrink: 0;
}
.responsibility-text {
font-size: 15px;
color: #555;
line-height: 1.5;
}
.email-footer {
padding: 20px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.email-footer p {
margin: 4px 0;
}
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 20px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 10px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 22px;
}
.alert-icon {
font-size: 48px;
}
.email-body {
padding: 20px 16px;
}
.request-card .member-name {
font-size: 24px;
}
.question-box p {
font-size: 18px;
}
.cta-button {
padding: 16px 40px;
font-size: 18px;
width: 100%;
max-width: 300px;
}
.responsibility-item {
font-size: 14px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt='RISO - Rete Italiana Scambio Orizzontale')
h1 🔔 Richiesta di Ammissione
p.subtitle Nuovo membro in attesa
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{nomeInvitante}</strong>,<br>
| hai una nuova richiesta di ammissione da confermare!
//- Card richiesta
.request-card
h3 👤 Richiesta di Ingresso
.member-name #{usernameInvitato}
if nomeInvitato
.member-detail
strong Nome:
| #{nomeInvitato}
if emailInvitato
.member-detail
strong Email:
| #{emailInvitato}
//- Domanda di conferma
.question-box
p 🤔 Confermi di conoscere #{nomeInvitato}?
//- CTA principale
.cta-section
.cta-title Ammetti #{usernameInvitato} alla comunità RISO
a.cta-button(href=linkAmmissione target="_blank")
span.button-icon ✓
| Sì, Confermo
//- Responsabilità
.responsibility-box
h3 📋 La tua responsabilità come invitante
.responsibility-item
span.responsibility-icon 🤝
span.responsibility-text
strong Conoscenza diretta:
| Dovresti ammettere solo persone che conosci personalmente e di cui ti fidi
.responsibility-item
span.responsibility-icon 🛡️
span.responsibility-text
strong Fiducia:
| L'ammissione si basa sulla fiducia reciproca nella comunità RISO
.responsibility-item
span.responsibility-icon 👥
span.responsibility-text
strong Supporto:
| Come invitante, aiuterai il nuovo membro a integrarsi nella comunità
//- Info box
.info-box
p
| ✓ Dopo l'ammissione, #{usernameInvitato} potrà completare il profilo
p
| ✓ Il facilitatore locale valuterà l'abilitazione all'uso dei RIS
//- Warning box
.warning-box
p
strong ⚠️ Importante:
| Se non conosci questa persona o hai dubbi sull'ammissione, ti consigliamo di non procedere. Puoi contattare il facilitatore locale per ulteriori informazioni o semplicemente non cliccare sul pulsante di conferma.
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché #{usernameInvitato} ha indicato te come invitante su #{nomeapp}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp} - Rete Italiana Scambi Orizzontali
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

View File

@@ -0,0 +1 @@
=`🎉 ${name ? ', ' + name : username} chiede di essere ammesso su ${nomeapp} !`

View File

@@ -0,0 +1,371 @@
doctype html
html(lang="it")
head
meta(charset="UTF-8")
meta(name="viewport" content="width=device-width, initial-scale=1.0")
style(type="text/css").
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: #f5f5f5;
padding: 20px;
line-height: 1.6;
}
.header-logo {
width: 120px;
height: auto;
margin-bottom: 16px;
display: block;
margin-left: auto;
margin-right: auto;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background: white;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.email-header {
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
color: white;
padding: 40px 24px;
text-align: center;
}
.email-header h1 {
margin: 0 0 8px 0;
font-size: 26px;
font-weight: 600;
line-height: 1.3;
}
.email-header .subtitle {
margin: 8px 0 0 0;
font-size: 17px;
opacity: 0.95;
font-style: italic;
}
.alert-icon {
font-size: 56px;
margin-bottom: 12px;
}
.email-body {
padding: 32px 24px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
}
.request-card {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border: 2px solid #f0ad4e;
border-radius: 8px;
padding: 24px;
margin: 20px 0;
text-align: center;
}
.request-card h3 {
font-size: 14px;
text-transform: uppercase;
color: #f0ad4e;
margin-bottom: 12px;
letter-spacing: 0.5px;
font-weight: 600;
}
.request-card .member-name {
font-size: 28px;
color: #1a1a1a;
font-weight: 700;
margin-bottom: 8px;
}
.request-card .member-detail {
font-size: 15px;
color: #555;
margin: 6px 0;
}
.request-card .member-detail strong {
color: #f0ad4e;
}
.question-box {
background: #fff3cd;
border-left: 4px solid #f0ad4e;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
text-align: center;
}
.question-box p {
font-size: 20px;
color: #1a1a1a;
font-weight: 600;
margin: 0;
line-height: 1.4;
}
.cta-section {
text-align: center;
margin: 32px 0;
padding: 24px 0;
border-top: 2px solid #e0e0e0;
border-bottom: 2px solid #e0e0e0;
}
.cta-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 20px;
}
.cta-button {
display: inline-block;
padding: 18px 56px;
font-size: 20px;
font-weight: 700;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 6px 20px rgba(124, 179, 66, 0.4);
transition: all 0.3s ease;
}
.button-icon {
font-size: 20px;
margin-right: 10px;
vertical-align: middle;
}
.info-box {
background: #e8f5e9;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.info-box p {
margin: 0 0 8px 0;
color: #2e7d32;
font-size: 15px;
line-height: 1.6;
}
.info-box p:last-child {
margin-bottom: 0;
}
.warning-box {
background: #f8d7da;
border-left: 4px solid #dc3545;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.warning-box p {
margin: 0;
color: #721c24;
font-size: 15px;
line-height: 1.6;
}
.warning-box strong {
color: #dc3545;
}
.responsibility-box {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.responsibility-box h3 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.responsibility-item {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
padding: 6px 0;
}
.responsibility-icon {
font-size: 20px;
margin-right: 10px;
min-width: 24px;
flex-shrink: 0;
}
.responsibility-text {
font-size: 15px;
color: #555;
line-height: 1.5;
}
.email-footer {
padding: 20px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.email-footer p {
margin: 4px 0;
}
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 20px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 10px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 22px;
}
.alert-icon {
font-size: 48px;
}
.email-body {
padding: 20px 16px;
}
.request-card .member-name {
font-size: 24px;
}
.question-box p {
font-size: 18px;
}
.cta-button {
padding: 16px 40px;
font-size: 18px;
width: 100%;
max-width: 300px;
}
.responsibility-item {
font-size: 14px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt=nomeapp)
h1 🔔 Richiesta di Ammissione
p.subtitle Nuovo membro in attesa
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{nomeInvitante}</strong>,<br>
| hai una nuova richiesta di ammissione da confermare!
//- Card richiesta
.request-card
h3 👤 Richiesta di Ingresso
.member-name #{usernameInvitato}
if nomeInvitato
.member-detail
strong Nome:
| #{nomeInvitato}
if emailInvitato
.member-detail
strong Email:
| #{emailInvitato}
//- Domanda di conferma
.question-box
p 🤔 Confermi di conoscere #{nomeInvitato}?
//- CTA principale
.cta-section
.cta-title Ammetti #{usernameInvitato} su #{nomeapp}
a.cta-button(href=linkAmmissione target="_blank")
span.button-icon ✓
| Sì, Confermo
//- Responsabilità
.responsibility-box
h3 📋 La tua responsabilità come invitante
.responsibility-item
span.responsibility-icon 🤝
span.responsibility-text
strong Conoscenza diretta:
| Dovresti ammettere solo persone che conosci personalmente e di cui ti fidi
.responsibility-item
span.responsibility-icon 🛡️
span.responsibility-text
strong Fiducia:
| L'ammissione si basa sulla fiducia reciproca nella piattaforma su #{nomeapp}
.responsibility-item
span.responsibility-icon 👥
span.responsibility-text
strong Supporto:
| Come invitante, aiuterai il nuovo membro a integrarsi nella comunità
//- Info box
.info-box
p
| ✓ Dopo l'ammissione, #{usernameInvitato} potrà completare il profilo
p
| ✓ Il facilitatore locale valuterà l'abilitazione all'uso dei RIS
//- Warning box
.warning-box
p
strong ⚠️ Importante:
| Se non conosci questa persona o hai dubbi sull'ammissione, ti consigliamo di non procedere. Puoi contattare il facilitatore locale per ulteriori informazioni o semplicemente non cliccare sul pulsante di conferma.
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché #{usernameInvitato} ha indicato te come invitante su #{nomeapp}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp} - Rete Italiana Scambi Orizzontali
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

View File

@@ -0,0 +1 @@
=`🎉 ${name ? ', ' + name : username} chiede di essere ammesso su ${nomeapp} !`

View File

@@ -331,7 +331,7 @@ html(lang="it")
.riso-info
h3 🍚 Cos'è il Progetto RISO?
p
| RISO è una <strong>rete di comunità territoriali</strong> in tutta Italia dove puoi scambiare beni, servizi e ospitalità con altre persone, usando il <strong>baratto, il dono</strong>, oppure la moneta complementare <strong>RIS</strong>.
| RISO è una <strong>rete di comunità territoriali</strong> in tutta Italia dove puoi scambiare beni, servizi e ospitalità con altre persone, usando il <strong>baratto, il dono</strong>, oppure in <strong>RIS</strong>.
p
| Non è un marketplace commerciale: è una <strong>comunità basata su fiducia e relazioni</strong> reali tra persone che si conoscono e si incontrano.
@@ -368,7 +368,7 @@ html(lang="it")
| <strong>Fiducia:</strong> Base del nostro sistema di scambio
.value-item
span.benefit-icon 🚫
| <strong>Non speculativo:</strong> I RIS non hanno valore in sé, ma solo come <strong>unità di misura</strong> degli scambi
| <strong>Non speculativo:</strong> il RIS non è una moneta complementare, è un Sistema di Credito Naturale. Non serve a 'comprare' cose, ma a <strong>misurare e scambiare l'energia umana</strong>.
.value-item
span.benefit-icon 🌍
| <strong>Sostenibilità:</strong> Promuoviamo stili di vita sani e naturali

View File

@@ -16,14 +16,15 @@ html(lang="it")
padding: 20px;
line-height: 1.6;
}
.header-logo {
width: 80px;
width: 120px;
height: auto;
margin-bottom: 16px;
display: block;
margin-left: auto;
margin-right: auto;
}
}
.email-container {
max-width: 600px;
@@ -35,7 +36,7 @@ html(lang="it")
}
.email-header {
background: linear-gradient(135deg, #027be3 0%, #0056b3 100%);
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
color: white;
padding: 40px 24px;
text-align: center;
@@ -43,90 +44,39 @@ html(lang="it")
.email-header h1 {
margin: 0 0 8px 0;
font-size: 28px;
font-size: 26px;
font-weight: 600;
line-height: 1.3;
}
.email-header p {
margin: 0;
font-size: 16px;
.email-header .subtitle {
margin: 8px 0 0 0;
font-size: 17px;
opacity: 0.95;
font-style: italic;
}
.welcome-icon {
font-size: 48px;
margin-bottom: 16px;
font-size: 56px;
margin-bottom: 12px;
}
.email-body {
padding: 20px 16px;
padding: 32px 24px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 16px;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
}
.credentials-box {
background: #f8f9fa;
border-left: 4px solid #027be3;
border-radius: 8px;
padding: 12px;
margin-bottom: 16px;
}
.credentials-title {
font-size: 15px;
font-weight: 600;
color: #555;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.credential-row {
display: flex;
align-items: center;
padding: 6px 0;
border-bottom: 1px solid #e0e0e0;
}
.credential-row:last-child {
border-bottom: none;
padding-bottom: 0;
}
.credential-label {
font-weight: 600;
color: #666;
min-width: 120px;
font-size: 14px;
}
.credential-value {
color: #1a1a1a;
font-size: 15px;
font-weight: 500;
flex: 1;
word-break: break-word;
}
.credential-value a {
color: #027be3;
text-decoration: none;
}
.credential-value a:hover {
text-decoration: underline;
}
.cta-section {
text-align: center;
margin: 16px 0;
padding: 16px 0;
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
@@ -138,57 +88,22 @@ html(lang="it")
margin-bottom: 16px;
}
.cta-buttons-wrapper {
display: flex;
gap: 12px;
justify-content: center;
align-items: stretch;
flex-wrap: wrap;
margin-top: 16px;
}
.cta-button {
display: inline-block;
padding: 16px 32px;
font-size: 16px;
padding: 16px 48px;
font-size: 18px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #027be3 0%, #0056b3 100%);
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(2, 123, 227, 0.3);
transition: transform 0.2s, box-shadow 0.2s;
flex: 1;
min-width: 180px;
max-width: 220px;
}
.cta-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(2, 123, 227, 0.4);
}
.cta-button-secondary {
background: linear-gradient(135deg, #28a745 0%, #1e7e34 100%);
box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3);
}
.cta-button-secondary:hover {
box-shadow: 0 6px 16px rgba(40, 167, 69, 0.4);
}
.cta-button-tertiary {
background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);
box-shadow: 0 4px 12px rgba(255, 152, 0, 0.3);
}
.cta-button-tertiary:hover {
box-shadow: 0 6px 16px rgba(255, 152, 0, 0.4);
box-shadow: 0 4px 12px rgba(124, 179, 66, 0.3);
transition: all 0.3s ease;
}
.button-icon {
font-size: 18px;
margin-right: 6px;
margin-right: 8px;
vertical-align: middle;
}
@@ -196,31 +111,114 @@ html(lang="it")
margin-top: 16px;
font-size: 13px;
color: #777;
line-height: 1.6;
}
.alternative-link a {
color: #027be3;
color: #558b2f;
text-decoration: none;
word-break: break-all;
}
.info-box {
background: #e3f2fd;
.verification-process {
background: #f8f9fa;
border-radius: 8px;
padding: 10px;
margin-top: 12px;
text-align: center;
padding: 24px 20px;
margin: 24px 0;
}
.info-box p {
.process-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
text-align: center;
margin-bottom: 20px;
}
.process-title .icon {
font-size: 24px;
margin-right: 8px;
vertical-align: middle;
}
.process-steps {
margin: 20px 0;
}
.process-step {
display: flex;
align-items: flex-start;
margin-bottom: 20px;
padding: 16px;
background: white;
border-radius: 8px;
border-left: 4px solid #e0e0e0;
}
.process-step.active {
border-left-color: #7cb342;
background: linear-gradient(135deg, #f8fdf8 0%, #e8f5e9 100%);
}
.step-badge {
min-width: 40px;
height: 40px;
border-radius: 50%;
background: #e0e0e0;
color: #666;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 18px;
margin-right: 16px;
flex-shrink: 0;
}
.process-step.active .step-badge {
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
color: white;
}
.step-content {
flex: 1;
}
.step-content h4 {
font-size: 16px;
color: #1a1a1a;
margin-bottom: 6px;
font-weight: 600;
}
.step-content p {
font-size: 15px;
color: #555;
line-height: 1.5;
margin: 0;
color: #1565c0;
font-size: 14px;
}
.info-note {
background: #fff8dc;
border-left: 4px solid #7cb342;
border-radius: 8px;
padding: 14px;
margin-top: 20px;
}
.info-note p {
margin: 0;
font-size: 15px;
color: #1a1a1a;
line-height: 1.6;
}
.info-note strong {
color: #558b2f;
}
.email-footer {
padding: 16px 12px;
padding: 20px;
text-align: center;
background: #f8f9fa;
color: #777;
@@ -234,115 +232,132 @@ html(lang="it")
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 24px 0;
margin: 20px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 5px;
padding: 10px;
}
.email-header {
padding: 16px 10px;
padding: 24px 16px;
}
.email-header h1 {
font-size: 24px;
font-size: 22px;
}
.welcome-icon {
font-size: 48px;
}
.email-body {
padding: 16px 10px;
}
.credentials-box {
padding: 20px 16px;
}
.credential-row {
flex-direction: column;
align-items: flex-start;
}
.credential-label {
margin-bottom: 4px;
font-size: 13px;
}
.credential-value {
font-size: 14px;
}
.cta-buttons-wrapper {
flex-direction: column;
gap: 12px;
}
.cta-button {
padding: 14px 24px;
font-size: 15px;
padding: 14px 32px;
font-size: 16px;
width: 100%;
max-width: 100%;
max-width: 300px;
}
.verification-process {
padding: 20px 16px;
}
.process-step {
padding: 12px;
}
.step-badge {
min-width: 36px;
height: 36px;
font-size: 16px;
margin-right: 12px;
}
.step-content h4 {
font-size: 15px;
}
.step-content p {
font-size: 14px;
}
}
body
.email-container
//- Header
.email-header
- var baseimg = baseurl + '/';
img.header-logo(src=baseimg+"images/logo.png" alt=nomeapp || 'Logo')
h1 Benvenuto #{name ? ', ' + name : username}
|&nbsp;su #{nomeapp || 'la nostra piattaforma'}!
- var baseimg = baseurl + '/';
img.header-logo(src=baseimg+"images/logo.png" alt=nomeapp || 'RISO')
h1 Benvenuto/a #{name ? name : username} su #{nomeapp}!
p.subtitle Rete Italiana Scambio Orizzontale
//- Body
.email-body
if !verified_email
.intro-text
| Verifica il tuo indirizzo email cliccando sul pulsante qui sotto.
| Per iniziare il tuo percorso in RISO, verifica il tuo indirizzo email cliccando sul pulsante qui sotto.
.cta-section
.cta-title 🔐 1. Verifica il tuo account
.cta-title 🔐 Verifica il tuo account
if strlinkreg
a.cta-button(href=strlinkreg target="_blank")
span.button-icon ✓
| Verifica Registrazione
| Verifica Email
.alternative-link
| Oppure copia e incolla questo link nel tuo browser:
br
a(href=strlinkreg target="_blank") #{strlinkreg}
//- Processo di verifica
.verification-process
.process-title
span.icon 📋
span.icon 🌱
| Il tuo percorso di ingresso in RISO
.process-steps
.process-step
.step-badge 1
.step-content
h4 ✓ Verifica la tua email:
p Cliccando sul bottone qui sopra.
h4 ✓ Verifica la tua email
p Clicca sul pulsante sopra per confermare il tuo indirizzo email.
.process-step.active
.step-badge 2
.step-content
h4 ⏳ In attesa di ammissione
p Il tuo invitante vedrà la tua richiesta. Riceverai un'email appena sarai ammesso !
p Il tuo invitante vedrà la tua richiesta. Riceverai un'email appena sarai ammesso!
.process-step
.step-badge 3
.step-content
h4 🎉 Accesso alla piattaforma
p Potrai così accedere e completare il tuo profilo per iniziare a fare parte della comunità RISO.
h4 🎯 Completa il tuo profilo
p Una volta ammesso, potrai completare il tuo profilo e iniziare a fare parte della comunità RISO.
.process-step
.step-badge 4
.step-content
h4 🍚 Inizia a scambiare
p Crea annunci, scambia beni e servizi, e partecipa agli eventi della tua comunità locale!
.info-note
p
strong 💡 Suggerimento:
| Se dovesse passare più di 24 ore, contatta il tuo invitante per ricordargli di ammetterti.
| Se dovessero passare più di 24 ore senza ammissione, contatta il tuo invitante per ricordargli di approvarti.
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché ti sei registrato su #{nomeapp || 'la nostra piattaforma'}
p(style="margin-top: 12px; font-size: 12px;")
| © #{new Date().getFullYear()} #{nomeapp || ''}.
p Hai ricevuto questa email perché ti sei registrato su #{nomeapp || 'RISO'}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp || 'RISO'} - Rete Italiana Scambi Orizzontali
p(style="margin-top: 8px; font-size: 11px; color: #999;")
| Se non hai richiesto questa registrazione, ignora questa email.
| Se non hai richiesto questa registrazione, puoi semplicemente ignorare questa email.
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

View File

@@ -1,26 +1,128 @@
p Ciao #{name},
p #{nomeapp} recentemente ha ricevuto una richiesta per una password dimenticata.
p Per cambiare la tua password di #{nomeapp}
p <a href=#{strlinksetpassword} target="_blank">Clicca QUI</a>
span Oppure inserisci il codice
span.grande #{tokenforgot_code}
span sulla APP
p
p P.S: Se non sei stato tu a richiedere questo cambiamento, non hai bisogno di fare niente.
p Questo link scadrà tra 4 ore.<br>
p Cordiali Saluti
p Supporto #{nomeapp}
style(type="text/css").
html, body {
padding: 0;
margin: 0;
}
.grande {
font-size: 1.25rem;
font-weight: bold;
}
doctype html
html(lang="it")
head
meta(charset="UTF-8")
meta(name="viewport" content="width=device-width, initial-scale=1.0")
title Recupera Password - #{nomeapp}
body(style="margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); background-color: #f5f7fa;")
// Container Principale
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 40px 20px;")
tr
td(align="center")
// Card Email
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; background: #ffffff; border-radius: 24px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16); overflow: hidden;")
// Header con Icona
tr
td(style="background: linear-gradient(to bottom, rgba(103, 126, 234, 0.08), transparent); padding: 40px 32px 32px; text-align: center; border-bottom: 1px solid rgba(0, 0, 0, 0.06);")
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%")
tr
td(align="center")
// Icona
div(style="width: 100px; height: 100px; margin: 0 auto 20px; background: linear-gradient(135deg, rgba(25, 118, 210, 0.15), rgba(38, 166, 154, 0.15)); border-radius: 50%; display: flex; align-items: center; justify-content: center;")
span(style="font-size: 48px; color: #1976d2;") 🔐
// Titolo
h1(style="margin: 0 0 12px; font-size: 28px; font-weight: 600; color: #1a1a1a; line-height: 1.3;") Recupera la tua Password
p(style="margin: 0; font-size: 16px; color: #666; line-height: 1.5;")
| Ciao
strong(style="color: #333;") #{name}
| , abbiamo ricevuto una richiesta per reimpostare la tua password
// Contenuto Principale
tr
td(style="padding: 32px;")
// Messaggio
p(style="margin: 0 0 24px; font-size: 16px; color: #333; line-height: 1.6;")
| Per cambiare la tua password di
strong #{nomeapp}
| , puoi utilizzare uno dei seguenti metodi:
// Metodo 1: Bottone Link
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 32px;")
tr
td(style="background: linear-gradient(to right, rgba(25, 118, 210, 0.08), transparent); padding: 24px; border-radius: 16px; border: 1px solid rgba(25, 118, 210, 0.15);")
p(style="margin: 0 0 16px; font-size: 14px; font-weight: 600; color: #1976d2; text-transform: uppercase; letter-spacing: 0.5px;") ✨ Metodo 1: Link Diretto
// Bottone CTA
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%")
tr
td(align="center" style="padding: 8px 0;")
a(href=strlinksetpassword target="_blank" style="display: inline-block; padding: 16px 48px; background: linear-gradient(135deg, #1976d2, #42a5f5); color: #ffffff; text-decoration: none; border-radius: 12px; font-size: 16px; font-weight: 600; box-shadow: 0 4px 16px rgba(25, 118, 210, 0.3);")
| 🔓 Reimposta Password
p(style="margin: 16px 0 0; font-size: 13px; color: #666; text-align: center;")
| Il link è valido per
strong(style="color: #f2c037;") 4 ore
// Divisore
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: 24px 0;")
tr
td(style="position: relative; text-align: center;")
div(style="position: relative; height: 1px; background: linear-gradient(to right, transparent, rgba(0, 0, 0, 0.12), transparent);")
span(style="position: relative; top: -12px; display: inline-block; padding: 4px 16px; background: #ffffff; color: #666; font-size: 14px; font-weight: 500; border-radius: 12px; border: 1px solid rgba(0, 0, 0, 0.08);") oppure
// Metodo 2: Codice
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px;")
tr
td(style="background: linear-gradient(to right, rgba(33, 186, 69, 0.08), transparent); padding: 24px; border-radius: 16px; border: 1px solid rgba(33, 186, 69, 0.15);")
p(style="margin: 0 0 16px; font-size: 14px; font-weight: 600; color: #21ba45; text-transform: uppercase; letter-spacing: 0.5px;") 🔢 Metodo 2: Codice di Verifica
p(style="margin: 0 0 12px; font-size: 15px; color: #333;") Inserisci questo codice nell'app:
// Codice Box
div(style="background: #ffffff; border: 2px dashed #21ba45; border-radius: 12px; padding: 20px; text-align: center; margin: 16px 0;")
div(style="font-size: 36px; font-weight: 700; color: #1976d2; letter-spacing: 8px; font-family: 'Courier New', monospace;") #{tokenforgot_code}
p(style="margin: 12px 0 0; font-size: 13px; color: #666; text-align: center;")
| Copia e incolla il codice nell'app per confermare
// Warning Box
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%")
tr
td(style="background: rgba(242, 192, 55, 0.1); padding: 16px; border-radius: 12px; border-left: 4px solid #f2c037;")
p(style="margin: 0; font-size: 14px; color: #666; line-height: 1.6;")
strong(style="color: #333;") ⚠️ Importante:
br
| Se non sei stato tu a richiedere questo cambiamento, ignora questa email. La tua password rimarrà invariata.
// Footer
tr
td(style="background: linear-gradient(to top, rgba(0, 0, 0, 0.02), transparent); padding: 32px; text-align: center; border-top: 1px solid rgba(0, 0, 0, 0.06);")
p(style="margin: 0 0 8px; font-size: 15px; color: #333; font-weight: 600;") Cordiali Saluti
p(style="margin: 0 0 20px; font-size: 15px; color: #1976d2; font-weight: 600;")
| Supporto #{nomeapp}
// Info Footer
p(style="margin: 0; font-size: 13px; color: #999; line-height: 1.6;")
| Questa è una email automatica, per favore non rispondere.
br
| © #{new Date().getFullYear()} #{nomeapp}. Tutti i diritti riservati.
// Versione Mobile (per client email che non supportano media queries)
table(role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 600px; margin: 0 auto; display: none;")
tr
td
style(type="text/css").
@media only screen and (max-width: 600px) {
table[class="mobile-responsive"] {
width: 100% !important;
}
td[class="mobile-padding"] {
padding: 20px 16px !important;
}
h1 {
font-size: 24px !important;
}
.code-box {
font-size: 28px !important;
letter-spacing: 4px !important;
}
}

View File

@@ -78,3 +78,7 @@ Sab 22/11 ORE 23:30: USER [surya1977]: ciao
Dom 23/11 ORE 00:02: USER [perseo5]: ciao
Dom 23/11 ORE 00:22: USER [perseo7]: ciao
Lun 24/11 ORE 13:56: USER [perseo7]: ciao
Lun 24/11 ORE 13:57: USER [perseo7]: chi sono

View File

@@ -5,4 +5,7 @@
"Nuova Registrazione": "Nuova Registrazione",
"Effettuata una Nuova Registrazione": "Effettuata una Nuova Registrazione",
"partecipanti": "partecipanti",
"Il membro ": "Il membro ",
" è stato già Ammesso!": " è stato già Ammesso!",
"Ottimo! Hai ammesso ": "Ottimo! Hai ammesso "
}

View File

@@ -202,6 +202,12 @@ const UserSchema = new mongoose.Schema({
verified_by_aportador: {
type: Boolean,
},
token_da_ammettere: {
type: String,
},
date_token_ammettere: {
type: Date,
},
notask_verif: {
type: Boolean,
},
@@ -1624,6 +1630,57 @@ UserSchema.statics.setUserQualified = async function (idapp, username) {
return !!myrec;
};
UserSchema.statics.setAmmissioneByTokenAndUsername = async function (idapp, username) {
const User = this;
try {
if (username === undefined) return false;
const myquery = {
idapp: idapp,
username: username,
};
let creatoken = true;
let token = '';
const recfound = await User.findOne(myquery, { verified_by_aportador: 1, username: 1, token_da_ammettere: 1 });
if (recfound) {
if (recfound.token_da_ammettere) {
// token già creato
creatoken = false;
token = recfound.token_da_ammettere;
}
}
if (creatoken) {
token = tools.getTokenRandom();
} else {
return recfound;
}
const rec = await User.findOneAndUpdate(myquery, { $set: { token_da_ammettere: token, date_token_ammettere: new Date(), } }, { new: true });
return rec;
} catch (e) {
console.error('Error setAmmissione', e);
}
};
UserSchema.statics.findAmmissioneByTokenAndUsername = async function (idapp, token, username) {
const User = this;
if (username === undefined) return false;
const myquery = {
idapp: idapp,
token_da_ammettere: token,
};
const rec = await User.findOne(myquery, { verified_by_aportador: 1, username: 1, aportador_solidario: 1, idapp: 1, lang: 1 });
return rec && username.toLowerCase() === rec.username.toLowerCase() ? rec : null;
};
UserSchema.statics.setVerifiedByAportador = async function (idapp, username, valuebool) {
const User = this;

View File

@@ -178,29 +178,6 @@ class CronMod {
}
ris = { num };
/*} else if (mydata.dbop === 'visuPlacca') {
mystr = '✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n' +
'NAVI CHE SALPANO DALLA ' + mydata.riga + '.' + mydata.col + ' ALLA ' + mydata.riga + '.' + (parseInt(mydata.col) + 7) + '\n' +
'AUGURI ALLA NUOVA SOGNATRICE !!!\n' +
'✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨';
const visu_nave_Bot = await Settings.getValDbSettings(idapp, 'VISU_NAVE_BOT');
for (let ind = 0; ind < 8; ind++) {
mystr += await Nave.getNavePos(idapp, parseInt(mydata.riga), parseInt(mydata.col) + ind, false);
mystr += tools.ACAPO;
if (visu_nave_Bot && ind === 3) {
await telegrambot.sendMsgTelegramToTheAdmin(idapp, mystr, true);
mystr = '';
}
}
if (visu_nave_Bot)
await telegrambot.sendMsgTelegramToTheAdmin(idapp, mystr, true);
ris = { mystr };
*/
} else if (mydata.dbop === 'CorreggiTabHours') {
ris = await Hours.correggiHours(idapp);
} else if (mydata.dbop === 'setVerifiedByAportadorToALL') {

View File

@@ -293,25 +293,6 @@ function () {
ris = {
num: num
};
/*} else if (mydata.dbop === 'visuPlacca') {
mystr = '✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n' +
'NAVI CHE SALPANO DALLA ' + mydata.riga + '.' + mydata.col + ' ALLA ' + mydata.riga + '.' + (parseInt(mydata.col) + 7) + '\n' +
'AUGURI ALLA NUOVA SOGNATRICE !!!\n' +
'✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨';
const visu_nave_Bot = await Settings.getValDbSettings(idapp, 'VISU_NAVE_BOT');
for (let ind = 0; ind < 8; ind++) {
mystr += await Nave.getNavePos(idapp, parseInt(mydata.riga), parseInt(mydata.col) + ind, false);
mystr += tools.ACAPO;
if (visu_nave_Bot && ind === 3) {
await telegrambot.sendMsgTelegramToTheAdmin(idapp, mystr, true);
mystr = '';
}
}
if (visu_nave_Bot)
await telegrambot.sendMsgTelegramToTheAdmin(idapp, mystr, true);
ris = { mystr };
*/
_context.next = 682;
break;

View File

@@ -5,10 +5,13 @@ const router = express.Router(),
const telegrambot = require('../telegram/telegrambot');
const i18n = require('i18n');
const sharp = require('sharp');
const printf = require('util').format;
const {
authenticate,
authenticate_noerror,
@@ -124,6 +127,78 @@ const UserCost = {
],
};
router.post('/ammetti', (req, res) => {
const body = _.pick(req.body, ['idapp', 'token', 'username']);
const idapp = body.idapp;
const token = body.token;
const username = body.username;
try {
// Cerco il token se è ancora da ammettere
User.findAmmissioneByTokenAndUsername(idapp, token, username)
.then(async (user) => {
if (!user) {
return res.status(404).send();
} else {
const lang = user.lang;
console.log('user', user);
user.verified_by_aportador = false;
if (user.verified_by_aportador) {
res.send({
code: server_constants.RIS_CODE_GIA_AMMESSO,
msg: 'Il membro ' + user.username + ' è stato già Ammesso!',
});
} else {
user.verified_by_aportador = true;
const userDest = await User.getUserShortDataByUsername(user.idapp, user.aportador_solidario);
const myuser = user;
const dati = {
token,
}
const msgOrig = i18n.__(
{ phrase: '✅ Sei stato Ammesso correttamente da %s!', locale: lang },
userDest.username
);
const msgDest = i18n.__(
{ phrase: '✅ %s è stato Ammesso correttamente (da %s)!', locale: lang },
myuser.username,
userDest.username
);
const sendemail = require('../sendemail');
// Invia una email alla persona che è stata ammessa
const ris = await sendemail.sendEmail_Utente_Ammesso(user.lang, userDest.email, userDest, user.idapp, dati);
await telegrambot.sendMsgTelegram(user.idapp, myuser.username, msgOrig);
await telegrambot.sendMsgTelegram(user.idapp, userDest.username, msgDest);
// Invia questo msg anche all'Admin
await telegrambot.sendMsgTelegramToTheAdmin(user.idapp, msgDest, userDest.username);
// user.token_da_ammettere = 'OK';
user.save().then(() => {
res.send({
code: server_constants.RIS_CODE_AMMESSO,
msg: 'Ottimo! Hai ammesso ' + user.username + '!',
//msg: tools.getres__('Ottimo! Hai ammesso', res) + ' ' + user.username + '!',
});
});
}
}
})
.catch((e) => {
console.log('Errore Ammissione:', e.message);
res.status(400).send();
});
} catch (e) {
console.error('Errore: ', e);
res.status(400).send();
}
});
router.post(process.env.LINKVERIF_REG, (req, res) => {
const body = _.pick(req.body, ['idapp', 'idlink']);
const idapp = body.idapp;
@@ -335,7 +410,9 @@ router.post('/sendmailreg', authenticate, async (req, res) => {
const diffMinutes = Math.ceil(diffTime / (1000 * 60));
if (diffMinutes < 5) {
return res.status(200).send({ email_inviata: false, error: 'Attendi qualche minuto prima di reinviare nuovamente.' });
return res
.status(200)
.send({ email_inviata: false, error: 'Attendi qualche minuto prima di reinviare nuovamente.' });
}
ris = await sendemail.sendEmail_Registration(user.lang, user.email, user, user.idapp, user.linkreg);
user.lasttime_email_sent_verify = now;
@@ -396,7 +473,9 @@ router.post('/settable', authenticate, async (req, res) => {
(await !tools.ModificheConsentite(req, params.table, fieldsvalue, mydata ? mydata._id : ''))
) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
if (shared_consts.TABLES_USER_ID.includes(params.table)) {
@@ -533,7 +612,6 @@ router.post('/settable', authenticate, async (req, res) => {
}
}
return await myPromise
.then(async (doupdate) => {
if (false) {
@@ -827,7 +905,9 @@ router.post('/getexp', authenticate, (req, res) => {
if (!User.isAdmin(req.user.perm) && !User.isManager(req.user.perm) && !User.isFacilitatore(req.user.perm)) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
try {
@@ -1334,7 +1414,9 @@ router.patch('/chval', authenticate, async (req, res) => {
!(mydata.table === 'accounts' && (await Account.canEditAccountAdmins(req.user.username, mydata.id)))
) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
const camporequisiti = UserCost.FIELDS_REQUISITI.includes(Object.keys(fieldsvalue)[0]);
@@ -1617,7 +1699,9 @@ router.patch('/askfunz', authenticate, async (req, res) => {
req.user._id.toString() !== id
) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
}
@@ -1676,7 +1760,9 @@ router.patch('/callfunz', authenticate, async (req, res) => {
req.user._id.toString() !== id
) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
}
@@ -1755,7 +1841,9 @@ router.delete('/delrec/:table/:id', authenticate, async (req, res) => {
(await !tools.ModificheConsentite(req, tablename, fields, id, req.user))
) {
// If without permissions, exit
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
let cancellato = false;
@@ -1863,7 +1951,9 @@ router.post('/duprec/:table/:id', authenticate, async (req, res) => {
const mytable = globalTables.getTableByTableName(tablename);
if (!req.user) {
return res.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
return res
.status(server_constants.RIS_CODE_ERR_UNAUTHORIZED)
.send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
/* if (!User.isAdmin(req.user.perm) && !User.isManager(req.user.perm)) {

View File

@@ -140,7 +140,7 @@ router.post('/invia-email', authenticate, async (req, res) => {
});
await listainviti.save();
const ris = await sendemail.sendEmail_InvitaAmico('it', emailAmico, null, idapp, dati);
if (ris) {

View File

@@ -498,9 +498,16 @@ module.exports = {
const strlinkreg = tools.getHostByIdApp(idapp) + `/invitetoreg/${dati.token}`;
return strlinkreg;
},
getLinkAmmissione: function (idapp, user) {
if (user.token_da_ammettere) {
const strlink = tools.getHostByIdApp(idapp) + `/ammetti/${user.token_da_ammettere}/${user.username}`;
return strlink;
}
return '';
},
getPathEmail(idapp, email_template) {
const RISO_TEMPLATES = ['reg_notifica_all_invitante', 'reg_email_benvenuto_ammesso'];
const RISO_TEMPLATES = ['reg_notifica_all_invitante', 'reg_email_benvenuto_ammesso', 'reg_chiedi_ammettere_all_invitante'];
if (idapp === '13') {
if (RISO_TEMPLATES.includes(email_template)) {
@@ -513,6 +520,14 @@ module.exports = {
try {
const nomecognomeInvitante = await User.getNameSurnameByUsername(idapp, user.aportador_solidario, true);
if (!user.verified_by_aportador) {
// Genera Token per Ammettere l'Utente
const r1 = await User.setAmmissioneByTokenAndUsername(idapp, user.username);
if (r1 && r1.token_da_ammettere) {
user.token_da_ammettere = r1.token_da_ammettere;
}
}
let mylocalsconf = {
idapp,
dataemail: await this.getdataemail(idapp),
@@ -522,6 +537,7 @@ module.exports = {
strlinksito: tools.getHostByIdApp(idapp),
strlinkreg: this.getlinkReg(idapp, idreg),
forgetpwd: tools.getHostByIdApp(idapp) + '/requestresetpwd',
linkAmmissione: this.getLinkAmmissione(idapp, user),
emailto: emailto,
verified_email: user.verified_email,
usernameInvitante: user.aportador_solidario,
@@ -547,7 +563,7 @@ module.exports = {
//Invia una email al nuovo utente
await this.sendEmail_base(quale_email_inviare, emailto, mylocalsconf, tools.getreplyToEmailByIdApp(idapp));
if (user.verified_email && user.aportador_solidario) {
if (user.verified_email && user.aportador_solidario && user.verified_by_aportador) {
const pathemail = this.getPathEmail(idapp, 'reg_notifica_all_invitante');
// Manda anche una email al suo Invitante
@@ -558,6 +574,17 @@ module.exports = {
mylocalsconf,
''
);
} else if (user.aportador_solidario && !user.verified_by_aportador) {
const pathemail = this.getPathEmail(idapp, 'reg_chiedi_ammettere_all_invitante');
// Manda una email al suo Invitante per chiedere di essere ammesso
const recaportador = await User.getUserShortDataByUsername(idapp, user.aportador_solidario);
const ris = await this.sendEmail_base(
pathemail + '/' + tools.LANGADMIN,
recaportador.email,
mylocalsconf,
''
);
}
// Send to the Admin an Email
@@ -626,15 +653,18 @@ module.exports = {
emailto: emailto,
usernameInvitante: dati.usernameInvitante,
ammessoUtente: true,
user,
};
const ris = await this.sendEmail_base('reg_email_benvenuto_ammesso/' + lang, emailto, mylocalsconf, '');
const quale_email_inviare = this.getPathEmail(idapp, 'reg_email_benvenuto_ammesso') + '/' + lang;
const ris = await this.sendEmail_base(quale_email_inviare, emailto, mylocalsconf, '');
await telegrambot.notifyToTelegram(telegrambot.phase.AMMETTI_UTENTE, mylocalsconf);
return ris;
} catch (e) {
console.error('Err sendEmail_InvitaAmico', e);
console.error('Err sendEmail_Utente_Ammesso', e);
}
},

View File

@@ -36,6 +36,8 @@ const { MsgTemplate } = require('../models/msg_template');
const i18n = require('i18n');
let url = process.env.URL || 'https://<PUBLIC-URL>';
const Benvenuto = '💓💓💓 Benvenuto/a!';
@@ -916,6 +918,7 @@ const MyTelegramBot = {
callback_data: InlineConferma.RISPOSTA_SI + myfunc + tools.SEP + myuser.username + tools.SEP + userDest,
},
]);
}
/*{
text: '🚫 Rifiuta ' + myuser.username,
@@ -927,7 +930,6 @@ const MyTelegramBot = {
if (telegid > 0) {
cl.setPhotoProfile(myuser, telegid, false);
const rismsg = await MsgTemplate.getMsgByLang(
idapp,
myuser,
@@ -941,7 +943,6 @@ const MyTelegramBot = {
userDest = myuser.aportador_solidario;
let useraportador = await User.getUserShortDataByUsername(idapp, userDest);
const rismsg2 = await MsgTemplate.getMsgByLang(
idapp,
myuser,
@@ -949,7 +950,6 @@ const MyTelegramBot = {
myuser.lang
);
const telegidInvitante = useraportador.profile.teleg_id;
await cl.sendMsgLog(telegidInvitante, rismsg2.body);
@@ -1114,7 +1114,6 @@ const MyTelegramBot = {
}
},
askConfirmationUserFriend: async function (idapp, myfunc, myuser, userDest = '', username = '') {
try {
const cl = getclTelegByidapp(idapp);
@@ -2986,13 +2985,6 @@ class Telegram {
if (recuser) {
rec.user = recuser;
console.log(recuser.username, " SI E' VERIFICATO CON TELEGRAM !");
// let username = recuser.name;
/*if (!!msg.from.username) {
await MyTelegramBot.askConfirmationUser(this.idapp, shared_consts.CallFunz.REGISTRATION, recuser);
} else {
console.log(' ... MA GLI MANCA L\'USERNAME TELEGRAM !! ');
} */
}
}
}
@@ -3318,7 +3310,6 @@ class Telegram {
await this.verificaTelegramCompleted(msg, recuser);
}
}
}
}
@@ -3335,7 +3326,6 @@ class Telegram {
msg.from.last_name || ''
);
rec.status = Status.VERIFIED;
rec.datemenu_updated = null;
rec.menuDb = null;
@@ -4486,6 +4476,8 @@ if (true) {
// RISPOSTE ALLE CALLBACK (Bottoni)
const sendemail = require('../sendemail');
let testo_notifica_di_risposta = '';
try {
@@ -4578,6 +4570,7 @@ if (true) {
);
// Invia una email alla persona che è stata ammessa
const ris = await sendemail.sendEmail_Utente_Ammesso(user.lang, userDest, null, user.idapp, null);
await local_sendMsgTelegram(user.idapp, data.username, msgOrig);
await local_sendMsgTelegram(user.idapp, data.userDest, msgDest);

View File

@@ -96,6 +96,8 @@ const textlang = {
NON_VERIF: 'Non Verificata',
VERIF: 'Verificata',
EMAIL: 'Email',
MEMBRO_AMMESSO: 'Ottimo! Hai ammesso %s!',
MEMBRO_GIA_AMMESSO: 'Il membro %s è stato già Ammesso!',
BOT: 'BOT',
EMAIL_NON_VERIF:
'Email Non Verificata\nleggi la tua casella email e trova **"Confermare la Registrazione"**\ne clicca sul bottone **"Verifica Registrazione"**',

View File

@@ -6,6 +6,9 @@ module.exports = Object.freeze({
RIS_CODE_EMAIL_ALREADY_VERIFIED: -5,
RIS_CODE_EMAIL_VERIFIED: 1,
RIS_CODE_AMMESSO: 1,
RIS_CODE_GIA_AMMESSO: -5,
RIS_CODE_REC_DUPLICATED_DESCR_CITY_USER: -110,
RIS_CODE_REC_ALREADY_EXIST_SYMBOL: -102,
RIS_CODE_REC_ALREADY_EXIST_CODE: -101,
@@ -31,7 +34,7 @@ module.exports = Object.freeze({
RIS_CODE_HTTP_INVALID_TOKEN: 401,
RIS_CODE_HTTP_FORBIDDEN_PERMESSI: 403,
RIS_CODE_HTTP_TOKEN_EXPIRED: 408,
RIS_CODE_TOKEN_RESETPASSWORD_NOT_FOUND: -23,
RIS_SUBSCRIBED_OK: 1,
@@ -53,30 +56,30 @@ module.exports = Object.freeze({
es: 'Suscripción al boletín confirmado!',
it: 'Sottoscrizione alla Newsletter Confermata!',
fr: 'Inscription à la newsletter confirmée!',
de: 'Anmeldung zum Newsletter bestätigt!'
} ,
de: 'Anmeldung zum Newsletter bestätigt!',
},
RIS_SUBSCRIBED_MSG_ALREADYEXIST: {
enUs: 'Subscription already made!',
es: 'Suscripción ya realizada!',
it: 'Sottoscrizione già effettuata!',
fr: 'Abonnement déjà fait!',
de: 'Abonnement bereits gemacht!'
} ,
de: 'Abonnement bereits gemacht!',
},
RIS_SUBSCRIBED_MSG_FAILED: {
enUs: 'Sign Up Failed :(',
es: 'Suscripción al boletín fallido',
it: 'Sottoscrizione alla Newsletter Fallita',
fr: 'Abonnement à la newsletter en échec',
de: 'Abonnement des fehlgeschlagenen Newsletters',
} ,
},
RIS_UNSUBSTR_NOT_EXIST: {
enUs: 'Subscription email not found!',
es: 'Suscripción email no encontrada!',
it: 'Sottoscrizione Email non trovata!',
fr: 'Abonnement courriel introuvable!',
de: 'E-Mail-Abonnement nicht gefunden!'
} ,
de: 'E-Mail-Abonnement nicht gefunden!',
},
RIS_UNSUB_ERROR_FAILED: {
enUs: 'Unsubscribed Failed :(',
@@ -84,16 +87,15 @@ module.exports = Object.freeze({
it: 'Desottoscrizione alla Newsletter Fallita',
fr: 'Désabonnement à la newsletter en échec',
de: 'Abmeldung des fehlgeschlagenen Newsletters',
} ,
},
RIS_UNSUBSCRIBED_MSG_ALREADY_DONE: {
enUs: 'Unsubscription already made!',
es: 'Unsuscripción ya realizada!',
it: 'Desottoscrizione già effettuata!',
fr: 'Désabonnement déjà fait!',
de: 'Abmeldung bereits gemacht!'
} ,
de: 'Abmeldung bereits gemacht!',
},
LIST_END: '10000000',
LIST_START: null,
@@ -101,7 +103,7 @@ module.exports = Object.freeze({
PREFIX_IMG: 'm_',
PREFIX_IMG_SMALL: 'sm_',
DIR_UPLOAD: '/upload', //'/upload'
DIR_UPLOAD: '/upload', //'/upload'
DIR_PUBLIC_LOCALE: '/public',
Privacy: {
@@ -109,7 +111,7 @@ module.exports = Object.freeze({
friends: 'friends',
mygroup: 'mygroup',
onlyme: 'onlyme',
inherited: 'inherited'
inherited: 'inherited',
},
TypeProj: {
@@ -117,13 +119,7 @@ module.exports = Object.freeze({
TYPE_SUBDIR: 2,
},
User_Fields: [
'name',
'surname',
'news_on',
'profile',
],
User_Fields: ['name', 'surname', 'news_on', 'profile'],
FILECONFIG_SERVER: 'lists_serverconfig.txt',
});