210 Commits

Author SHA1 Message Date
Surya Paolo
3d87c336de - aggiornamento di tante cose...
- generazione Volantini
- pagina RIS
2025-12-17 10:07:51 +01:00
Surya Paolo
037ff6f7f9 - verifica email se non è stata verificata (componente)
- altri aggiornamenti grafica PAGERIS.
- OLLAMA AI
2025-12-12 00:44:12 +01:00
Surya Paolo
b8dcd7f5e0 categorie 2025-12-07 15:17:42 +01:00
Surya Paolo
b35c99c8fb ok 2025-12-07 10:48:08 +01:00
Surya Paolo
086e4ab8ba - aggiornati anche i ContribTypes che appaiono sulla card degli annunci 2025-12-07 10:26:35 +01:00
Surya Paolo
139d3fe241 - Aggiornate tutte le categorie ottimizzandole.
- Migrazione delle vecchie categ. con quelle nuove.
- Create le Categorie e sottocategorie degli Eventi (a parte).
- Aggiornato la card dell'Ospitalità
2025-12-07 02:13:26 +01:00
Surya Paolo
6fe3ed7c8b - aggiornamenti guida RIS, FAQ
- Editor HTML aggiunto CSS e Script
- Statistiche
- CRISBalanceBar
- Inizio Sync... (ma disattivato)
2025-12-02 22:16:29 +01:00
Surya Paolo
81ae2df8ef - aggiornato Card service, e CGridTableRec. 2025-11-28 21:28:38 +01:00
Surya Paolo
997a7b8b98 - email Abilitazione Circuito RISO 2025-11-28 18:53:43 +01:00
Surya Paolo
331a5451b2 - fix zona provinciale
- email abilitazione circuito: invio email ad admin
- admin che abilita la fiducia cliccando sul bottone
2025-11-27 23:51:48 +01:00
Surya Paolo
514c2488cc - comune residenza anche sulla email
- comune non obbligatorio... Skippa
2025-11-27 03:15:01 +01:00
Surya Paolo
33e51bac0e - comune residenza anche sulla email 2025-11-27 01:28:25 +01:00
Surya Paolo
c46d23cb83 - corretto altre cose sulla registrazione 2025-11-27 01:12:05 +01:00
Surya Paolo
acb685f819 - aggiunto il Comune di Residenza alla REgistrazione e al Tutorial 2025-11-27 00:48:58 +01:00
Surya Paolo
18790ee379 - Corretto campo "Comune di Residenza".
- Aggiornato Completamento Profilo: Comune di Residenza.
- Registrazione
2025-11-26 18:32:11 +01:00
Surya Paolo
70698fab44 - primo aggiornamento myreccard
- aggiunta sito germogliamo.app
- aggiornato login con il parametro "browser_random" che serve per fare un login anche su 2 pagine contemporaneamente.
2025-11-25 17:45:24 +01:00
Surya Paolo
c61572a715 - aggiornati form registrazione
- Login
- Password dimenticata
- Aggiorna password.
- Email registrazione
- Ammetti Utente
2025-11-24 17:42:56 +01:00
Surya Paolo
00bdc278d8 - aggiornato la guida per installare la App
- aggiornato la Guida Completa e Breve di RISO.
- pagina per ricevere i RIS.
- sistemato problema creazione nuovi Circuiti (admin non corretti).
- corretto giro delle email, invitante, invitato e ricezione msg su telegram.
2025-11-23 01:13:32 +01:00
Surya Paolo
5b1f3eafbc - sistemazioni Email : registrazione, invio invito, email di benvenuto
- fix circuito
- profilo
2025-11-21 20:47:30 +01:00
Surya Paolo
233c5fa28e - risolto problema sull'attivazione del Circuito ITA. non arrivava il messaggio
- sistemazioni sul profilo
2025-11-19 19:44:27 +01:00
Surya Paolo
aa877dea0a - asggiunto bottone "installa app" sulla email di conferma registrazione e anche la Guida "/guida".
- migliorato InvitaAmico
2025-11-19 11:39:42 +01:00
Surya Paolo
657dc79996 - invita amico 2025-11-19 10:09:51 +01:00
Surya Paolo
294155d5a3 - Sistemato INVITI alla App
- Completamento Profilo
- Registrazione tramite Invito, senza richiedere conferma email.
2025-11-18 23:56:15 +01:00
Surya Paolo
1a342de24a fix: se aggiungi XLS non si aggiornava la lista correttamente, non ricaricava... 2025-11-18 13:08:53 +01:00
Surya Paolo
00ce3bd919 corretto bug GruppoMacro la lista veniva salvata ma anche aggiornata in memoria con solo gli ID... in questo caso TABLES_NON_AGGIORNARE_IN_MEMORIA_PERCHE_DIVERSA_STRUTTURA gli dice che alcune tabelle non devono essere aggiornate in memoria. 2025-11-18 11:19:40 +01:00
Surya Paolo
adf1aac10f - aggiornata la grafica della Home di RISO
- Profilo Completition
- Email Verificata
- Invita un Amico (invio di email)
2025-11-15 19:38:55 +01:00
Surya Paolo
26a42b1f30 - versione: 1.2.77
- aggiustamenti e miglioramenti estetici
2025-11-03 14:24:33 +01:00
Surya Paolo
71fe2ae657 - risolto problema spazi vuoti in cima alla app
- risolto problema sulle card di telegram, immagini non alte uguali e non si vedono bene...
2025-11-02 21:16:48 +01:00
Surya Paolo
8d1dd45648 - check updates
- risolto problema della generazione dei PDF, avevo modificato in CMyPageElem , se si cambia qualcosa occorre stare attenti a mettere !hideHeader
2025-11-01 12:00:57 +01:00
Surya Paolo
38c13eef28 - aggiunto Elena come admin di tutti i circuiti ...
shared_consts.USER_ADMIN_CIRCUITS
2025-10-27 13:34:06 +01:00
Surya Paolo
8f54cd2791 - corretto problema ROGNOSO : Risolvere la questione "Sessioni multiple", se apro 2 browser l'ultimo va a cancellare il precedente, e mi da errore di email non valida !
Il problema era sulla fetch nel service worker, gestita in quel modo personalizzato, andava in conflitto, non tenendo le chiamate bloccanti, ma uscivano prima che arrivasse la risposta del server.
- Per chi è da tanto che non si collega a RISO, compare "Email non verificata"... (si risolve chiudendo su ESCI e riloggandosi)... però andrebbe sistemata.
(stesso problema di prima).
2025-10-26 02:48:07 +02:00
Surya Paolo
610961d22c - corretto problema sulle Organizzazioni, non si correttamente chiedevano
- DataInizio e DataFine: creare un componente che controlli la data inizio e fine...
2025-10-11 19:51:59 +02:00
Surya Paolo
3f7eda05cf - Sistemato problema del Circuito ITALIA, quando veniva fatta la richiesta di entrare, ancora non si era entrati nel circuito territoriale.
- Ora pertanto viene inviata la richiesta agli admin solo dopo che l'utente viene abilitato al Circuito provinciale.
2025-10-11 18:36:11 +02:00
Surya Paolo
ebfd80da76 - corretto componente CDateTime
- aggiunto componente CDateTimeStartEnd
2025-10-05 23:59:03 +02:00
Surya Paolo
ede8a2db3d - aggiornamento 1.2.71 2025-10-05 12:17:45 +02:00
Surya Paolo
4e37475d00 - Gestore Ordini GAS (aggiornato)
- Possibilità di modificare un record, click sulla matita rossa.
- corretto altre sistemazioni sui valori di minimo e massimo quantità.
2025-10-03 16:28:53 +02:00
Surya Paolo
6048cd526b Versione 1.2.71:
- sistemato il carrello su GruppoMacro e su PiuCheBuono.
- Corretto visualizzazione della scontistica.
- Se un prodotto viene cancellato ora lo cancella anche sul carrello.
2025-10-02 16:17:57 +02:00
Surya Paolo
1d52ab1d08 - corretto gruppomacro catalogo, info prodotti, estrazione dati da amazon corretto. 2025-09-27 17:24:46 +02:00
Surya Paolo
08cf4b6d9f - aggiunto componenti per Home Template... ma ancora da provare
- sistemato catprods
- Sistemato menu
2025-09-22 19:09:02 +02:00
Surya Paolo
4a05ddee50 - aggiunto FeaturesSection all'editor HTML 2025-09-17 01:21:46 +02:00
Surya Paolo
c37280fa4a Merge branch 'ChatBox' of http://95.216.147.38:3000/surya/freeplanet_serverside into ChatBox 2025-09-16 17:30:40 +02:00
Surya Paolo
d00e086646 - gestione dell'editor delle pagine (non funzionante!) 2025-09-16 17:30:37 +02:00
Surya Paolo
973875ca66 - migliorata la grafica dell'aggiungi elemento. 2025-09-08 20:42:42 +02:00
Surya Paolo
03c2bcb78e - Editor Pagine Elementi: Sezione, Righe, Colonne, Elementi. (rows, columns, elems) 2025-09-08 01:02:39 +02:00
Surya Paolo
a2dd06bd68 - inizio di modifiche all'editor di Pagine Web 2025-09-05 01:06:46 +02:00
Surya Paolo
7ba408c053 - creato editor di Pagine (iniziato)
- fix: mancano i "t," su alcuni componenti...
2025-09-02 16:22:31 +02:00
Surya Paolo
fcbc64cea8 - Modifiche a ProductInfo... Continua 2025-08-29 23:34:08 +02:00
Surya Paolo
2ee710b748 galleria prodotto 2025-08-12 19:43:41 +02:00
Surya Paolo
e3db42dcbc - Iniziato a scrivere la CHATBOT... 2025-08-09 00:48:50 +02:00
Surya Paolo
32210bb96a - corretto sendemail password... l'ho cambiata. e ho messo dei controlli 2025-07-29 12:53:28 +02:00
Surya Paolo
f26ae170bb - Ricerca delle Organizzazioni, per inviare i RIS. 2025-07-21 22:49:55 +02:00
Surya Paolo
a189aeb99c - Poter impostare per ogni Provincia un Circuito RIS specifico, anziché quello provinciale:
Esempio: Napoli: (Circuito RIS Campania) e Sud Sardegna: Cagliari.
2025-07-21 19:08:43 +02:00
Surya Paolo
e118c30f47 - Aggiunta possibilità di disattivare i link alle immagini dei libri. (opzione sul catalogo: disattiva_link_immagini) 2025-07-18 10:43:16 +02:00
Surya Paolo
fb11e15907 - Aggiunta della copertina iniziale nelle raccolte (Catalogo Generale).
- Corretto altezza delle immagini che erano stretchate.
- Fix: poter spostare l'ordinamento dei libri corretto.
2025-07-15 17:46:37 +02:00
Surya Paolo
87c8bf4c45 - corretto import XLS... 2025-07-11 15:03:01 +02:00
Surya Paolo
efd1d12ba7 - Import di un file XLS contenente una lista di libri, all'interno di un catalogo. 2025-07-11 12:55:30 +02:00
Surya Paolo
29437d9d7b . esportazione lista catalogo direttamente in EXCEL, e scelta dei campi. 2025-07-10 00:43:37 +02:00
Surya Paolo
ed27a6f6a5 -statistiche OK 2025-07-08 18:01:24 +02:00
Surya Paolo
d6579763f4 - Aggiunto le Statistiche di visualizzazione delle pagine.
- Aggiunto il componente per visualizzare le statistiche
2025-07-08 16:19:05 +02:00
Surya Paolo
88cb2f13cc - Non funziona l'ammetti il nuovo registrato, sulla App.
- All'interno di una Organizzazione, mostrare se non si è ancora entrati in un Circuito, mettere bottone per Entrare.
2025-07-08 10:25:05 +02:00
Surya Paolo
91ac7a5bde - aggiornato la versione STAMPA, che non funzionava 2025-07-07 09:37:56 +02:00
Surya Paolo
0b06f9f93a - Raccolte Cataloghi corretto e migliorato.
- Bottoni "Apri" e "PDF".
2025-07-06 23:13:03 +02:00
Surya Paolo
a13635ab4e - Sistemato i Referenti (e non Editori), quando crei un nuovo Catalogo ti imposta la proprietà a te, ma chiunque Collaboratore potrebbe cmq modificartelo. 2025-07-01 12:59:54 +02:00
Surya Paolo
31a93424aa - aggiunto filtro nella lista producttable
- ora compare il bottone aggiungi alla lista solo se non è presente.
- corretto la ricerca con "#"
2025-06-25 17:48:44 +02:00
Surya Paolo
8d4158c2c6 - corretto il titolo che lo prendo dall'estrazione del sito... JSON. 2025-06-23 20:48:11 +02:00
Surya Paolo
8c0619992b - Corretta query di estrapolazione libri su GM (Marco)
- aggiornato bestseller su fatlast1Y
- non mostrare piu i libri che non hanno l'immagine (sul catalogo).
- metti online i compressi
2025-06-16 19:36:57 +02:00
Surya Paolo
5668c620da - Sistemato link pdf che ogni volta che si aggiorna prendeva il PDF dalla cache...
- Raccolta Cataloghi, procedura che li AUTO genera in automatico.
2025-06-13 17:46:03 +02:00
Surya Paolo
6b9ddc8986 - Creazione di un Nuovo Catalogo (e la sua relativa pagina), a partire da un modello ed un catalogo esistente.
- Aggiunta dei bottoni sul Ccatalogocard
2025-06-12 23:49:18 +02:00
Surya Paolo
133dc6a502 - aggiornato carrello e bottoni sul catalogo 2025-06-12 10:08:13 +02:00
Surya Paolo
25377090c1 - corretto la gestione degli Sconti
- Duplicare un Catalogo
2025-06-11 01:05:25 +02:00
Surya Paolo
d1d4b73da0 - Esporta Lista Carrello (Totale)
- Sconto Applicato
2025-06-09 09:48:40 +02:00
Surya Paolo
f88f433003 - Aggiunto bottone Aggiungi al Carrello sulla lista dei libri dei cataloghi 2025-06-06 00:07:53 +02:00
Surya Paolo
28a4fe1952 - sistemato "Pare che selezionando una condizione, non sempre viene aggiornato il record !"
- Aggiunto filtro "Escludi Editoriale"
2025-06-04 15:46:39 +02:00
Surya Paolo
f85b8d0637 - Corretto la possibilità di effettuare un Ordine di libri, sul sito gruppomacro.app. arriverà una email a "info@gruppomacro.app". 2025-06-03 01:01:46 +02:00
Surya Paolo
3d6455f23c - generazione della raccolta PDF OK !!! 2025-05-30 16:45:01 +02:00
Surya Paolo
f0c25366db - aggiornato la visualoizzazione per scaricare il PDF e per aprirlo 2025-05-30 10:49:32 +02:00
Surya Paolo
d2aaf78c0e - anche la versione file compressa del PDF ora è ok. 2025-05-29 19:19:40 +02:00
Surya Paolo
40214abe64 - generazione del PDF riscritto totalmente
- ora è possibile generarlo anche da backend
- FIX: corretto la qualità del PDF e la dimensione non esatta in pixel...
2025-05-29 18:23:20 +02:00
Surya Paolo
9efd193124 - versione 1.2.50 2025-05-23 19:02:51 +02:00
Surya Paolo
0e5d28d199 - Finalmente risolto il calcolo e l'impaginazione del PDF, per WEb e per Stampa (300 dpi) !
- corretto altre cose sulla lista cataloghi.
2025-05-23 17:02:41 +02:00
Surya Paolo
d6aaaabb00 - corretto footer catalogo
- corretti il path delle immagini (quando hanno lo spazio nel nomefile).
- aggiunto colore di sfondo per il testo descrittivo, in trasparenza
2025-05-21 12:06:15 +02:00
Surya Paolo
10097f4238 - Per generare la sinossi è possibile estrarre con 1 click la descrizione sia da Amazon che da GruppoMacro.
- corretto piccolo bug sul catalogo.
2025-05-20 12:21:51 +02:00
Surya Paolo
a3c7b92c0c - Estrazione dei dati da Amazon
- Ciclo di Estrapolazione di tutti i prodotti ed aggiornamento dei campi scraped e scraped_updated
- Creazione file CSV con i campi modificati.
2025-05-19 17:33:58 +02:00
Surya Paolo
a374a7d7bc - estrazione dei dati del libro sul sito di Amazon.
- possibilità di visualizzare i dati estratti e di aggiornare i dati, sia solo se vuoti, che sovrascrivere tutti i dati.
2025-05-16 18:52:21 +02:00
Surya Paolo
7e50299854 - ver 1.2.47 :
- corretto errore di modifica scheda
- aggiunto scraping (fase 1)
2025-05-16 10:26:55 +02:00
Surya Paolo
1da0e0f4b5 corretto altre cose (workbox mancante) 2025-05-15 21:41:30 +02:00
Surya Paolo
636136a077 - ho migliorato la grafica della generazione del PDF e PDF Stampa. 2025-05-15 19:18:56 +02:00
Surya Paolo
3521a88395 - ottimizzato il caricamento del sito
- ottimizzato il caricamento del catalogo.
2025-05-15 18:22:43 +02:00
Surya Paolo
768d299881 - sistemato timeout corto
- corretto errori sulla generazione del PDF
- corretto alcune directory
- corretto fs.promise
- corretto CORS !
2025-05-15 14:27:46 +02:00
Surya Paolo
a76d6c9b12 - il catalogo si aggiorna in base alle impostazioni del template anche per la "Stampa" 2025-05-14 20:18:16 +02:00
Surya Paolo
0bf8d3c83c - Assegnazione di linkIdTemplate anche per la "Pagina di Default", in modo che posso da "Templates" cambiare le impostazioni. 2025-05-14 17:04:24 +02:00
Surya Paolo
b2c19801e6 - Generazione della Raccolta dei Cataloghi (web e Stampa), e creazione del PDF Online.
- Lista Raccolta Cataloghi, aggiungi/togli catalogo.
2025-05-14 15:02:21 +02:00
Surya Paolo
ee3846159c - Creazione PDF Temporanei (Generati)
- Assegnazione di questi su PDF OnLine e PDF per Stampa
2025-05-12 18:43:30 +02:00
Surya Paolo
5ab24b2abd - Generazione PDF e per Stampa 2025-05-12 16:34:04 +02:00
Surya Paolo
09a05a11d5 Creazione Nutriben-natoropatia.it 2025-05-11 21:59:25 +02:00
Surya Paolo
6c254a6a8e - Export Lista
- Ordinamento
- PDF Risolto Salvataggio ed invio al server direttamente.
2025-05-08 23:32:19 +02:00
Surya Paolo
240a7be7f1 - Cron Completato 2025-05-08 00:53:33 +02:00
Surya Paolo
58839c32e1 - Aggiunta della funzione Cron
- Flag: Pubblicati OnLine + Solo CagalogoGenerale + Dettagli
2025-05-07 21:58:43 +02:00
Surya Paolo
b77a0579f1 - newsletter: prende la lista utenti (flag news_on)
- Abilita a Tutti la Newsletter news_on
- isCommerciale
- JobsInProgress
- PCB: Corretto Totali che era a zero
2025-05-06 18:19:09 +02:00
Surya Paolo
6e8d1fcff1 Aggiungere un campo "Vagliato dall'Editore" e aggiungere anche il campo "chi" e delle Note 2025-05-02 19:11:35 +02:00
Surya Paolo
192fd4706c - ordinamento aggiornare la pagina "templates" per Fatturati ultimo anno
- bestseller
2025-05-02 10:10:11 +02:00
Surya Paolo
fcc3755c19 - corretto scheda prodotto, record salvato 2025-05-01 00:20:16 +02:00
Surya Paolo
97abe8b46d corretto errore che se sbagliava password dava errore... myuser... 2025-04-30 14:43:45 +02:00
Surya Paolo
e40fbd550b - miglioramenti ricerca titoli e modifica del trafiletto
- miglior visualizzazione delle liste
2025-04-30 13:27:54 +02:00
Surya Paolo
3d4f8b0d04 - aggiornato scheda e rigenera lista
- corretto filtro sulla Collana
2025-04-29 02:30:19 +02:00
Surya Paolo
95793fd73f - Altri aggiornamenti della scheda 2025-04-24 19:31:40 +02:00
Surya Paolo
4b4e3963ac - scheda prodotto migliorata
- aggiornamento filtri
2025-04-24 01:03:27 +02:00
Surya Paolo
85e2df56e1 - ordinamento tabella titoli
- migliorata la lista degli argomenti
2025-04-23 01:59:45 +02:00
Surya Paolo
58431c144c aggiornamento cataloghi, search 2025-04-22 18:30:48 +02:00
Surya Paolo
ad45ce60ee - aggiornamento cataloghi.
possibilità di estrapolare i dati da GM direttamente
- migrazione delle tabelle di GM in locale
- corretto l'ordinamento del Catalogo
2025-04-18 13:23:59 +02:00
Surya Paolo
fba2ebd710 - Aggiornamento dal DB di GM al DB Locale 2025-04-16 23:28:29 +02:00
Surya Paolo
8e8a3204a7 Aggiornamento cataloghi... 2025-04-11 18:49:59 +02:00
Surya Paolo
e1ca4ef17f - aggiornamento catalogo: lista titoli del catalogo
- scheda prodotto libro
- migliorata tabella prodotto
2025-04-04 18:15:21 +02:00
Surya Paolo
5431fe118e - Ricerca Titolo per nome o autore o ISBN o codice articolo 2025-03-31 23:56:01 +02:00
Surya Paolo
789dc1dcae - sendcoins
- font
- catalogo
2025-03-26 23:23:48 +01:00
Surya Paolo
76bacf3f5a fix: non riuscivi ad acquistare i RIS al gruppo
- lista linkREG
2025-03-23 22:54:04 +01:00
Surya Paolo
d94cbde948 aggiornamenti vari... 2025-03-21 19:52:01 +01:00
Surya Paolo
dfe492df45 - corretto la registrazione 2025-03-15 15:35:35 +01:00
Surya Paolo
6c50f35b2b - fix: refresh token, codice di errore ... 2025-03-15 15:04:28 +01:00
Surya Paolo
a03c4cf613 - fix: refresh token, codice di errore ... 2025-03-15 14:52:33 +01:00
Surya Paolo
7d845355a9 - fix: authenticate_withUser mancava su alcuni...
- fix: '/signin' non riproponeva il login nel caso il token fosse invalido
2025-03-14 12:52:44 +01:00
Surya Paolo
aeb83a512b - fix: nModified è stato sostituito con modifiedCount
- .ok con .acknowledged
- coretto la chiamata per il REFRESH TOKEN !
2025-03-14 10:55:37 +01:00
Surya Paolo
e04247b1b6 - fix: ris da inviare al gruppo (nuovamente) e immagini rimaste ancora "images/" anzichè "/images/". 2025-03-13 18:58:26 +01:00
Surya Paolo
f713f66369 - fix: sistemato pagina gruppo che non si visualizzava (errore per modifica)
- fix: corretto il "Invia RIS" al gruppo.
2025-03-13 18:19:42 +01:00
Surya Paolo
f32bd189dc - fatta ottimizzazione della funzione addExtraInfo, chiamando parallelamente tutte le promise... 2025-03-13 12:48:23 +01:00
Surya Paolo
0017f04e45 - risolto problema della non attesa della PWA durante la chiamata a Node.js.
- risolto problema dell'ambiente in Locale HTTPS certificato installato aggiornato.
2025-03-13 12:05:16 +01:00
Surya Paolo
65b29a6eee - fixed: Se tenti d'inviare dei RIS a chi ha raggiunto il limite, deve comparirti un msg ed inviare un msg al destinatario ! 2025-03-12 22:42:43 +01:00
Surya Paolo
7827e49760 versione 1.2.14 :
- aggiornati i file di configurazione, ENV e script non funzionanti., package.
- corretto custom-service-worker.js con CORS
- ottimizzato il server, la chiamata Load iniziale (senza promise, con async/await).
2025-03-12 21:03:02 +01:00
Surya Paolo
d106a59bb5 - corretta configurazione
- fix problemi al database su piuchebuono una chiamata dava errore...
const c = ....
if (mycart && mycart.length > 0) {
2025-03-10 19:59:03 +01:00
Surya Paolo
4758ce0857 - COMPLETAMENTO PASSAGGIO A VITE - versione 1.2.2:
- Sistemato RefreshToken
  - Integrato modifiche di PiuCheBuono
  - Aggiornato a Node 22
  - Aggiornato Server a Mongodb 8.0.
2025-03-10 17:20:57 +01:00
Surya Paolo
6579c6bb3f script... 2025-03-06 18:03:23 +01:00
Surya Paolo
6270991b76 - Conversione Codice... Errore Service Worker regostration.
- Sistemare quasar.config.ts di piuchebuono!
-Le categorie non si vedono piu !!
2025-03-06 01:23:56 +01:00
Surya Paolo
f6d8e1bb0b - aggiornamento con proj RISO. postcss, pwa. 2025-03-05 18:14:09 +01:00
Surya Paolo
f3597facd3 - Aggiornato i vari .ENV 2025-03-04 20:20:26 +01:00
Surya Paolo
8363d65456 - passato mongoose da versione 7 a versione 8 2025-03-03 01:07:00 +01:00
Surya Paolo
0a4cea94ae - passato mongoose da versione 6 a versione 7 2025-03-03 00:59:13 +01:00
Surya Paolo
53a70a1c96 - Aggiornato node.js alla versione 22.18.1
- Aggiornato tutti i pacchetti del server all'ultima versione.
- passato mongoose da versione 5 a versione 6
2025-03-03 00:46:08 +01:00
Surya Paolo
45d06b0923 PASSAGGIO A VITE !
AGG. 1.1.23
2025-03-01 14:17:39 +01:00
Surya Paolo
757bf44c68 Aggiornamento PiuChebuono: lista Totali del Produttore. 2025-02-26 19:08:00 +01:00
Surya Paolo
57679fe649 aggiornamenti vari. prima di VITE 2025-02-25 18:13:01 +01:00
Surya Paolo
f8de205cf6 - aggiornato catalogo lista con filtri per editori e grafico 2025-02-13 21:14:51 +01:00
Surya Paolo
d77f9381e5 - aggiornati gli argomenti in base a GM 2025-02-12 18:31:59 +01:00
Surya Paolo
b643c7cdc3 - Cataloghi aggiornamento... 2025-02-11 18:57:57 +01:00
Surya Paolo
f674791dbc ver: 1.1.21:
- Lista dei Cataloghi
- Gestione Cataloghi in base alla configurazione
2025-02-10 22:48:46 +01:00
Surya Paolo
3e9ab0af53 - AI
- Aggiornamento QUASAR
2025-02-06 19:00:02 +01:00
Surya Paolo
2f92dfe5b0 Cataloghi... 2025-02-05 12:13:27 +01:00
Surya Paolo
41d5f562ec ver 1.1.20:
- corretto campo foto che non compariva più.
 - sistemato i campi aggiuntivi e i richiesti.
- migliorato la barra in alto di selezione.
- aggiunto alcune icone.
2025-02-03 17:18:27 +01:00
Surya Paolo
341b4b8ec7 - Gruppi si chiamano ora "Organizzazioni".
- Categorie dei Gruppi aggiornate.
- Email ora compare sul profilo se non hai telegram e anche sugli annunci.
2025-01-28 23:32:32 +01:00
Surya Paolo
b56e25d1fa - sono uscito da tutti i circuiti che sono a zero e anche admin. 2025-01-15 16:48:31 +01:00
Surya Paolo
332b8992a9 - nella lista circuiti ora si vedono tutti gli annunci del circuito stesso 2025-01-15 15:39:53 +01:00
Surya Paolo
5ba86e3641 - Lista iscritti: aggiunto le note e il flag "Da Contattare" 2025-01-14 19:16:57 +01:00
Surya Paolo
39784aeb0e - aggiunto anche nei beni, servizi e ospitalità la possibilità di aggiungerli come "Gruppo" 2025-01-14 18:34:52 +01:00
Surya Paolo
45be5038b9 piccole modifiche... 2025-01-12 21:29:05 +01:00
Surya Paolo
c631ca9d6a - varie sistemazioni: filtri iscritti, profilo, ecc... 2025-01-11 12:07:58 +01:00
Surya Paolo
fa075683ae - ver 1.1.15 2025-01-09 17:14:31 +01:00
Surya Paolo
836f7f572b -Poter entrare nel login anche con l'username Telegram !
- Se clicchi sulla foto, mi apre il profilo anzichè l'invio dei RIS
- ++ Filtro sulle ricerche: Scegliere un Circuito specifico.
- Nella lista iscritti compaiono anche i cancellati...
- n "Attività" si vede tutto allargato, non sta nella dimensione della pagina.
- Nelle notifiche della campanellina non si vede più il titolo... (è vuoto).
- Non funziona il Filtro per Settore (nella Home sugli Eventi)
- Filtri avanzati da mostrare solo se clicco sul bottone.
- I menu in basso non funzionano !
- Nel menu "Iscritti" del circuito, non compare più la ricerca ! Riattivarla
- Opzione di mandare una email quando uno si registra al Circuito
- ++ Opzione per il Circuito: Chiedi di entrare agli admin (e non in automatico).
2025-01-09 15:17:03 +01:00
Surya Paolo
9fb7df56e6 - catalogo
- corretto logica del RefreshToken che non richiedeva il nuovo token, quindi scadeva tutte le volte, richiedendo sempre l'accesso !
2025-01-07 16:50:55 +01:00
Surya Paolo
7f6ed73763 - risolto Ordinamento Bestseller (a 6 mesi ora)
- EditOn anche per gli Editori
2024-12-17 21:38:10 +01:00
Surya Paolo
300bab2125 - Cataloghi
- Import ed Export Pagine
- ObjectID sostituita con ObjectId
2024-12-17 17:55:47 +01:00
Surya Paolo
14b3e18986 - Aggiornati margini.
- Cataloghi: Export ed Import di una pagine ed i suoi elementi !
2024-12-13 18:09:55 +01:00
Surya Paolo
14bca3e282 - Cataloghi: parte finale... prima bozza 9 dic 2024-12-09 12:32:09 +01:00
Surya Paolo
8803190313 - Catalogo: qualità di stampa, margini. ora è 300 DPI. 2024-12-05 14:12:51 +01:00
Surya Paolo
c914555a5f - prima bozza catalogo 2024-12-02 19:37:53 +01:00
Surya Paolo
351b81308a - Cataloghi: BestSeller, Novità 2024-11-28 16:05:00 +01:00
Surya Paolo
a42c365052 - Impostato i Font giusti e la corretta disposizione del testo e dei suoi margini.
- L'immagine del libro, se è piccolo, viene adattato alla dimensione fissa (vedere se va bene).
2024-11-24 14:40:21 +01:00
Surya Paolo
479934a8fb - Cataloghi: qualita di stampa e margini 2024-11-22 20:23:31 +01:00
Surya Paolo
b1b952d120 - Cataloghi: pagine, schede, formato 2024-11-19 19:18:54 +01:00
Surya Paolo
73cf977754 - fix: Invio RIS (non si vedevano i circuiti !)
- se si usava l'username telegram per registrarsi non faceva il controllo delle minuscole.
- bottone "Invia RIS" era scomparso
2024-11-03 19:15:35 +01:00
Surya Paolo
f89281e316 - ok 2024-11-02 19:25:37 +01:00
Surya Paolo
b7ffd751dc - cataloghi...
- fix: condividi su Telegram non funzionava errore sull'immagine
2024-11-02 18:06:12 +01:00
Surya Paolo
3bdab927b6 - Catalogo: Aggiunta di Schede 2024-10-31 23:22:46 +01:00
Surya Paolo
fa1a2a7cdb - risolto problema cors ?!?
- notifiche transazioni pendenti OK
2024-10-29 02:33:29 +01:00
Surya Paolo
5dac17d1d1 - Continuazione del Catalogo 2024-10-26 17:11:52 +02:00
Surya Paolo
2ac1bc4b7d - Card 2024-10-23 01:41:18 +02:00
Surya Paolo
27aa42507a aggiornamenti su PCB 2024-10-22 15:26:29 +02:00
Surya Paolo
0d466f01b6 - Griglia Orizzontale a Carosello
- Aggiornato Tabella Eventi
- Lista Ultimi Movimenti
- Ultime strette di mano
- Ultimi Invitanti alla App
2024-10-17 00:35:17 +02:00
Surya Paolo
c82bc117cc - Invia e Ricevi RIS (grafica aggiornata)
- Visualizzazione Movimenti (ultimi e successivi), per singolo e di tutti
2024-10-11 02:29:21 +02:00
Surya Paolo
491c9bc220 vers: 1.1.3
- aggiornato ncu -u
2024-10-03 17:09:46 +02:00
Surya Paolo
d438867e3a - piuchebuono: possiblità di modificare l'immagine dalla scheda direttamente
- migliorata di poco la grafica dell'immagine.
2024-10-03 03:55:05 +02:00
Surya Paolo
f9e0175f9b - piuchebuono: possiblità di modificare l'immagine dalla scheda direttamente
- migliorata di poco la grafica dell'immagine.
2024-10-02 23:22:44 +02:00
Surya Paolo
03e5d2ed81 - Fare LISTA MOVIMENTI più comprensibile
- Grafica Circuiti
2024-10-02 03:46:33 +02:00
Surya Paolo
ff1344c06f - Togliere la terza cifra nell'invio dei RIS... massimo 0.99 2024-10-01 00:46:40 +02:00
Surya Paolo
492f599cd9 - Invio RIS migliorata grafica e aggiunto tastierino numerico. 2024-09-30 22:08:33 +02:00
Surya Paolo
0a9e012de0 - fix: La partecipazione agli eventi, non viene salvata correttamente e non visualizzava. 2024-09-30 14:50:19 +02:00
Surya Paolo
0973fc8757 - in fase di registrazione, accettare anche la '@' iniziale. 2024-09-30 00:19:53 +02:00
Surya Paolo
7dac44e0ff - fix: Errore se premevo "Aggiungi" e poi "Annulla" poi la tabella non si aggiornava piu. 2024-09-30 00:05:47 +02:00
Surya Paolo
6289a2e2d2 - Transazioni Pendenti (all'Admin compaiono tutte quelle pendenti e con la possibilità di accettarle) 2024-09-29 23:26:37 +02:00
Surya Paolo
5cca1ed2fa - Inserire l'immagine degli annunci sul bot Telegram 2024-09-29 16:58:14 +02:00
Surya Paolo
ce51c87365 - Statistiche
- Menu e Sottomenu
- Lista ultimi Movimenti
2024-09-26 02:14:33 +02:00
Surya Paolo
ca519baad4 - Tag HTML sugli annunci non vengono visualizzati correttamente... <div>...</div> 2024-09-18 13:11:47 +02:00
Surya Paolo
73cf28ebc2 - corretto img profilo
- corretto coordinata non obbligatoria
2024-09-17 18:49:55 +02:00
Surya Paolo
9985793fcc - Le immagini uploadate non vengono visualizzate subito... cache... aggiungere la versione dell'immagine: vers_img
- Aggiunto il Server TESTRISO e TEST_PCB.
2024-09-17 17:38:47 +02:00
Surya Paolo
dcc2a0ec08 - aggiornato l'Editor HTML 2024-09-13 19:42:48 +02:00
Surya Paolo
f25e1f3992 - Mail in a Box: comandi per aggiungere/modificare/rimuovere le caselle di posta
- aggiunto idMyGroup: ospiti siti di gruppi (AbitareGliIblei)
2024-09-12 14:49:00 +02:00
Surya Paolo
13322a7e0b - Cloudflare e configurazione dominio DNS (host, host_test, host_ip, ecc...) 2024-09-09 21:49:25 +02:00
Surya Paolo
fe4a67c9f1 - AbitaregliIblei.it
- Server aggiornamenti agli script.
- Editor HTML corretto un po'.
- Record Mysql per server (appena iniziato)
2024-09-06 19:57:09 +02:00
Surya Paolo
45f601bd26 - attivita
- gestione degli script sul server
 - creato websocket per interagire con gli script del server.
2024-08-29 23:30:58 +02:00
Surya Paolo
d527f49c5e - Creazione "AbitareGliIblei"
- Mappa Interattiva con i markers
2024-07-31 15:02:40 +02:00
Surya Paolo
21862f87a1 - MultiDominio: api.riso.app, api.gruppomacro.app 2024-07-23 12:25:10 +02:00
Surya Paolo
017ac82d8b Ver 1.0.53 2024-07-03 14:21:02 +02:00
Surya Paolo
76c34dbbe0 tolta la richiesta di accettazione dei RIS, che ora vengono accettati automaticamente. 2024-07-03 13:22:32 +02:00
Surya Paolo
1c7b89a55b - ordinamento per Data 2024-06-21 16:11:03 +02:00
Surya Paolo
c3cc344b9f - aggiornamento Cataloghi
- Gestione delle versioni del prodotto ("Nuovi","Usati","Epub", ecc..)
2024-06-20 17:16:56 +02:00
Surya Paolo
8dbdad1e02 1.0.48
Aggiornamento APP RISO:
 Inviando i RIS, deve comparire prima il Circuito della Provincia, e poi quello Nazionale
 Risolto problema per vecchie registrazioni, la provincia compariva "undefined".
2024-06-19 00:21:39 +02:00
Surya Paolo
b6c6330872 fix, se non hai l'utente che ti ha invitato, da errore la registrazione ! 2024-06-08 08:19:40 +02:00
Surya Paolo
de6066031a aa 2024-06-06 22:49:57 +02:00
Surya Paolo
ef9d7436b2 email 2024-06-06 22:45:49 +02:00
Surya Paolo
1b7a08f14b fix: mygroup non veniva creato i nuovi record ! mancava la dichiarazione 2024-05-30 12:43:51 +02:00
Surya Paolo
ae2298f21a Merge branch 'Dev_PDB1' into develop 2024-05-29 11:14:25 +02:00
Surya Paolo
b9927d8973 Merge branch 'Dev_PDB1' of ssh://risosrv:5522/~/repository/freeplanet_serverside into develop 2023-11-28 14:24:34 +01:00
495 changed files with 226574 additions and 31685 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -4,38 +4,43 @@ PDB=mypassword@1A
SEND_EMAIL=0
SEND_EMAIL_ORDERS=1
PORT=3000
appTelegram_TEST=["1","17","18"]
appTelegram=["1","17","18"]
appTelegram_TEST=["1","17"]
appTelegram=["1","17"]
appTelegram_DEVELOP=["17"]
DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
AUTH_MONGODB=0
ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost
PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true
DEBUG=0
DEBUG=0
VITE_DEBUG=0
TESTING_ON=1
LOCALE=1
DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key
PATH_SERVER_CRT=localhost.crt
PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY=""
PROD=0
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=Askb38v23jjDFaoskBOWj92axXCQ
SECRTK=prova123prova567ASDADASDAS
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
FTPSERVER_HOST=139.162.166.31
FTPSERVER_PORT=21
FTPSERVER_USER=ftpusrsrv_
FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123
AUTH_NEW_SITES=123123123
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
SERVER_A_URL="http://51.77.156.69:3000"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"

View File

@@ -6,36 +6,36 @@ SEND_EMAIL_ORDERS=1
PORT=3000
appTelegram_TEST=["1","13"]
appTelegram=["1","13"]
appTelegram_DEVELOP=["13"]
DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
AUTH_MONGODB=0
ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost
PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true
DEBUG=0
DEBUG=0
VITE_DEBUG=0
TESTING_ON=1
LOCALE=1
DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key
PATH_SERVER_CRT=localhost.crt
PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY=""
PROD=0
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=Askb38v23jjDFaoskBOWj92axXCQ
SECRTK=prova123prova567ASDADASDAS
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
TOKEN_LIFE=1m
REFRESH_TOKEN_LIFE=30d
FTPSERVER_HOST=139.162.166.31
FTPSERVER_PORT=21
FTPSERVER_USER=ftpusrsrv_
FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123
AUTH_NEW_SITES=123123123
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"

View File

@@ -6,36 +6,42 @@ SEND_EMAIL_ORDERS=1
PORT=3000
appTelegram_TEST=["1","13"]
appTelegram=["1","13"]
appTelegram_DEVELOP=["13"]
DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
AUTH_MONGODB=0
ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost
PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true
DEBUG=0
DEBUG=0
VITE_DEBUG=0
TESTING_ON=1
LOCALE=1
DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key
PATH_SERVER_CRT=localhost.crt
PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY=""
PROD=0
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=Askb38v23jjDFaoskBOWj92axXCQ
SECRTK=prova123prova567ASDADASDAS
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
TOKEN_LIFE=30d
REFRESH_TOKEN_LIFE=30d
FTPSERVER_HOST=139.162.166.31
FTPSERVER_PORT=21
FTPSERVER_USER=ftpusrsrv_
FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123
AUTH_NEW_SITES=123123123
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
OLLAMA_URL=http://localhost:11434
OLLAMA_DEFAULT_MODEL=llama3.2:3b
GROK_API="xai-PcNM5obgPaETtmnfDWPZk235D75ZgxENU2QmeqPfMQCHh9dwCDVeRRe0oVVA2YOpiUDh1uJieZsMasja"
REPLICATE_API_TOKEN="r8_AVhM6igwvoOnUA65cHVZdhEDfTqBVk94WTB0u"
FAL_KEY="7d251c88-21b5-4b55-8b3e-4bafd910f99f:b81c0a36a25b052f26eb8ac226c7efff"
HF_TOKEN="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"

40
.env.prod.freeplanet.app Normal file
View File

@@ -0,0 +1,40 @@
DATABASE=FreePlanet
UDB=paofreeplanet
PDB=suerteFreePlanet@1A
SEND_EMAIL=1
PORT=3000
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/www.freeplanet_server
SERVERDIR_WEBSITE=/var/www/www.freeplanet_server
PORT_APP1="0"
DOMAIN=mongodb://localhost:27017/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27017/
AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
VITE_DEBUG=0
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:paolo@freeplanet.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
PROD=1
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"freeplanet.app","port":"3000"}]
#DOMAINS=[{"hostname":"abitaregliiblei.it","port":"3021"},{"hostname":"riso.app","port":"3005"}]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A

View File

@@ -7,29 +7,38 @@ PORT=3000
appTelegram_TEST=["17","18"]
appTelegram=["17","18"]
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=freeplanet_serverside
SERVERDIR_WEBSITE=www.freeplanet_server
DIRECTORY_SERVER=/var/www/nodejs_piuchebuono_server
SERVERDIR_WEBSITE=/var/www/piuchebuono.app
PORT_APP1="0"
DOMAIN=mongodb://localhost:32001/
DOMAIN_OFF=mongodb://localhost:32001/
DOMAIN_AUTH_OLD=mongodb://{username}:{password}@127.0.0.1:32001/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27030/
AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
DEBUG=0
VITE_DEBUG=0
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc"
PRIVATE_VAPI_KEY="LVpFDJuKscdHuQr5pe20dFuYuWX1-ZRb6x72PP-Pp4I"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem
PATH_SERVER_CRT=cert.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
PROD=0
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PROD=1
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
SECRTK=jAxKm02emx5SeJvz2IGmtRf6YqCgope
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
TOKEN_LIFE=30d
REFRESH_TOKEN_LIFE=30d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
DOMAINS=[{"hostname":"piuchebuono.app","port":"3030"},{"hostname":"gruppomacro.app","port":"3010"}]
DOMAINS_ALLOWED=["gruppomacro.app","piuchebuono.app"]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
SERVER_A_URL="http://51.77.156.69:3000"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"

41
.env.prod.riso Normal file
View File

@@ -0,0 +1,41 @@
DATABASE=FreePlanet
UDB=paofreeplanet
PDB=suerteFreePlanet@1A
SEND_EMAIL=1
PORT=0
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/nodejs_riso_server
SERVERDIR_WEBSITE=/var/www/riso.app
PORT_APP1="0"
DOMAIN_OFF=mongodb://localhost:32015/
DOMAIN_AUTH_OLD=mongodb://{username}:{password}@127.0.0.1:32015/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27030/
AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
VITE_DEBUG=0
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PROD=1
PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=30d
REFRESH_TOKEN_LIFE=30d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"riso.app","port":"3006"},{"hostname":"freeplanet.app","port":"3000"},{"hostname":"nuovomondo.app","port":"3032"}]
DOMAINS_NEW=[{"hostname":"riso.app","port":"3006"},{"hostname":"freeplanet.app","port":"3000"},{"hostname":"nuovomondo.app","port":"3032"},{"hostname":"germogliamo.app","port":"3042"}]
DOMAINS_ALLOWED=["riso.app","germogliamo.app","comunitanuovomondo.app","nuovomondo.app","kolibrilab.it","artenergetica.org","freeplanet.app","www.freeplanet.app","freeplanet.app:3000","freeplanet.app:3001","www.freeplanet.app:3000","www.freeplanet.app:3001"]
#DOMAINS=[{"hostname":"abitaregliiblei.it","port":"3021"},{"hostname":"riso.app","port":"3005"}]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A

View File

@@ -7,23 +7,25 @@ PORT=3001
appTelegram_TEST=["17","18"]
appTelegram=["17","18"]
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=freeplanet_serverside
SERVERDIR_WEBSITE=test.freeplanet_server
DIRECTORY_SERVER=/var/www/nodejs_test.piuchebuono_server
SERVERDIR_WEBSITE=var/www/test.piuchebuono.app
PORT_APP1="0"
DOMAIN=mongodb://localhost:32002/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:32002/
AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
MONGODB_PWD=mypwadminS1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
DEBUG=0
VITE_DEBUG=0
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc"
PRIVATE_VAPI_KEY="LVpFDJuKscdHuQr5pe20dFuYuWX1-ZRb6x72PP-Pp4I"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem
PATH_SERVER_CRT=cert.pem
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
PROD=0
@@ -31,4 +33,13 @@ PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"piuchebuono.app","port":"3031"},{"hostname":"gruppomacro.app","port":"3011"}]
DOMAINS_ALLOWED=[]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
SERVER_A_URL="http://51.77.156.69:3000"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"

View File

@@ -4,23 +4,25 @@ PDB=suerteFreePlanet@1A
SEND_EMAIL=1
PORT=3001
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/testriso.freeplanet_serverside
SERVERDIR_WEBSITE=testriso.piuchebuono.app
DIRECTORY_SERVER=/var/www/nodejs_test.riso_server
SERVERDIR_WEBSITE=/var/www/test.riso.app
PORT_APP1="0"
DOMAIN=mongodb://localhost:32002/
DOMAIN=mongodb://localhost:32012/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:32012/
AUTH_MONGODB=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
AUTH_DB_PASSING=1
MONGODB_USER="admin"
MONGODB_PWD="mypwadminS1A"
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
DEBUG=0
VITE_DEBUG=1
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem
PATH_SERVER_CRT=cert.pem
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
PROD=0
@@ -28,4 +30,11 @@ PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"riso.app","port":"3005"},{"hostname":"nuovomondo.app","port":"3033"}]
DOMAINS_ALLOWED=["riso.app","comunitanuovomondo.app","kolibrilab.it","artenergetica.org","freeplanet.app","www.freeplanet.app","freeplanet.app:3000","freeplanet.app:3001","www.freeplanet.app:3000","www.freeplanet.app:3001"]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A

View File

@@ -13,15 +13,15 @@ AUTH_MONGODB=1
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
DEBUG=0
VITE_DEBUG=0
LOCALE=0
DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:paolo@freeplanet.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem
PATH_SERVER_CRT=cert.pem
PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem
PROD=0

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@ node_modules/
.env.production
.env.production.bak
ESEMPI/
OFF/
.idea
package-lock.json
deploynodejs_on_production.sh

43
.vscode/launch.json vendored
View File

@@ -1,18 +1,19 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch via Nodemon",
"program": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js",
"restart": true,
"runtimeExecutable": "node",
"runtimeExecutable": "/usr/local/bin/node",
"runtimeArgs": [
"--inspect=9229" // Use "--inspect=0.0.0.0:9229" for remote debugging
],
"args": [
"${workspaceFolder}/src/server/server.js"
"${workspaceFolder}/src/server.js"
], // Replace with your entry file
"cwd": "${workspaceFolder}",
"autoAttachChildProcesses": true,
@@ -30,12 +31,12 @@
"name": "Launch Trace Warning",
"program": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js",
"restart": true,
"runtimeExecutable": "node",
"runtimeExecutable": "/usr/local/bin/node",
"runtimeArgs": [
"--trace-warnings" // Use "--inspect=0.0.0.0:9229" for remote debugging
],
"args": [
"${workspaceFolder}/src/server/server.js"
"${workspaceFolder}/src/server.js"
], // Replace with your entry file
"cwd": "${workspaceFolder}",
"autoAttachChildProcesses": true,
@@ -49,7 +50,7 @@
},
{
"name": "ServerSide",
"program": "${workspaceFolder}/src/server/server.js",
"program": "${workspaceFolder}/src/server.js",
"request": "launch",
"skipFiles": [
"<node_internals>/**"
@@ -60,5 +61,37 @@
"TESTING_ON": "1"
}
},
{
"type": "node",
"request": "launch",
"name": "Debug CheckSmartBot",
"program": "${workspaceFolder}/../checksmartbot/bot.js",
"console": "integratedTerminal",
"outFiles": [
"${workspaceFolder}/../**/*.js"
],
"envFile": "${workspaceFolder}/.env",
"skipFiles": [
"<node_internals>/**"
],
"autoAttachChildProcesses": true,
"smartStep": true
},
{
"type": "node",
"request": "launch",
"name": "Avvia bot con pm2 (attach)",
"runtimeExecutable": "pm2",
"runtimeArgs": [
"start",
"bot.js",
"--name",
"checksmartbot"
],
"console": "integratedTerminal",
"restart": true,
"port": 9229,
"attach": true
}
]
}

148049
.yarn/releases/yarn-1.22.22.cjs vendored Executable file

File diff suppressed because one or more lines are too long

5
.yarnrc Normal file
View File

@@ -0,0 +1,5 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
yarn-path ".yarn/releases/yarn-1.22.22.cjs"

View File

@@ -0,0 +1,67 @@
#!/bin/bash
source ./.env.prod.freeplanet.app
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
#!/bin/bash
# Configurazione
REMOTE_USER="suryapaolo"
REMOTE_HOST="servereng"
REMOTE_PORT="8855"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.prod_freeplanet.app.js"
ENV_FILE=".env.prod.freeplanet.app"
ENV_OUT=".env.production"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"sass"
"admin_scripts"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file $ENV_FILE su $ENV_OUT ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
"$CONFIG_JS" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "✅ Sincronizzazione completata con successo. SERVER $REMOTE_DIR! "
else
echo "❌ Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi

View File

@@ -0,0 +1,76 @@
#!/bin/bash
source ./.env.production
msg="*** SERVER DI PRODUZIONE **** SEI SICURO DI INVIARE GLI AGGIORNAMENTI SERVERSIDE (NODE JS) - SUL SERVER DI PRODUZIONE ?? $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso NODEPRODUZIONE ... $SERVERDIR_WEBSITE/"
echo ""
#!/bin/bash
# Configurazione
REMOTE_USER="suryapaolo"
REMOTE_HOST="servereng"
REMOTE_PORT="8855"
REMOTE_DIR="$SERVERDIR_WEBSITE"
SSH_OPTIONS="-p $REMOTE_PORT"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"admin_scripts"
"sass"
"src"
)
echo
echo ""
echo "*** Sincronizzazione Cartelle su $REMOTE_DIR ..."
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file .env.production ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
.env.production "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
ecosystem.config.js "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER PRODUZIONE! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

View File

@@ -9,7 +9,7 @@ yarn
### Start the app in development mode (hot-code reloading, error reporting, etc.)
```bash
node src/server/server.js
node src/server.js
```
### Creating the ambient test

View File

@@ -0,0 +1,18 @@
#!/bin/bash
#DATA|TITLE|Input Test
#DATA|DESCRIZ|Input Test
#DATA|SOCK|true
echo "Inizio dello Script... "
echo ".............................................."
if [ "$1" = "" ]; then
read -p "Inserisci il parametro 1 " PARAM1
else
PARAM1=$1
fi
echo "Il parametro 1 è " $PARAM1
echo "FINEEEE!"

View File

@@ -0,0 +1,5 @@
#!/bin/bash
#DATA|TITLE|Mostra i log
#DATA|DESCRIZ|Mostra i log della cartella principale
tail -400f logs/combined*.log

View File

@@ -0,0 +1,7 @@
#!/bin/bash
#DATA|TITLE|lista directory
#DATA|DESCRIZ|Mostra la lista della directory
sleep 1
ls -l

View File

@@ -0,0 +1,78 @@
#!/bin/bash
# Definizione delle variabili
FILEZIP="exp_db_test.tar.gz"
DATABASEIN="FreePlanet"
DATABASEOUT="test_FreePlanet"
FILEMONGODBIN="export_database_$DATABASEIN"
FILEMONGODBOUT="export_database_$DATABASEOUT"
MYDOCKER="mongodbtest"
DIR_OUT="/home/test/"
BACKUP_DIR="/home/pcbuser/backups/temp/"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# Carica le configurazioni
source ~/batch/.my_cfg.ini
echo "Attenzione: Questo script creerà un backup del database esistente $DATABASEOUT"
echo "e lo sovrascriverà con i dati dal file $FILEZIP."
echo "Vuoi procedere? (Si/No)"
read -r risposta
if [[ ! $risposta =~ ^[Ss][iI]$ ]]; then
echo "Operazione annullata dall'utente."
exit 0
fi
echo "Inizio del processo di importazione del database"
echo "------------------------------------------------"
# Verifica l'esistenza del file .tar.gz
if [ ! -f "/home/pcbuser/$FILEZIP" ]; then
echo "ERRORE: Il file $FILEZIP non esiste nella directory /home/pcbuser/"
exit 1
fi
# Backup del database esistente
echo "Creazione di un backup del database esistente...$DATABASEOUT"
if docker exec "$MYDOCKER" mongodump --username admin --password "$PWDDB_TEST" --authenticationDatabase admin --db "$DATABASEOUT" --out "$BACKUP_DIR$DATABASEOUT_$TIMESTAMP"; then
echo "Backup del database esistente completato con successo in $BACKUP_DIR$DATABASEOUT_$TIMESTAMP"
else
echo "ERRORE: Impossibile creare il backup del database esistente $DATABASEOUT."
exit 1
fi
echo "Copiando $FILEZIP nel container $MYDOCKER..."
if docker cp "/home/pcbuser/$FILEZIP" "$MYDOCKER:$DIR_OUT"; then
echo "File copiato con successo."
else
echo "ERRORE: Impossibile copiare il file nel container."
exit 1
fi
echo "Estraendo $FILEZIP in $DIR_OUT all'interno del container..."
if docker exec "$MYDOCKER" tar -xvzf "$DIR_OUT$FILEZIP" -C "$DIR_OUT"; then
echo "Estrazione completata con successo."
else
echo "ERRORE: Impossibile estrarre il file nel container."
exit 1
fi
echo "Rinominando la directory del database da $FILEMONGODBIN a $FILEMONGODBOUT..."
if docker exec "$MYDOCKER" mv "$DIR_OUT$FILEMONGODBIN" "$DIR_OUT$FILEMONGODBOUT"; then
echo "Directory rinominata con successo."
else
echo "ERRORE: Impossibile rinominare la directory."
exit 1
fi
echo "Ripristinando il database MongoDB dal dump..."
if docker exec "$MYDOCKER" mongorestore --username admin --password "$PWDDB_TEST" --authenticationDatabase admin --nsFrom="$DATABASEIN.*" --nsTo="$DATABASEOUT.*" "$DIR_OUT$FILEMONGODBOUT"; then
echo "Database ripristinato con successo."
else
echo "ERRORE: Impossibile ripristinare il database."
exit 1
fi
echo "------------------------------------------------"
echo "Processo di importazione del database completato"

View File

@@ -0,0 +1,361 @@
db.myelems.insertMany([
{
"_id": new ObjectId("669fbf9dc9d625d0628eb12f"),
"order": 20,
"active": true,
"type": 20,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"containerHtml": "<div style=\"text-align: center;\"><b><font size=\"4\">Abitare Gli Iblei</font></b></div>",
"anim": {
"_id": new ObjectId("66e456981e0719a1012121c0"),
"name": "",
"clduration": "",
"cldelay": "",
"timingtype": "ease-in-out"
}
}, {
"_id": new ObjectId("669fbfc3c9d625d0628eb131"),
"order": 100,
"active": true,
"type": 145,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0
}, {
"_id": new ObjectId("66db2a45054b3b09f85e6983"),
"order": 26,
"active": true,
"type": 35,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"image": "logo.jpg",
"anim": {
"_id": new ObjectId("66db34215740efc77547a93a"),
"name": "",
"clduration": "",
"cldelay": "",
"timingtype": "ease-in-out"
},
"widthimg": "250px",
"align": 2
}
, {
"_id": new ObjectId("66db38a77e24f4509eef655b"),
"order": 26,
"active": true,
"type": 20,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"containerHtml": "<style>\nbody {\n    font-family: Arial, sans-serif;\n    margin: 0;\n    padding: 20px;\n    background-color: #f0f0f0;\n    color: #333;\n}\n\nh1 {\n    color: #0056b3;\n    text-align: center;\n}\n\n\np, li {\n    line-height: 1.6;\n}\n\n\nul {\n    list-style-type: none;\n    padding: 0;\n}\n\n\nli {\n    background-color: #fff !important;\n    margin-bottom: 10px !important;\n    padding: 10px !important;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important; \n}\n\n\na {\n    color: #007bff;\n    text-decoration: none;\n}\n\n\na:hover {\n    text-decoration: underline;\n}\n\n\n.container {\n    max-width: 800px;\n    margin: 0 auto;\n    background-color: #fff;\n    padding: 20px;\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n}\n\n\n.strong {\n    font-weight: bold;\n}\n</style>\n\n\n<p><strong>“Abitare gli Iblei”</strong> è una rete aperta che ha lo scopo di riunire tutte quelle persone che vogliono valorizzare e qualificare la vita nel territorio degli Iblei.&nbsp;</p>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <p>Chi aderisce alla rete si riconosce in una <strong>Carta dei valori comuni</strong> e usa la rete per scambiare conoscenze, esperienze, risorse e prodotti sviluppati nellambito delle proprie iniziative (profit e non profit) individuali o collettive.</p>\n\n\n&nbsp; &nbsp; <p>Larea territoriale di questa rete è quella dei <strong>Monti Iblei orientali e occidentali</strong> (Noto, Avola, Canicattini, Siracusa, Palazzolo, Buccheri, Ferla, Modica, …).</p>\n\n\n&nbsp; &nbsp; <p>La rete <strong>“Abitare gli Iblei”</strong> offre i seguenti servizi utili per il territorio ed i suoi abitanti, frutto di una costruzione collettiva:</p>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <ul>\n&nbsp; &nbsp; &nbsp; &nbsp; <li><strong>1. Mappa delle attività virtuose:</strong> permette di identificare attività pubbliche e private nel territorio che possono essere utili nella vita quotidiana. Queste attività possono riguardare artigiani, produttori o fornitori di servizi di cui almeno un membro della rete conosca la qualità e laffidabilità (agricoltori, falegnami, fabbri, idraulici, imprese edili, strutture ricettive, …). Altre informazioni utili possono riguardare associazioni/istituzioni operanti in vari settori. <strong>Accesso pubblico</strong></li>\n&nbsp; &nbsp; &nbsp; &nbsp; <li><strong>2. Calendario:</strong> permette di accedere ad annunci di eventi utili alla crescita culturale del territorio. La pubblicazione di eventi è riservata ai soli membri della rete che possono presentare iniziative anche di altri organizzatori. <strong>Accesso pubblico</strong></li>\n&nbsp; &nbsp; &nbsp; &nbsp; <li><strong>3. Scambi di servizi, prodotti e ospitalità:</strong> questa funzione è riservata ai soli membri della rete e si realizza attraverso la Rete Italiana scambio orizzontale (RISO). <strong>Accesso riservato</strong></li>\n&nbsp; &nbsp; &nbsp; &nbsp; <li><strong>4. Segnalazione di pericoli per il territorio:</strong> attraverso questa mappa è possibile segnalare incendi, immondizia abbandonata, discariche abusive, fonti di inquinamento per corsi dacqua e spiagge, presenza di inquinamento nellaria, … <strong>Accesso riservato</strong></li>\n&nbsp; &nbsp; </ul>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <p>Se vuoi aderire alla rete puoi richiederne la registrazione utilizzando questo Link <a href=\"#\"><strong>(Pagina in Costruzione)</strong></a>.</p>\n\n",
"anim": {
"_id": new ObjectId("66db393e3b885ccdfaed28d6"),
"name": "",
"clduration": "",
"cldelay": "",
"timingtype": "ease-in-out"
}
}
, {
"_id": new ObjectId("66e41cff78c8d880eebfbf1c"),
"order": 32.5,
"active": true,
"type": 20,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"containerHtml": "ORAAAA",
"anim": {
"_id": new ObjectId("66e459421e0719a1012123ad"),
"name": "",
"clduration": "",
"cldelay": "",
"timingtype": "ease-in-out"
}
}
,
{
"_id": new ObjectId("66e4270d78c8d880eebfbf24"),
"order": 40,
"active": true,
"type": 20,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"containerHtml": "BBB",
"anim": {
"_id": new ObjectId("66e4568d1e0719a1012121a6"),
"name": "",
"clduration": "",
"cldelay": "",
"timingtype": "ease-in-out"
}
}, {
"_id": new ObjectId("66e45b0c78c8d880eebfbf45"),
"order": 70,
"active": true,
"type": 20,
"path": "home",
"container": "",
"idapp": "19",
"elemsText": [],
"listcards": [],
"list": [],
"__v": 0,
"containerHtml": "AAAA"
}]);
db.sites.insert(
/* 1 */
{
"_id": new ObjectId("669fbef7fc704b8912263af9"),
"confpages": {
"font": "",
"col_toolbar": "",
"col_bgfooter": "",
"show_darkopt": false,
"showButtHome": true,
"showProfile": false,
"showUserMenu": true,
"showiscrittiMenu": true,
"showRegButton": true,
"enableReg": false,
"showNL": false,
"sendNewsletter": true,
"showMsgs": false,
"showNotif": true,
"showCoins": false,
"showRIS": false,
"showMenuCoins": false,
"showNameSurname": true,
"showCompetenze": true,
"showConnected": false,
"bookingEvents": false,
"enableEcommerce": false,
"enableAI": false,
"enableGroups": true,
"enableCircuits": false,
"enableProj": false,
"enableTodos": false,
"enableRegByBot": false,
"enableRegMultiChoice": false,
"enableTokenExpired": true,
"enableDebugOn": false,
"enabledRegNeedTelegram": false,
"showViewEventi": false,
"showViewGroups": false,
"showViewCircuits": false,
"showViewUsers": false,
"showViewBooking": false,
"showViewProfile": true,
"showViewCart": false,
"showViewOrders": false,
"enablePwa": true,
"lang": 0,
"videoPromo": "",
"PDFPromo": ""
},
"confsite": {
"options": 64
},
"policy": {
"show": false
},
"contacts": {
"facebook": "",
"instagram": "",
"whatsapp": "",
"whatsapp_home": false,
"telegram": "",
"youtube": "",
"email": "",
"address": "",
"map": "",
"info2": "",
"cell": ""
},
"ecomm": {
"enablePreOrders": false,
"NoteExtraOnCart": ""
},
"name": "Abitare Gli Iblei",
"host": "https://abitaregliiblei.it",
"active": true,
"idapp": "19",
"adminemail": "surya@riso.app",
"__v": 0,
"dir": "/Users/suryapaolo/myproject/newfreeplanet/",
"dir_test": "/Users/suryapaolo/myproject/newfreeplanet/",
"host_test": "https://test.abitaregliiblei.it",
"host_ip": "65.108.222.97",
"host_api_ip": "65.108.222.97",
"host_api": "https://api.abitaregliiblei.it",
"host_testapi": "https://testapi.abitaregliiblei.it",
"host_testapi_ip": "65.108.222.97",
"host_test_ip": "65.108.222.97",
"cf_token": "M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0",
"cf_zoneId": "cd7447660fcc6534ca7ce4c135df1e54",
"enable_servermail_this_domain": "true",
"servermail": "box.lamiaposta.org",
"servermailip": "65.21.63.147",
"enable_servermail": true,
"dkim": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv++u/ysGgAGfOaSCLmNkfnczedXXDRdJUi+M+gZTVk7XfGZLlLWh00xXgOIj1lU4jRgFnQx39SSbsS9foPLMrCXnPcSnPPCUpDbmkKtGlWPZDncOUGIZVpNpFMOBul+p+SckUW7gomayV1dluFw72oNLlc/Y0CVWT5Le0OL66FG7D0",
"manageremail": "reg@abitaregliiblei.it",
"idMyGroup": "AbitareGliIblei"
}
)
db.users.insert(
{
"_id": new ObjectId("669fbef7c9d625d0628eb12d"),
"profile": {
"paymenttypes": [],
"notif_idCities": [],
"notif_provinces": [],
"notif_regions": [],
"notif_sectors": [],
"notif_sector_goods": [],
"img": "",
"nationality": "",
"intcode_cell": "",
"cell": "",
"dateofbirth": null,
"sex": 0,
"country_pay": "",
"email_paypal": "",
"payeer_id": "",
"advcash_id": "",
"revolut": "",
"link_payment": "",
"note_payment": "",
"username_telegram": "",
"teleg_id": 0,
"teleg_checkcode": 0,
"my_dream": "",
"manage_telegram": false,
"admin_telegram": false,
"saw_zoom_presentation": false,
"ask_zoom_partecipato": false,
"saw_and_accepted": 0,
"socio": false,
"socioresidente": false,
"qualified": false,
"qualified_2invitati": false,
"myshares": [],
"friends": [],
"req_friends": [],
"handshake": [],
"mygroups": [],
"mycircuits": [],
"last_circuitpath": "",
"notifs": [
{
"dir": 1,
"value": 88
},
{
"dir": 2,
"value": 4
},
{
"dir": 3,
"value": 1
},
{
"dir": 4,
"value": 1
},
{
"dir": 5,
"value": 1
},
{
"dir": 11,
"value": 1
},
{
"dir": 12,
"value": 1
}
],
"stepTutorial": 0,
"noNameSurname": false,
"noCircuit": false,
"noCircIta": false,
"noFoto": false,
"resid_province": "",
"resid_card": "",
"seen": [],
"bookmark": [],
"favorite": [],
"attend": [],
"version": 10060
},
"ipaddr": "::1",
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJ2aW5jZW56b2Zhenppbm81OEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6IkVuem8iLCJpYXQiOjE3MjY0MTM2NTh9.YlgziPXK2ZeWe_buExvHnelMMc",
"lasttimeonline": ISODate("2024-09-15T20:09:41.378Z"),
"date_reg": ISODate("2024-09-15T15:20:58.743Z"),
"aportador_iniziale": "------",
"idMyGroup": "abitaregliiblei",
"useragent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
"email": "surya@riso.app",
"username": "admin",
"password": "$2a$12$Dr58jMRtbt6Y3y6MYFopCO07hBo20TlmdzJW.lVvRIhNy7yFFizT2",
"name": "admin",
"index": 1,
"surname": "",
"lang": "it",
"verified_email": true,
"verified_by_aportador": true,
"perm": 3,
"retry_pwd": 0,
"deleted": false,
"lang": "it",
"aportador_solidario": "------",
"tokens": [
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
"_id": new ObjectId("66e6fcf1ac95a84fd0e11b2c"),
"access": "auth",
"browser": "Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.127 Mobile Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
"date_login": ISODate("2024-09-15T15:27:45.368Z")
},
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
"_id": new ObjectId("66e73f04ac95a84fd0e122ae"),
"access": "auth",
"browser": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",
"date_login": ISODate("2024-09-15T20:09:40.212Z")
}
],
});

View File

@@ -0,0 +1,92 @@
db.attivitas.insertMany([
{
"_id": "66db5bd1c76639f8b2c67e55",
"coordinate_gps": {
"address": "Via Roma, Gaggio Montano, Unione dell'Appennino Bolognese, Bologna, Emilia-Romagna, 40041, Italia",
"type": "Point",
"coordinates": [
10.953268,
44.190335
]
},
"idSkill": 0,
"idCity": [
744
],
"userId": "66db21115281b23462d496d2",
"idapp": "19",
"descr": "Esempio di Attività",
"idSector": 2,
"note": "Descrizione dell'attività",
"tipodiAttivita": 2,
"createdBy": "paoloar77",
"date_updated": ISODate("2024-09-06T19:45:21.527Z"),
"photos": [],
"date_created": ISODate("2024-09-06T19:45:21.530Z"),
"__v": 0,
"numattend": 0,
"numbook": 0,
"numfav": 0,
"numseen": 2
},
{
"_id": "66e2ec7c475c299010b76fe7",
"coordinate_gps": {
"address": "14, Corso Vittorio Emanuele, Noto, Siracusa, Sicilia, 96017, Italia",
"type": "Point",
"coordinates": [
15.070645,
36.890886
]
},
"idSkill": 0,
"idCity": [
6908
],
"userId": "66e2ead3ee075227efd521ad",
"idapp": "19",
"tipodiAttivita": 1,
"descr": "Esempio 2",
"idSector": 2,
"note": "Descrizione dell'Attività....",
"createdBy": "Paolo7",
"date_updated": ISODate("2024-09-12T13:28:28.593Z"),
"photos": [],
"date_created": ISODate("2024-09-12T13:28:28.597Z"),
"__v": 0,
"numattend": 0,
"numbook": 0,
"numfav": 0,
"numseen": 2
},
{
"_id": "66e31772d0acc6ce435a868b",
"coordinate_gps": {
"address": "Via Roma, Anzio, Anzio Colonia, Anzio, Roma, Lazio, 00042, Italia",
"type": "Point",
"coordinates": [
12.626422,
41.448654
]
},
"idSkill": 1,
"idCity": [
5903
],
"userId": "66db21115281b23462d496d2",
"idapp": "19",
"descr": "prova3",
"tipodiAttivita": 1,
"idSector": 1,
"note": "asdasd",
"createdBy": "paoloar77",
"date_updated": ISODate("2024-09-12T16:31:46.361Z"),
"photos": [],
"date_created": ISODate("2024-09-12T16:31:46.364Z"),
"__v": 0,
"numattend": 0,
"numbook": 0,
"numfav": 0,
"numseen": 1
}
]);

View File

@@ -0,0 +1,36 @@
db.mygroups.insert(
{
"_id": "66e2e6273eff2ca4e7b2ef92",
"idCity": [
6908,
5634
],
"note": "Descrizione...",
"visibility": [
0
],
"deleted": false,
"groupname": "abitaregliiblei",
"photos": [],
"admins": [
{
"_id": new ObjectId("66e2e6276b502b07f1e89571"),
"username": "paoloar77"
}
],
"req_users": [],
"blocked": false,
"website": "",
"link_telegram": "",
"userId": "66db21115281b23462d496d2",
"idapp": "19",
"title": "Abitare Gli Iblei",
"descr": "Abitare Gli Iblei",
"idCatGrp": 14,
"createdBy": "paoloar77",
"date_updated": ISODate("2024-09-12T13:01:27.954Z"),
"refused_users": [],
"mycircuits": [],
"date_created": ISODate("2024-09-12T13:01:27.960Z"),
"__v": 0
});

View File

@@ -0,0 +1,27 @@
db.mypages.insertMany([
{
"_id": new ObjectId("66db21118009ea4503bb6a01"),
"order": 10,
"idapp": "19",
"path": "home",
"active": true,
"title": "Home",
},
{
"_id": new ObjectId("66db21118009ea4503bb6a03"),
"order": 10,
"idapp": "19",
"path": "presentazione",
"active": true,
"title": "Presentazione",
},
{
"_id": new ObjectId("66e322dd5a6360e3b3c71c5a"),
"order": 40,
"idapp": "19",
"path": "presentazione",
"active": true,
"title": "Presentazione",
"inmenu": true,
"icon": "fas fa-info"
}]);

View File

@@ -0,0 +1,338 @@
db.users.insertMany([
{
"_id": new ObjectId("66db21115281b23462d496d2"),
"profile": {
"paymenttypes": [],
"notif_idCities": [],
"notif_provinces": [],
"notif_regions": [],
"notif_sectors": [],
"notif_sector_goods": [],
"myshares": [],
"friends": [],
"req_friends": [],
"handshake": [],
"mygroups": [
{
"groupname": "abitaregliiblei",
"date": ISODate("2024-09-12T13:01:27.975Z")
}
],
"mycircuits": [],
"notifs": [
{
"dir": 1,
"value": 88
},
{
"dir": 2,
"value": 4
},
{
"dir": 3,
"value": 1
},
{
"dir": 4,
"value": 1
},
{
"dir": 5,
"value": 1
},
{
"dir": 11,
"value": 1
},
{
"dir": 12,
"value": 1
}
],
"seen": [],
"bookmark": [],
"favorite": [],
"attend": [],
"special_req": true,
"nationality": "IT",
"manage_telegram": true,
"admin_telegram": true,
"teleg_id": 12429864,
"username_telegram": "surya1977",
"version": 10060
},
"retry_pwd": 0,
"deleted": false,
"tokens": [
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3Mjc3MjI0NjV9.EOvF89kswT1eqVJCSwVMMI-jB4kokP-aQVhi7xSUods",
"_id": new ObjectId("66e87ee1bbe2ce0f77adf6b8"),
"access": "auth",
"browser": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3MjY1MjAwNjV9.ESvyTWmXhfAQ0i-wwjxZR1A1Y5Bwixb60uG_UcOPQ5Y",
"date_login": ISODate("2024-09-16T18:54:25.147Z")
}
],
"idapp": "19",
"email": "paolo@riso.app",
"username": "paoloar77",
"password": "$2a$12$rhq.rkdMWP4cE1MOweztiOPeAmwHYVCW9q5vyH4LVGelEssUFRl8C",
"name": "paoloar77",
"index": 1,
"surname": "",
"lang": "it",
"verified_email": true,
"verified_by_aportador": true,
"perm": 3,
"lasttimeonline": ISODate("2024-09-16T18:55:22.278Z"),
"date_reg": ISODate("2024-09-06T15:34:41.673Z"),
"__v": 13,
"useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
},
{
"_id": new ObjectId("66e49515d18d313a144ead56"),
"profile": {
"paymenttypes": [],
"notif_idCities": [],
"notif_provinces": [],
"notif_regions": [],
"notif_sectors": [],
"notif_sector_goods": [],
"img": "",
"nationality": "",
"intcode_cell": "",
"cell": "",
"dateofbirth": null,
"sex": 0,
"country_pay": "",
"email_paypal": "",
"payeer_id": "",
"advcash_id": "",
"revolut": "",
"link_payment": "",
"note_payment": "",
"username_telegram": "",
"teleg_id": 0,
"teleg_checkcode": 0,
"my_dream": "",
"manage_telegram": false,
"admin_telegram": false,
"saw_zoom_presentation": false,
"ask_zoom_partecipato": false,
"saw_and_accepted": 0,
"socio": false,
"socioresidente": false,
"qualified": false,
"qualified_2invitati": false,
"myshares": [],
"friends": [],
"req_friends": [],
"handshake": [],
"mygroups": [],
"mycircuits": [],
"last_circuitpath": "",
"notifs": [
{
"dir": 1,
"value": 88
},
{
"dir": 2,
"value": 4
},
{
"dir": 3,
"value": 1
},
{
"dir": 4,
"value": 1
},
{
"dir": 5,
"value": 1
},
{
"dir": 11,
"value": 1
},
{
"dir": 12,
"value": 1
}
],
"stepTutorial": 0,
"noNameSurname": false,
"noCircuit": false,
"noComune": false,
"noCircIta": false,
"insert_circuito_ita": false,
"noFoto": false,
"resid_province": "",
"resid_card": "",
"seen": [],
"bookmark": [],
"favorite": [],
"attend": [],
"version": 10060
},
"retry_pwd": 0,
"deleted": false,
"email": "paolo@freeplanet.app",
"password": "$2a$12$qX5DRHDm9BW/ZTgPvTmP/u7VdaEd5ybfFAmEfqEK2VUAhQGt6DFcO",
"username": "paolotest",
"name": "Paolo",
"surname": "Test",
"idapp": "19",
"lang": "it",
"aportador_solidario": "------",
"tokens": [
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3Mjc1NTY5MTV9.NHnFUXOL0MbjRs9F6HrQsEBRGXG89AsBYP7jU9m8icY",
"_id": new ObjectId("66e5f83392c9540e18f89730"),
"access": "auth",
"browser": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3MjYzNTQ1MTV9.HTr1kNMhBU_38R2Tfy6m22XCbiRh5IsBKC3fl0ipIgM",
"date_login": ISODate("2024-09-14T20:55:15.500Z")
}
],
"ipaddr": "::1",
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJwYW9sb0BmcmVlcGxhbmV0LmFwcCIsInVzZXJuYW1lIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MjU2NDA1fQ.SoIGdtkoBwJvUtfWdDLpY__cdtkq",
"verified_email": true,
"lasttimeonline": ISODate("2024-09-14T20:55:15.502Z"),
"date_reg": ISODate("2024-09-13T19:40:05.188Z"),
"aportador_iniziale": "------",
"verified_by_aportador": true,
"idMyGroup": "abitaregliiblei",
"index": 2,
"__v": 3,
"perm": 16
},
{
"_id": new ObjectId("66e6fb5aac95a84fd0e11881"),
"profile": {
"paymenttypes": [],
"notif_idCities": [],
"notif_provinces": [],
"notif_regions": [],
"notif_sectors": [],
"notif_sector_goods": [],
"img": "",
"nationality": "",
"intcode_cell": "",
"cell": "",
"dateofbirth": null,
"sex": 0,
"country_pay": "",
"email_paypal": "",
"payeer_id": "",
"advcash_id": "",
"revolut": "",
"link_payment": "",
"note_payment": "",
"username_telegram": "",
"teleg_id": 0,
"teleg_checkcode": 0,
"my_dream": "",
"manage_telegram": false,
"admin_telegram": false,
"saw_zoom_presentation": false,
"ask_zoom_partecipato": false,
"saw_and_accepted": 0,
"socio": false,
"socioresidente": false,
"qualified": false,
"qualified_2invitati": false,
"myshares": [],
"friends": [],
"req_friends": [],
"handshake": [],
"mygroups": [],
"mycircuits": [],
"last_circuitpath": "",
"notifs": [
{
"dir": 1,
"value": 88
},
{
"dir": 2,
"value": 4
},
{
"dir": 3,
"value": 1
},
{
"dir": 4,
"value": 1
},
{
"dir": 5,
"value": 1
},
{
"dir": 11,
"value": 1
},
{
"dir": 12,
"value": 1
}
],
"stepTutorial": 0,
"noNameSurname": false,
"noCircuit": false,
"noComune": false,
"noCircIta": false,
"insert_circuito_ita": false,
"noFoto": false,
"resid_province": "",
"resid_card": "",
"seen": [],
"bookmark": [],
"favorite": [],
"attend": [],
"version": 10060
},
"retry_pwd": 0,
"deleted": false,
"email": "vincenzofazzino58@gmail.com",
"password": "$2a$12$z7Xg8QUmTsp8Jcj4SpoCsOVUsj5H7aLiKWS.IP2c/OkApnCUhARzK",
"username": "Enzo",
"name": "Enzo",
"surname": "Fazzino",
"idapp": "19",
"lang": "it",
"aportador_solidario": "------",
"tokens": [
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
"_id": new ObjectId("66e6fcf1ac95a84fd0e11b2c"),
"access": "auth",
"browser": "Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.127 Mobile Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
"date_login": ISODate("2024-09-15T15:27:45.368Z")
},
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
"_id": new ObjectId("66e73f04ac95a84fd0e122ae"),
"access": "auth",
"browser": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",
"date_login": ISODate("2024-09-15T20:09:40.212Z")
}
],
"ipaddr": "::1",
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJ2aW5jZW56b2Zhenppbm81OEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6IkVuem8iLCJpYXQiOjE3MjY0MTM2NTh9.YlgziPXK2ZeWe_buExvHnelMMc",
"verified_email": true,
"lasttimeonline": ISODate("2024-09-15T20:09:41.378Z"),
"date_reg": ISODate("2024-09-15T15:20:58.743Z"),
"aportador_iniziale": "------",
"verified_by_aportador": true,
"idMyGroup": "abitaregliiblei",
"index": 3,
"__v": 5,
"useragent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36"
}
]);

View File

@@ -0,0 +1,16 @@
#!/bin/bash
#DATA|TITLE|Esporta FreePlanet sul Server PCB
#DATA|DESCRIZ|Esporta FreePlanet in "exp_db_test.tar.gz" e lo invia sul Server PCB
#DATA|SOCK|false
DATABASE="FreePlanet"
FILEMONGODB="export_database_$DATABASE"
FILEZIP="exp_db_test.tar.gz"
source .my_cfg.ini
mongodump --db $DATABASE --authenticationDatabase admin -u admin -p $PWDDB --out $FILEMONGODB
tar cvfz $FILEZIP $FILEMONGODB
scp -P 8822 $FILEZIP pcbuser@pcb:~

View File

@@ -0,0 +1,28 @@
#!/bin/bash
#DATA|TITLE|Importa FreePlanet su test_FreePlanet
#DATA|DESCRIZ|Importa FreePlanet (su test_FreePlanet) dal file inviato dal server mail.freeplanet.app
#DATA|SOCK|false
FILEZIP="exp_db_test.tar.gz"
DATABASEIN="FreePlanet"
DATABASEOUT="test_FreePlanet"
FILEMONGODBIN="export_database_$DATABASEIN"
FILEMONGODBOUT="export_database_$DATABASEOUT"
source .my_cfg.ini
# Copia il file .tar.gz nel container
docker cp /home/pcbuser/$FILEZIP mongodbtest:/home/test/
# Notifica l'intenzione di estrarre il contenuto del file tar.gz
echo "Estrazione di $FILEZIP in /home/test/ all'interno del container..."
echo ""
# Estrai il contenuto del file tar.gz nel container
docker exec -it mongodbtest tar -xvzf /home/test/$FILEZIP -C /home/test/
# Rinomina la directory contenente il database esportato
docker exec -i mongodbtest mv /home/test/$FILEMONGODBIN /home/test/$FILEMONGODBOUT
# Ripristina il database MongoDB dal dump
docker exec -i mongodbtest mongorestore --username admin --password $PWDDB_TEST --authenticationDatabase admin --nsFrom='FreePlanet.*' --nsTo='test_FreePlanet.*' /home/test/>

View File

@@ -0,0 +1,30 @@
#!/bin/bash
#DATA|TITLE|Copia sito Web
#DATA|DESCRIZ|Fai una copia di Backup del sito web
#DATA|SOCK|false
if [ "$1" = "" ]; then
read -p "Inserisci il Sito Web (pippo.it)" WEBSITE
else
WEBSITE=$1
fi
FILEBACKUP_SITE="BACKUP_$WEBSITE_$(date +"%Y-%m-%d").tar.gz"
echo "********************************"
msg="*** COPIA SITO WEB di $WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
tar cvfz $FILEBACKUP_SITE /var/www/$WEBSITE/
echo "*** COPIA TERMINATA ***
echo "***********************"
fi

View File

@@ -0,0 +1,20 @@
#!/bin/bash
#DATA|TITLE|Creazione Certificato
#DATA|DESCRIZ|Crea un Certificato utilizzando cloudflare per dominio e *.dominio
#DATA|SOCK|true
if [ "$1" = "" ]; then
read -p "Inserisci il nome del Dominio " DOMINIO
else
DOMINIO=$1
fi
echo sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
read -p "CONTINUARE ed Eseguirlo ? (Y/N) ? " risposta
if [[ $risposta == "Y" || $risposta == "y" ]]; then
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
fi

3
admin_scripts/listaScript.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
ls admin_scripts

1
aggiornaserver.txt Executable file
View File

@@ -0,0 +1 @@
Aggiornamento Server...

View File

@@ -80,7 +80,8 @@ p {
/* Whitespace (imageless spacer) */
.whitespace {
line-height: 0; }
line-height: 0;
}
.firma {
font-size: 0.75rem; }

View File

@@ -13,6 +13,6 @@ fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione di 1 FILE in corso..."
rsync -avz -e 'ssh -p 8855' src/server/tools/general.js suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/src/server/tools/general.js
rsync -avz -e 'ssh -p 8855' src/server/tools/general.js suryapaolo@servereng:$SERVERDIR_WEBSITE/src/server/tools/general.js
echo "Sincronizzazione TERMINATA - SERVER PRODUZIONE!"
fi

View File

@@ -1,18 +0,0 @@
#!/bin/bash
source ./.env.prod.pcb
echo "Sincronizzazione in corso PCB PRODUZIONE ... /var/www/$SERVERDIR_WEBSITE/"
echo ""
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' .env.prod.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/.env.production
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/package.json
echo "Sincronizzazione TERMINATA! - SERVER PCB!"

View File

@@ -1,19 +0,0 @@
#!/bin/bash
source ./.env.test.pcb
echo "Sincronizzazione in corso PCB TEST ... /var/www/$SERVERDIR_WEBSITE/"
echo ""
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/.env.test
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/package.json
echo "Sincronizzazione TERMINATA! - SERVER PCB!"

87
deploynode_pcb_prod.sh Executable file
View File

@@ -0,0 +1,87 @@
#!/bin/bash
source ./.env.prod.pcb
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI PRODUZIONE PCB **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.pcb_prod.js"
ENV_FILE=".env.prod.pcb"
ENV_OUT=".env.production"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"admin_scripts"
"sass"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file .env.production ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file $CONFIG_JS in ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
$CONFIG_JS "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
echo ""
echo "*** Copia del file aggiornaserver.txt ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
aggiornaserver.txt "$REMOTE_USER@$REMOTE_HOST:/opt/scripts/aggiornaserver_pcb_prod.txt"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER PCB PRODUZIONE! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

87
deploynode_pcb_test.sh Executable file
View File

@@ -0,0 +1,87 @@
#!/bin/bash
source ./.env.test.pcb
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI TEST PCB **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
echo ""
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.pcb_test.js"
ENV_FILE=".env.test.pcb"
ENV_OUT=".env.test"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"admin_scripts"
"sass"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file .env.test ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file $CONFIG_JS in ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
$CONFIG_JS "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
echo ""
echo "*** Copia del file aggiornaserver.txt ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
aggiornaserver.txt "$REMOTE_USER@$REMOTE_HOST:/opt/scripts/aggiornaserver_pcb_test.txt"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER PCB TEST! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

83
deploynode_riso_prod.sh Executable file
View File

@@ -0,0 +1,83 @@
#!/bin/bash
source ./.env.prod.riso
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI ### PRODUZIONE ### RISO **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.riso_prod.js"
ENV_FILE=".env.prod.riso"
ENV_OUT=".env.production"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"sass"
"admin_scripts"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file $ENV_FILE su $ENV_OUT ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
"$CONFIG_JS" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
echo ""
echo "*** Copia del file aggiornaserver.txt ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
aggiornaserver.txt "$REMOTE_USER@$REMOTE_HOST:/opt/scripts/aggiornaserver_riso_prod.txt"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "✅ Sincronizzazione completata con successo. SERVER $REMOTE_DIR! "
else
echo "❌ Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

91
deploynode_riso_test.sh Executable file
View File

@@ -0,0 +1,91 @@
#!/bin/bash
source ./.env.test.risosrv
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI ### TEST ### RISO **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.riso_test.js"
ENV_FILE=".env.test.risosrv"
ENV_OUT=".env.test"
#ENV_FILE=".env.prod.pcb"
#ENV_OUT=".env.production"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"sass"
"admin_scripts"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file $ENV_FILE su $ENV_OUT ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
"$CONFIG_JS" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
echo ""
echo "*** Copia del file $CONFIG_JS in ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
$CONFIG_JS "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
echo ""
echo "*** Copia del file aggiornaserver.txt ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
aggiornaserver.txt "$REMOTE_USER@$REMOTE_HOST:/opt/scripts/aggiornaserver_riso_test.txt"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER $REMOTE_DIR! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

View File

@@ -1,21 +0,0 @@
#!/bin/bash
source ./.env.test.risosrv
echo "Sincronizzazione in corso... $DIRECTORY_SERVER"
rsync -avz -e 'scp -p 8822' .env.test.risosrv pcbuser@pcb:$DIRECTORY_SERVER/.env.test
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' src --exclude 'server/router/upload' pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:$DIRECTORY_SERVER/package.json
echo "**************************"
echo "Sincronizzazione TERMINATA! - TESTSRISO.FREEPLANET_SERVER!"
echo "https://testriso.piuchebuono.app"
echo "**************************"

View File

@@ -1,34 +0,0 @@
#!/bin/bash
source ./.env.test2
echo "Directory attuale: $PWD"
msg="*** SERVER DI TEST2 **** SEI SICURO DI INVIARE GLI AGGIORNAMENTI SERVERSIDE (NODE JS) - SUL SERVER $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso... $SERVERDIR_WEBSITE"
echo "Copiando .env.test2..."
rsync -avz -e 'ssh -p 8855' .env.test2 suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/.env.test
echo "Sincronizzazione in corso... src"
rsync -avz -e 'ssh -p 8855' -a --exclude 'src/router/upload' src suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' package.json suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/package.json
rsync -avz -e 'ssh -p 8855' css suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' docs suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' emails suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' images suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' plugins suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' sass suryapaolo@servereng:/var/www/$SERVERDIR_WEBSITE/
echo "Sincronizzazione TERMINATA! - SERVER TEST2!"
fi

0
docs/aaa.js Normal file
View File

38
docs/aaa.json Normal file
View File

@@ -0,0 +1,38 @@
{
"id": "70606",
"title": "Grande Libro dell'Autosufficienza - 50 anni - Nuovo",
"description": "<em><strong>\"Il Grande Libro dell\u2019Autosufficienza\"<\/strong><\/em> di John Seymour \u00e8 un manuale completo che celebra 50 anni di pratiche di <strong>autosufficienza<\/strong> e <strong>sostenibilit\u00e0<\/strong>. Il libro offre insegnamenti pratici su come creare e gestire un <strong>orto biologico<\/strong>, raccogliere e conservare i raccolti, produrre <strong>energia rinnovabile<\/strong>, allevare animali e ridurre i rifiuti. Seymour ci guida passo passo in un viaggio verso una vita in armonia con la natura, promuovendo l\u2019indipendenza e la sostenibilit\u00e0. Un testo imprescindibile per chi desidera riscoprire le tradizioni agricole e applicarle per vivere in modo pi\u00f9 <strong>sostenibile<\/strong> e <strong>autonomo<\/strong>.\r\n<h2><strong>Con questo libro scoprirai<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Come <strong>coltivare un orto biologico<\/strong> e ottenere cibo sano.<\/li>\r\n \t<li>Le tecniche per <strong>conservare il raccolto<\/strong> e ottimizzare le risorse naturali.<\/li>\r\n \t<li>Come allevare animali per ottenere cibo e altri prodotti.<\/li>\r\n \t<li>Come produrre <strong>energia rinnovabile<\/strong> e ridurre l\u2019impatto ambientale.<\/li>\r\n \t<li>L\u2019arte di <strong>ridurre e riciclare<\/strong> rifiuti, promuovendo uno stile di vita pi\u00f9 sostenibile.<\/li>\r\n<\/ul>\r\n<h2><strong>Domande cruciali a cui <em>\"Il Grande Libro dell\u2019Autosufficienza\"<\/em> risponde<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Come posso vivere in modo <strong>autosufficiente<\/strong> e ridurre la mia dipendenza dalle risorse esterne?<\/li>\r\n \t<li>Quali sono le migliori tecniche per <strong>coltivare un orto biologico<\/strong> e garantire un raccolto abbondante?<\/li>\r\n \t<li>Come posso <strong>conservare il raccolto<\/strong> in modo naturale e duraturo?<\/li>\r\n \t<li>In che modo posso <strong>produrre energia rinnovabile<\/strong> a casa mia?<\/li>\r\n \t<li>Come posso vivere in <strong>armonia con la natura<\/strong> e promuovere la <strong>sostenibilit\u00e0<\/strong>?<\/li>\r\n<\/ul>\r\n<h2><strong>Questo libro \u00e8 dedicato a<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Lettori appassionati di <strong>giardinaggio<\/strong>, <strong>agricoltura biologica<\/strong> e vita rurale.<\/li>\r\n \t<li>Chiunque desideri adottare uno <strong>stile di vita sostenibile<\/strong> e autosufficiente.<\/li>\r\n \t<li><strong>Famiglie eco-consapevoli<\/strong> che vogliono ridurre il proprio impatto ambientale.<\/li>\r\n \t<li><strong>Amanti della natura<\/strong> e sostenitori delle <strong>energie rinnovabili<\/strong>.<\/li>\r\n<\/ul>\r\n<h2><strong>Contenuti chiave <em>\"Il Grande Libro dell\u2019Autosufficienza\"<\/em><\/strong>:<\/h2>\r\n<em>Il Grande Libro dell\u2019Autosufficienza<\/em> offre una panoramica completa di tutte le tecniche per vivere in modo <strong>autonomo<\/strong> e <strong>sostenibile<\/strong>. Attraverso 10 capitoli, il libro esplora vari aspetti dell\u2019autosufficienza, dalla coltivazione di ortaggi e frutti alla produzione di cibo dagli animali, fino alla gestione dell'energia e dei rifiuti. La guida si focalizza sul valore delle <strong>tradizioni agricole<\/strong>, sulla cura dell\u2019ambiente e sul benessere che deriva dal vivere in sintonia con la natura.\r\n\r\n&nbsp;",
"link": "https:\/\/www.fioredellavita.it\/grande-libro-dellautosufficienza-50-anni\/?attribute_pa_versione=nuovo",
"image_link": "https:\/\/www.fioredellavita.it\/wp-content\/uploads\/2024\/09\/il-grande-libro-dell-autosufficienza-speciale-50-anni-copertina-web.jpg",
"price": "39,00",
"sale_price": "37,05",
"categories": "Informazione Libera",
"isbn": "",
"Autore": "John,Seymour",
"Editore": "Macro Edizioni",
"Tipologia": "Libri",
"Collezione": "Libri Informazione Libera,Informazione Libera",
"Quantita": "1821",
"Lunghezza": "",
"Stato": "publish",
"Pagine": "",
"Edizione": "",
"Traduzione": "",
"Versione": "Nuovo",
"StockStatus": "instock",
"downloadable": "no",
"img1": "https:\/\/www.fioredellavita.it\/wp-content\/uploads\/2024\/09\/quarta_nuovo_grande_libro_dell_autosufficienza_2024_17038.jpg",
"img2": "",
"img3": "",
"formato": "Cartonato",
"preOrderDate": "2025-02-25",
"short_descr": null,
"availability": "in stock",
"checkout_link": "https:\/\/www.fioredellavita.it\/carrello\/?productId=70606",
"seo_descr": "Versione: Nuovo",
"preord": "no",
"addtocart_link": "https:\/\/www.fioredellavita.it\/grande-libro-dellautosufficienza-50-anni\/?attribute_pa_versione=nuovo&variation_id=70606&add-to-cart=70606",
"eta": "",
"misure": "cm 22x28",
"sku": "22464"
},

View File

@@ -0,0 +1,39 @@
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
# Configurazione per HTTP
<VirtualHost 65.108.222.97:80>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
RewriteEngine on
# Redirigi tutto il traffico HTTP verso HTTPS
RewriteCond %{SERVER_NAME} =${MIODOMINIO_COMPLETO} [OR]
RewriteCond %{SERVER_NAME} =www.${MIODOMINIO_COMPLETO}
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
</VirtualHost>
# Configurazione per HTTPS
<IfModule mod_ssl.c>
<VirtualHost 65.108.222.97:443>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
<Directory /var/www/${MIODOMINIO_COMPLETO}/>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
</VirtualHost>
</IfModule>

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO piuchebuono.app
Define MIODOMINIO_COMPLETO piuchebuono.app
Define MIOURL_API api.piuchebuono.app
Define PORTA 3000

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO abitaregliiblei.it
Define MIODOMINIO_COMPLETO test.abitaregliiblei.it
Define MIOURL_API testapi.abitaregliiblei.it
Define PORTA 3021

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO riso.app
Define MIODOMINIO_COMPLETO test.riso.app
Define MIOURL_API testapi.riso.app
Define PORTA 3005

View File

@@ -0,0 +1,3 @@
Include /etc/apache2/sites-available/dominioinclude_piuchebuono.app.conf
Include /etc/apache2/sites-available/nodejs_virtualhost_ssl_http_https.conf

View File

@@ -0,0 +1,47 @@
# Configurazione per HTTP
<VirtualHost 65.108.222.97:80>
ServerName ${MIOURL_API}
RewriteEngine on
# Redirigi tutto il traffico HTTP verso HTTPS
RewriteCond %{SERVER_NAME} =${MIOURL_API} [OR]
RewriteCond %{SERVER_NAME} =www.${MIOURL_API}
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
</VirtualHost>
<VirtualHost 65.108.222.97:443>
ServerName ${MIOURL_API}
ServerAdmin surya@riso.app
SSLEngine On
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
SSLCompression Off
SSLHonorCipherOrder off
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:E>
SSLVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
ProxyPass / https://localhost:${PORTA}/ retry=0 timeout=5 connectiontimeout=2
ProxyPassReverse / https://localhost:${PORTA}/
ProxyTimeout 5
LogLevel warn
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
<Location />
ProxyPassReverse /
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
</Location>
</VirtualHost>

View File

@@ -0,0 +1,3 @@
Include /etc/apache2/sites-available/dominioinclude_piuchebuono.app.conf
Include /etc/apache2/sites-available/websites_ssl_virtualhost.conf

View File

@@ -0,0 +1,3 @@
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
Include /etc/apache2/sites-available/websites_ssl_virtualhost.conf

View File

@@ -0,0 +1,30 @@
<VirtualHost 65.108.222.97:80>
ServerName ${MIODOMINIO_COMPLETO}
RewriteEngine On
# Forza la connessione HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://${MIODOMINIO_COMPLETO}%{REQUEST_URI} [L,R=301]
</VirtualHost>
<VirtualHost 65.108.222.97:443>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
ServerAdmin surya@riso.app
SSLEngine On
SSLProtocol -ALL +TLSv1.2
SSLCompression Off
SSLHonorCipherOrder off
SSLCipherSuite ECDH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS:!DH:!AES128
SSLVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
<Directory /var/www/${MIODOMINIO_COMPLETO}/>
CGIPassAuth On
Require all granted
AllowOverride All
</Directory>
LogLevel warn
ErrorLog "/var/www/${MIODOMINIO_COMPLETO}/logs/error.log"
CustomLog "/var/www/${MIODOMINIO_COMPLETO}/logs/access.log" combined
</VirtualHost>

36
docs/apache2/contatti.htm Normal file
View File

@@ -0,0 +1,36 @@
<!-- wp:themify-builder/canvas /-->
<!--themify_builder_static-->
<h3>Contattaci</h3>
<p><strong>Hai domande, consigli o suggerimenti da proporci?</strong><br />Inviaci un messaggio attraverso il form qui
sotto!</p>
<form action="https://www.fioredellavita.it/wp-admin/admin-ajax.php" class="builder-contact" id="tb_th9k520-form"
method="post" data-post-id="0" data-element-id="th9k520" data-orig-id=""> <label for="field_extra_tb_th9k520_0">
Invia a: <input type="hidden" name="field_extra_name_0" value="Invia a:"> * </label> <select
id="field_extra_tb_th9k520_0" name="field_extra_0" required>
<option value="Seleziona destinatario"> Seleziona destinatario </option>
<option value="ordiniweb@gruppomacro.com"> ordiniweb@gruppomacro.com </option>
</select> <label for="tb_th9k520-contact-subject">Oggetto richiesta: *</label> <input type="text"
name="contact-subject" placeholder="" id="tb_th9k520-contact-subject" value="" required> <label
for="tb_th9k520-contact-name">Nome *</label> <input type="text" name="contact-name" placeholder=""
id="tb_th9k520-contact-name" value="" required> <label for="field_extra_tb_th9k520_1"> Cognome <input
type="hidden" name="field_extra_name_1" value="Cognome"> * </label> <input type="text" name="field_extra_1"
id="field_extra_tb_th9k520_1" placeholder="" required> <label for="tb_th9k520-contact-email">E-mail *</label>
<input type="text" name="contact-email" placeholder="" id="tb_th9k520-contact-email" value="" required> <label
for="field_extra_tb_th9k520_2"> Telefono <input type="hidden" name="field_extra_name_2" value="Telefono">
</label> <input type="tel" name="field_extra_2" id="field_extra_tb_th9k520_2" placeholder=""> <label
for="tb_th9k520-contact-message">Descrivi la tua richiesta: </label> <textarea name="contact-message"
placeholder="" id="tb_th9k520-contact-message"></textarea> <label> <input type="checkbox" name="gdpr" value="1"
required> Ho letto l'Informativa sulla privacy nella pagina <a href="/contatti"> Privacy Policy</a> del Sito
e acconsento al trattamento dei dati inseriti. * </label> <label> Verifica antispam * </label> <button
type="submit">Invia</button> </form>
<h3>Dove siamo</h3>
<p><strong>Macro Società Cooperativa srl</strong><br />Via Giardino, 30 47522 Cesena (FC)</p>
<p>Fai click sulla mappa (OpenStreetMap) per trovare il percorso dal tuo indirizzo.</p>
<a
href="https://www.openstreetmap.org/search?query=Via%20Giardino%2C%2030%20%E2%80%93%2047522%20%E2%80%93%20Cesena%20(FC)#map=16/44.1525/12.2062">
<img decoding="async" loading="lazy" width="500" height="499"
src="https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro.jpg" title="mappa-macro"
alt="mappa-macro"
srcset="https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro.jpg 500w, https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro-300x300.jpg 300w, https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro-150x150.jpg 150w, https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro-320x319.jpg 320w, https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro-100x100.jpg 100w, https://www.fioredellavita.it/wp-content/uploads/2022/10/mappa-macro-50x50.jpg 50w"
sizes="(max-width: 500px) 100vw, 500px" /> </a><!--/themify_builder_static-->

View File

@@ -0,0 +1,26 @@
<VirtualHost 89.36.222.238:443>
SuexecUserGroup "#1008" "#1008"
ServerName riso.app
ServerAlias www.riso.app
DocumentRoot /var/www/riso.app
ErrorLog /var/www/riso.app/logs//error.log
CustomLog /var/www/riso.app/logs/access.log combined
<Directory /var/www/riso.app/>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
</Directory>
<If "%{HTTP_HOST} == 'www.riso.app'">
Redirect permanent / https://riso.app/
</If>
RewriteEngine on
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/riso.app/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/riso.app/privkey.pem
</VirtualHost>
</IfModule>

View File

@@ -0,0 +1,11 @@
<VirtualHost *:443>
ServerName _default_
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/riso.app/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/riso.app/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2 http/1.1
# Puoi anche fare un 403:
Redirect 403 /
</VirtualHost>

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO riso.app
Define MIODOMINIO_COMPLETO riso.app
Define MIOURL_API api.riso.app
Define PORTA 3006

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO riso.app
Define MIODOMINIO_COMPLETO test.riso.app
Define MIOURL_API testapi.riso.app
Define PORTA 3005

View File

@@ -0,0 +1,3 @@
Include /etc/apache2/sites-available/dominioinclude.riso.app.conf
Include /etc/apache2/sites-available/websites_ssl_virtualhost.conf

View File

@@ -0,0 +1,3 @@
Include /etc/apache2/sites-available/dominioinclude_test.riso.app.conf
Include /etc/apache2/sites-available/websites_ssl_virtualhost_sottodomini.conf

View File

@@ -0,0 +1,94 @@
# ==================== APEX (SITO) ====================
# HTTP -> HTTPS
<VirtualHost *:80>
ServerName ${MIODOMINIO}
ServerAlias www.${MIODOMINIO}
RewriteEngine On
RewriteRule ^ https://${MIODOMINIO}%{REQUEST_URI} [R=301,L]
ErrorLog /var/log/apache2/${MIODOMINIO}-error.log
CustomLog /var/log/apache2/${MIODOMINIO}-access.log combined
</VirtualHost>
# HTTPS (servizio sito - NO proxy qui)
<VirtualHost *:443>
ServerName ${MIODOMINIO}
ServerAlias www.${MIODOMINIO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2 http/1.1
<Directory "/var/www/${MIODOMINIO_COMPLETO}">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
DirectoryIndex index.html
# (Opzionale per SPA Quasar/Vue)
# RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^ /index.html [L]
ErrorLog /var/log/apache2/${MIODOMINIO}-error.log
CustomLog /var/log/apache2/${MIODOMINIO}-access.log combined
</VirtualHost>
# ==================== API ====================
# HTTP -> HTTPS
<VirtualHost *:80>
ServerName ${MIOURL_API}
RewriteEngine On
RewriteRule ^ https://${MIOURL_API}%{REQUEST_URI} [R=301,L]
ErrorLog /var/log/apache2/${MIOURL_API}-error.log
CustomLog /var/log/apache2/${MIOURL_API}-access.log combined
</VirtualHost>
# HTTPS (proxy verso backend)
<VirtualHost *:443>
ServerName ${MIOURL_API}
ServerAdmin surya@riso.app
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2 http/1.1
ProxyPreserveHost On
# ===== SCEGLI UNO DEI DUE BLOCCHI, in base al TUO backend su ${PORTA} =====
# --- Backend HTTP (più comune) ---
# ProxyPass / http://127.0.0.1:${PORTA}/ retry=0 timeout=310 connectiontimeout=30
# ProxyPassReverse / http://127.0.0.1:${PORTA}/
# --- Backend HTTPS (nel tuo caso probabile, visto l“Empty reply” via HTTP) ---
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
ProxyPass / https://127.0.0.1:${PORTA}/ retry=0 timeout=310 connectiontimeout=30
ProxyPassReverse / https://127.0.0.1:${PORTA}/
# ==========================================================================
<Proxy *>
Require all granted
</Proxy>
ProxyTimeout 310
Timeout 310
ProxyBadHeader Ignore
ErrorLog /var/log/apache2/${MIOURL_API}-error.log
CustomLog /var/log/apache2/${MIOURL_API}-access.log combined
</VirtualHost>

View File

@@ -0,0 +1,92 @@
# ==================== APEX (SITO) ====================
# HTTP -> HTTPS
<VirtualHost *:80>
ServerName ${MIODOMINIO_COMPLETO}
RewriteEngine On
RewriteRule ^ https://${MIODOMINIO_COMPLETO}%{REQUEST_URI} [R=301,L]
ErrorLog /var/log/apache2/${MIODOMINIO_COMPLETO}-error.log
CustomLog /var/log/apache2/${MIODOMINIO_COMPLETO}-access.log combined
</VirtualHost>
# HTTPS (servizio sito - NO proxy qui)
<VirtualHost *:443>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2 http/1.1
<Directory "/var/www/${MIODOMINIO_COMPLETO}">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
DirectoryIndex index.html
# (Opzionale per SPA Quasar/Vue)
# RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^ /index.html [L]
ErrorLog /var/log/apache2/${MIODOMINIO_COMPLETO}-error.log
CustomLog /var/log/apache2/${MIODOMINIO_COMPLETO}-access.log combined
</VirtualHost>
# ==================== API ====================
# HTTP -> HTTPS
<VirtualHost *:80>
ServerName ${MIOURL_API}
RewriteEngine On
RewriteRule ^ https://${MIOURL_API}%{REQUEST_URI} [R=301,L]
ErrorLog /var/log/apache2/${MIOURL_API}-error.log
CustomLog /var/log/apache2/${MIOURL_API}-access.log combined
</VirtualHost>
# HTTPS (proxy verso backend)
<VirtualHost *:443>
ServerName ${MIOURL_API}
ServerAdmin surya@riso.app
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2 http/1.1
ProxyPreserveHost On
# ===== SCEGLI UNO DEI DUE BLOCCHI, in base al TUO backend su ${PORTA} =====
# --- Backend HTTP (più comune) ---
# ProxyPass / http://127.0.0.1:${PORTA}/ retry=0 timeout=310 connectiontimeout=30
# ProxyPassReverse / http://127.0.0.1:${PORTA}/
# --- Backend HTTPS (nel tuo caso probabile, visto l“Empty reply” via HTTP) ---
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
ProxyPass / https://127.0.0.1:${PORTA}/ retry=0 timeout=310 connectiontimeout=30
ProxyPassReverse / https://127.0.0.1:${PORTA}/
# ==========================================================================
<Proxy *>
Require all granted
</Proxy>
ProxyTimeout 310
Timeout 310
ProxyBadHeader Ignore
ErrorLog /var/log/apache2/${MIOURL_API}-error.log
CustomLog /var/log/apache2/${MIOURL_API}-access.log combined
</VirtualHost>

View File

@@ -0,0 +1,24 @@
docker exec -it gitlab /bin/bash
apt-get update
apt-get install nano
nano /etc/gitlab/gitlab.rb
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "tuo_username"
gitlab_rails['smtp_password'] = "tuo_password"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_address'] = "box.lamiaposta.org"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "gitlab@riso.app"
gitlab_rails['smtp_password'] = "MYPRISO_1290_1977@!"
gitlab_rails['smtp_domain'] = "lamiaposta.org"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

429
docs/libro1.htm Normal file
View File

@@ -0,0 +1,429 @@
<!DOCTYPE html>
<!-- saved from url=(0067)http://vps-88271abb.vps.ovh.net/apimacro/public/mylinkspao?id=22467 -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Link Page</title>
<style>
#loading {
display: none;
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<h1>Links</h1>
<form id="articleForm">
<pre> Per vedere la lista -&gt; "LIBRI IN PREVENDITA"
in <span style="color: green;">VERDE</span> quelli in PreOrdine
in <span style="color: red;">ROSSO</span> quelli ancora non abilitati.
cliccare sul link <span style="font-weight: bold;">Imposta in PREORDINE"</span> per abilitarlo.
</pre>
<label for="article_id">ID Articolo or Ordine:</label>
<input type="text" id="article_id" name="id" value="22467">
<input type="text" id="action" name="action" value="" hidden="">
<br>
<button type="button" data-action="search">Cerca Articolo</button>
<button type="button" data-action="search_isbn">Cerca ISBN</button>
<button type="button" data-action="updateArtFromGM">Aggiorna Articolo da GM</button>
<button type="button" data-action="checkPrevendita">E' in PreVendita?</button>
<button type="button" data-action="setPreOrder">Impostalo in PreVendita!</button>
<button type="button" data-action="setDataPubblicazione">Aggiorna Data Pubblicazione</button>
<button type="button" data-action="showDettSingleOrdine">Dett. Ordine</button>
<button type="button" data-action="showDettSingleOrdineWeb">Dett. Ordine Web</button>
<br><br>
<button type="button" data-action="showTest">Test</button>
<button type="button" data-action="inprevendita">Libri in Prevendita</button>
<button type="button" data-action="cartolibri">Cartolibri</button>
<button type="button" data-action="riviste">Riviste</button>
<button type="button" data-action="showOrdini">Mostra Ordini</button>
<button type="button" data-action="showOrdiniWeb">Mostra Ordini Web</button>
<button type="button" data-action="showArticoliFatturatiWeb">Mostra Fatturati</button>
<button type="button" data-action="Vendite">Vendite</button>
<button type="button" data-action="showDettOrdini">Dettaglio Ordini</button>
<button type="button" data-action="showDettOrdiniWeb">Dettaglio Ordini Web</button>
</form>
<div>
<a href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-articles-sales" target="_blank">Vedi Articoli Venduti e Fatturati</a> - <a href="http://vps-88271abb.vps.ovh.net/apimacro/public/export-articles-sales-json" target="_blank">(Esporta)</a><br>
</div>
<div id="result">Articles di 22467 :
<pre>[
{
"Id": "258787",
"IdArticolo": "22467",
"Ean13": "9788828510147",
"Titolo": "Le Stelle Cadranno dal Cielo?",
"ListaAutori": "17",
"ListaArgomenti": "9",
"IdStatoProdotto": "34",
"PrezzoIvato": "24.9000",
"IdMarchioEditoriale": "1",
"IdCollana": "73",
"DataPubblicazione": "2025-01-14 00:00:00.000",
"IdTipologia": "1",
"IdTipoFormato": "1",
"Misure": "cm 13,5x20,5",
"Pagine": "192",
"Sottotitolo": "Non \u00e8 una catastrofe ma la Rivelazione dell'Universo reale",
"Durata": "",
"Numero": "",
"Edizione": "Dicembre 2024",
"Ristampa": "",
"DataInizioCampagna": "2024-11-07 00:00:00.000",
"DataFineCampagna": "2099-12-31 00:00:00.000",
"ScontoCampagna": "5.00",
"PrezzoIvatoScontatoCampagna": "23.6550",
"DataOra": "2024-12-19 09:24:01.593",
"Enabled": "0",
"IDTagGruppo": "0",
"Utente": "FLANZA-NOTE",
"PercIva": ".00",
"IdTitoloOriginale": "13415",
"EnabledAlFresco": "1",
"CodEdizione": "16",
"FasciaEta": null,
"FasciaEta2": null,
"data": "2024-12-19 09:24:01.593",
"DescrizioneStatoProdotto": "In prevendita",
"Codice": "22467",
"QtaDisponibile": "-6"
}
]</pre>Product:
<pre>{
"id": 74617,
"name": "Le stelle cadranno dal cielo? - Nuovo",
"slug": "le-stelle-cadranno-dal-cielo-nuovo",
"permalink": "https:\/\/www.fioredellavita.it\/le-stelle-cadranno-dal-cielo\/?attribute_pa_versione=nuovo",
"date_created": "2024-12-19T15:26:11",
"date_created_gmt": "2024-12-19T14:26:11",
"date_modified": "2024-12-20T13:02:31",
"date_modified_gmt": "2024-12-20T12:02:31",
"type": "variation",
"status": "publish",
"featured": false,
"catalog_visibility": "visible",
"description": "",
"short_description": "",
"sku": "22467",
"price": "23.6550",
"regular_price": "24.9000",
"sale_price": "23.6550",
"date_on_sale_from": "2024-11-07T00:00:00",
"date_on_sale_from_gmt": "2024-11-06T23:00:00",
"date_on_sale_to": "2099-12-31T23:59:59",
"date_on_sale_to_gmt": "2099-12-31T22:59:59",
"on_sale": true,
"purchasable": true,
"total_sales": "0",
"virtual": false,
"downloadable": false,
"downloads": [],
"download_limit": -1,
"download_expiry": -1,
"external_url": "",
"button_text": "",
"tax_status": "taxable",
"tax_class": "",
"manage_stock": true,
"stock_quantity": 10000,
"backorders": "no",
"backorders_allowed": false,
"backordered": false,
"low_stock_amount": null,
"sold_individually": false,
"weight": "",
"dimensions": {
"length": "",
"width": "",
"height": ""
},
"shipping_required": true,
"shipping_taxable": true,
"shipping_class": "",
"shipping_class_id": 0,
"reviews_allowed": false,
"average_rating": "0.00",
"rating_count": 0,
"upsell_ids": [],
"cross_sell_ids": [],
"parent_id": 70642,
"purchase_note": "",
"categories": [],
"tags": [],
"images": [
{
"id": 73623,
"date_created": "2024-11-20T11:12:29",
"date_created_gmt": "2024-11-20T09:12:29",
"date_modified": "2024-12-20T14:02:31",
"date_modified_gmt": "2024-12-20T12:02:31",
"src": "https:\/\/i0.wp.com\/www.fioredellavita.it\/wp-content\/uploads\/2024\/09\/le-stella-cadranno-dal-cielo-copertina-web.jpg?fit=450%2C624&amp;ssl=1",
"name": "le-stella-cadranno-dal-cielo-copertina-web",
"alt": "\"Le stelle cadranno dal cielo?\""
}
],
"attributes": [
{
"id": 6,
"name": "Versione",
"slug": "pa_versione",
"option": "Nuovo"
}
],
"default_attributes": [],
"variations": [],
"grouped_products": [],
"menu_order": 0,
"price_html": "<del aria-hidden="\&quot;true\&quot;"><span class="\&quot;woocommerce-Price-amount" amount\"=""><bdi>24,90<span class="\&quot;woocommerce-Price-currencySymbol\&quot;">&lt;\/span&gt;&lt;\/bdi&gt;&lt;\/span&gt;&lt;\/del&gt; <span class="\&quot;screen-reader-text\&quot;">Il prezzo originale era: 24,90€.&lt;\/span&gt;<ins aria-hidden="\&quot;true\&quot;"><span class="\&quot;woocommerce-Price-amount" amount\"=""><bdi>23,66<span class="\&quot;woocommerce-Price-currencySymbol\&quot;">&lt;\/span&gt;&lt;\/bdi&gt;&lt;\/span&gt;&lt;\/ins&gt;<span class="\&quot;screen-reader-text\&quot;">Il prezzo attuale \u00e8: 23,66€.&lt;\/span&gt;",
"related_ids": [],
"meta_data": [
{
"id": 1521527,
"key": "ISBN",
"value": "9788828510147"
},
{
"id": 1521528,
"key": "misure",
"value": "cm 13,5x20,5"
},
{
"id": 1521529,
"key": "formato",
"value": "Brossura"
},
{
"id": 1521530,
"key": "pagine",
"value": "192"
},
{
"id": 1521531,
"key": "edizione",
"value": "Dicembre 2024"
},
{
"id": 1521532,
"key": "DataPubblicazione",
"value": "1736809200"
},
{
"id": 1521533,
"key": "DataPubbStr",
"value": "14\/01\/2025"
},
{
"id": 1521535,
"key": "_wpro_variable_is_preorder",
"value": "yes"
},
{
"id": 1521536,
"key": "_is_pre_order",
"value": "yes"
},
{
"id": 1521537,
"key": "_pre_order_date",
"value": "2025-01-14"
},
{
"id": 1521538,
"key": "_wpro_date_label_variable",
"value": "Prenotalo per riceverlo entro il 14 gennaio 2025"
},
{
"id": 1521539,
"key": "_wpro_no_date_label_variable",
"value": ""
},
{
"id": 1521540,
"key": "_wpro_manage_price_variable",
"value": ""
},
{
"id": 1521541,
"key": "_wpro_price_variable",
"value": ""
},
{
"id": 1521542,
"key": "_wpro_label_variable",
"value": "Pre Ordinalo!"
},
{
"id": 1521543,
"key": "_wpro_price_type_variable",
"value": "manual"
},
{
"id": 1521544,
"key": "_wpro_amount_price_variable",
"value": "fixed"
},
{
"id": 1521545,
"key": "_wpro_date_variable",
"value": "2025-01-14"
},
{
"id": 1521546,
"key": "_wpro_time_variable",
"value": ""
},
{
"id": 1521547,
"key": "_rank_math_gtin_code",
"value": ""
},
{
"id": 1521680,
"key": "_ywpo_preorder",
"value": "yes"
},
{
"id": 1521681,
"key": "_ywpo_availability_date_mode",
"value": "date"
},
{
"id": 1521682,
"key": "_ywpo_for_sale_date",
"value": "2025-01-14"
},
{
"id": 1521683,
"key": "_ywpo_price_mode",
"value": "default"
},
{
"id": 1521684,
"key": "_ywpo_preorder_price",
"value": "0"
},
{
"id": 1521685,
"key": "_ywpo_preorder_discount_percentage",
"value": ""
},
{
"id": 1521686,
"key": "_ywpo_preorder_discount_fixed",
"value": ""
},
{
"id": 1521687,
"key": "_ywpo_preorder_increase_percentage",
"value": ""
},
{
"id": 1521688,
"key": "_ywpo_preorder_increase_fixed",
"value": ""
},
{
"id": 1521711,
"key": "woo_feed_availability_date_var",
"value": "2025-01-14"
}
],
"stock_status": "instock",
"has_options": false,
"post_password": "",
"global_unique_id": "",
"jetpack_sharing_enabled": true,
"jetpack-related-posts": [],
"builder_content": "",
"_links": {
"self": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products\/74617",
"targetHints": {
"allow": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
]
}
}
],
"collection": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products"
}
],
"up": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products\/70642"
}
]
}
}</span></span></bdi></span></ins></span></span></bdi></span></del></pre></div>
<div id="loading" style="display: none;"></div>
<script>
const form = document.getElementById('articleForm');
const result = document.getElementById('result');
const loading = document.getElementById('loading');
const buttons = form.querySelectorAll('button');
buttons.forEach(button => button.addEventListener('click', handleButtonClick));
function handleButtonClick(event) {
let action = event.target.dataset.action;
let id = '0';
try {
id = form.querySelector('input[name="id"]').value;
if (!action) {
action = form.querySelector('input[name="action"]').value;
}
} catch (e) {
id = 0;
}
if (!id) {
id = 0;
}
loading.style.display = 'block'; // Mostra la clessidra
let baseUrl = window.location.href;
baseUrl = baseUrl.slice(0, baseUrl.lastIndexOf('/'));
fetch(`${baseUrl}/handle-article-action-pao/${id}/${action}`)
.then(response => response.text())
.then(data => {
result.innerHTML = data;
loading.style.display = 'none'; // Nasconde la clessidra una volta completato
});
}
</script>
<deepl-input-controller><template shadowrootmode="open"><link rel="stylesheet" href="chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.css"><div dir="ltr" style="visibility: initial !important;"><div class="dl-input-translation-container svelte-95aucy"><div></div></div></div></template></deepl-input-controller></body></html>

403
docs/libro2.htm Normal file
View File

@@ -0,0 +1,403 @@
<!DOCTYPE html>
<!-- saved from url=(0067)http://vps-88271abb.vps.ovh.net/apimacro/public/mylinkspao?id=22753 -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Link Page</title>
<style>
#loading {
display: none;
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<h1>Links</h1>
<form id="articleForm">
<pre> Per vedere la lista -&gt; "LIBRI IN PREVENDITA"
in <span style="color: green;">VERDE</span> quelli in PreOrdine
in <span style="color: red;">ROSSO</span> quelli ancora non abilitati.
cliccare sul link <span style="font-weight: bold;">Imposta in PREORDINE"</span> per abilitarlo.
</pre>
<label for="article_id">ID Articolo or Ordine:</label>
<input type="text" id="article_id" name="id" value="22753">
<input type="text" id="action" name="action" value="" hidden="">
<br>
<button type="button" data-action="search">Cerca Articolo</button>
<button type="button" data-action="search_isbn">Cerca ISBN</button>
<button type="button" data-action="updateArtFromGM">Aggiorna Articolo da GM</button>
<button type="button" data-action="checkPrevendita">E' in PreVendita?</button>
<button type="button" data-action="setPreOrder">Impostalo in PreVendita!</button>
<button type="button" data-action="setDataPubblicazione">Aggiorna Data Pubblicazione</button>
<button type="button" data-action="showDettSingleOrdine">Dett. Ordine</button>
<button type="button" data-action="showDettSingleOrdineWeb">Dett. Ordine Web</button>
<br><br>
<button type="button" data-action="showTest">Test</button>
<button type="button" data-action="inprevendita">Libri in Prevendita</button>
<button type="button" data-action="cartolibri">Cartolibri</button>
<button type="button" data-action="riviste">Riviste</button>
<button type="button" data-action="showOrdini">Mostra Ordini</button>
<button type="button" data-action="showOrdiniWeb">Mostra Ordini Web</button>
<button type="button" data-action="showArticoliFatturatiWeb">Mostra Fatturati</button>
<button type="button" data-action="Vendite">Vendite</button>
<button type="button" data-action="showDettOrdini">Dettaglio Ordini</button>
<button type="button" data-action="showDettOrdiniWeb">Dettaglio Ordini Web</button>
</form>
<div>
<a href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-articles-sales" target="_blank">Vedi Articoli Venduti e Fatturati</a> - <a href="http://vps-88271abb.vps.ovh.net/apimacro/public/export-articles-sales-json" target="_blank">(Esporta)</a><br>
</div>
<div id="result">Articles di 22753 :
<pre>[
{
"Id": "258799",
"IdArticolo": "22753",
"Ean13": "9788865934883",
"Titolo": "La Storia di Flumeide e la Bambina",
"ListaAutori": "4184",
"ListaArgomenti": "6",
"IdStatoProdotto": "34",
"PrezzoIvato": "13.0000",
"IdMarchioEditoriale": "34",
"IdCollana": "1033",
"DataPubblicazione": "2025-01-21 00:00:00.000",
"IdTipologia": "1",
"IdTipoFormato": "1",
"Misure": "cm 28x19",
"Pagine": "32",
"Sottotitolo": "Una fiaba per grandi",
"Durata": "",
"Numero": "",
"Edizione": "Gennaio 2025",
"Ristampa": "",
"DataInizioCampagna": "2024-11-15 00:00:00.000",
"DataFineCampagna": "2099-11-15 00:00:00.000",
"ScontoCampagna": "5.00",
"PrezzoIvatoScontatoCampagna": "12.3500",
"DataOra": "2024-12-19 11:16:13.993",
"Enabled": "0",
"IDTagGruppo": "0",
"Utente": "AZANGHERI-NOTE",
"PercIva": ".00",
"IdTitoloOriginale": "13664",
"EnabledAlFresco": "1",
"CodEdizione": "1",
"FasciaEta": "Genitori",
"FasciaEta2": "Ragazze e ragazzi",
"data": "2024-12-19 11:16:13.993",
"DescrizioneStatoProdotto": "In prevendita",
"Codice": "22753",
"QtaDisponibile": "-2"
}
]</pre>Product:
<pre>{
"id": 73612,
"name": "La storia di Flumeide e la bambina - Nuovo",
"slug": "la-storia-di-flumeide-e-la-bambina-nuovo",
"permalink": "https:\/\/www.fioredellavita.it\/?post_type=product&amp;p=73611&amp;attribute_pa_versione=nuovo",
"date_created": "2024-11-20T04:49:10",
"date_created_gmt": "2024-11-20T03:49:10",
"date_modified": "2024-12-20T12:56:24",
"date_modified_gmt": "2024-12-20T11:56:24",
"type": "variation",
"status": "publish",
"featured": false,
"catalog_visibility": "visible",
"description": "",
"short_description": "",
"sku": "22753",
"price": "12.3500",
"regular_price": "13.0000",
"sale_price": "12.3500",
"date_on_sale_from": "2024-11-15T00:00:00",
"date_on_sale_from_gmt": "2024-11-14T23:00:00",
"date_on_sale_to": "2099-11-15T23:59:59",
"date_on_sale_to_gmt": "2099-11-15T22:59:59",
"on_sale": true,
"purchasable": true,
"total_sales": "0",
"virtual": false,
"downloadable": false,
"downloads": [],
"download_limit": -1,
"download_expiry": -1,
"external_url": "",
"button_text": "",
"tax_status": "taxable",
"tax_class": "",
"manage_stock": true,
"stock_quantity": 10000,
"backorders": "no",
"backorders_allowed": false,
"backordered": false,
"low_stock_amount": null,
"sold_individually": false,
"weight": "",
"dimensions": {
"length": "",
"width": "",
"height": ""
},
"shipping_required": true,
"shipping_taxable": true,
"shipping_class": "",
"shipping_class_id": 0,
"reviews_allowed": false,
"average_rating": "0.00",
"rating_count": 0,
"upsell_ids": [],
"cross_sell_ids": [],
"parent_id": 73611,
"purchase_note": "",
"categories": [],
"tags": [],
"images": [],
"attributes": [
{
"id": 6,
"name": "Versione",
"slug": "pa_versione",
"option": "Nuovo"
}
],
"default_attributes": [],
"variations": [],
"grouped_products": [],
"menu_order": 1,
"price_html": "<del aria-hidden="\&quot;true\&quot;"><span class="\&quot;woocommerce-Price-amount" amount\"=""><bdi>13,00<span class="\&quot;woocommerce-Price-currencySymbol\&quot;">&lt;\/span&gt;&lt;\/bdi&gt;&lt;\/span&gt;&lt;\/del&gt; <span class="\&quot;screen-reader-text\&quot;">Il prezzo originale era: 13,00€.&lt;\/span&gt;<ins aria-hidden="\&quot;true\&quot;"><span class="\&quot;woocommerce-Price-amount" amount\"=""><bdi>12,35<span class="\&quot;woocommerce-Price-currencySymbol\&quot;">&lt;\/span&gt;&lt;\/bdi&gt;&lt;\/span&gt;&lt;\/ins&gt;<span class="\&quot;screen-reader-text\&quot;">Il prezzo attuale \u00e8: 12,35€.&lt;\/span&gt;",
"related_ids": [],
"meta_data": [
{
"id": 1501793,
"key": "ISBN",
"value": "9788865934883"
},
{
"id": 1501794,
"key": "misure",
"value": "cm 28x19"
},
{
"id": 1501795,
"key": "formato",
"value": "Brossura"
},
{
"id": 1501796,
"key": "pagine",
"value": "32"
},
{
"id": 1501798,
"key": "_wpro_variable_is_preorder",
"value": "yes"
},
{
"id": 1501799,
"key": "_is_pre_order",
"value": "yes"
},
{
"id": 1521636,
"key": "_pre_order_date",
"value": "2025-01-21"
},
{
"id": 1521637,
"key": "_wpro_date_label_variable",
"value": "Prenotalo per riceverlo entro il 21 gennaio 2025"
},
{
"id": 1521638,
"key": "_wpro_no_date_label_variable",
"value": ""
},
{
"id": 1521639,
"key": "_wpro_manage_price_variable",
"value": ""
},
{
"id": 1521640,
"key": "_wpro_price_variable",
"value": ""
},
{
"id": 1521641,
"key": "_wpro_label_variable",
"value": "Pre Ordinalo!"
},
{
"id": 1521642,
"key": "_wpro_price_type_variable",
"value": "manual"
},
{
"id": 1521643,
"key": "_wpro_amount_price_variable",
"value": "fixed"
},
{
"id": 1521644,
"key": "_wpro_date_variable",
"value": "2025-01-21"
},
{
"id": 1521645,
"key": "_wpro_time_variable",
"value": ""
},
{
"id": 1521646,
"key": "_rank_math_gtin_code",
"value": ""
},
{
"id": 1521698,
"key": "_ywpo_preorder",
"value": "yes"
},
{
"id": 1521699,
"key": "_ywpo_availability_date_mode",
"value": "date"
},
{
"id": 1521700,
"key": "_ywpo_for_sale_date",
"value": "1736809200"
},
{
"id": 1521701,
"key": "_ywpo_price_mode",
"value": "default"
},
{
"id": 1521702,
"key": "_ywpo_preorder_price",
"value": "0"
},
{
"id": 1521703,
"key": "_ywpo_preorder_discount_percentage",
"value": ""
},
{
"id": 1521704,
"key": "_ywpo_preorder_discount_fixed",
"value": ""
},
{
"id": 1521705,
"key": "_ywpo_preorder_increase_percentage",
"value": ""
},
{
"id": 1521706,
"key": "_ywpo_preorder_increase_fixed",
"value": ""
},
{
"id": 1521707,
"key": "edizione",
"value": ""
}
],
"stock_status": "instock",
"has_options": false,
"post_password": "",
"global_unique_id": "",
"jetpack_sharing_enabled": true,
"jetpack-related-posts": [],
"builder_content": "",
"_links": {
"self": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products\/73612",
"targetHints": {
"allow": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
]
}
}
],
"collection": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products"
}
],
"up": [
{
"href": "https:\/\/www.fioredellavita.it\/wp-json\/wc\/v3\/products\/73611"
}
]
}
}</span></span></bdi></span></ins></span></span></bdi></span></del></pre></div>
<div id="loading" style="display: none;"></div>
<script>
const form = document.getElementById('articleForm');
const result = document.getElementById('result');
const loading = document.getElementById('loading');
const buttons = form.querySelectorAll('button');
buttons.forEach(button => button.addEventListener('click', handleButtonClick));
function handleButtonClick(event) {
let action = event.target.dataset.action;
let id = '0';
try {
id = form.querySelector('input[name="id"]').value;
if (!action) {
action = form.querySelector('input[name="action"]').value;
}
} catch (e) {
id = 0;
}
if (!id) {
id = 0;
}
loading.style.display = 'block'; // Mostra la clessidra
let baseUrl = window.location.href;
baseUrl = baseUrl.slice(0, baseUrl.lastIndexOf('/'));
fetch(`${baseUrl}/handle-article-action-pao/${id}/${action}`)
.then(response => response.text())
.then(data => {
result.innerHTML = data;
loading.style.display = 'none'; // Nasconde la clessidra una volta completato
});
}
</script>
<deepl-input-controller><template shadowrootmode="open"><link rel="stylesheet" href="chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.css"><div dir="ltr" style="visibility: initial !important;"><div class="dl-input-translation-container svelte-95aucy"><div></div></div></div></template></deepl-input-controller></body></html>

0
docs/router/admin_router Normal file
View File

12
docs/test.htm Normal file
View File

@@ -0,0 +1,12 @@
<div class="row align-start" style="gap:0px;flex-direction:column;flex:1;display:flex;justify-content:space-between;">
<!-- Parte superiore -->
<div class="justify-start" style="flex-grow:0"><span style="font-size:calc(12 * var(--scalecatalogx) * 1px)"
class="book-author">{autore}</span>
<div style="font-size:calc(16 * var(--scalecatalogx) * 1px);font-weight:bold;" class="book-title">{titolo}</div>
<span class="book-descr">{descrizione}</span>
</div><!-- Parte inferiore (book-details e barcode) -->
<div style="margin-top:auto;width:100%">
<div class="justify-end book-details" style="flex-grow:0;font-size:calc(10 * var(--scalecatalog) * 1px);">
Pagine: <b>{pagine}</b><br />Formato: <b>{misure}</b><br />Prezzo: <b>{prezzo} €</b><br /></div>
</div>
</div>

View File

@@ -2,22 +2,18 @@ module.exports = {
apps : [
{
name: "FreePlanetServerSide",
script: "./src/server/server.js",
script: "./src/server.js",
ignore_watch : ["node_modules"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
watch: false,
//autorestart: true,
instances: 1,
env: {
"PORT": 3000,
"NODE_ENV": "development",
},
env_test: {
"PORT": 3001,
"NODE_ENV": "test",
},
env_production: {
"PORT": 3000,
"NODE_ENV": "production",
},
log_file: "logs/combined.outerr.log",

21
ecosystem.config.pcb_prod.js Executable file
View File

@@ -0,0 +1,21 @@
module.exports = {
apps: [
{
name: "PCB-PROD",
script: "/var/www/nodejs_piuchebuono_server/src/server.js",
ignore_watch: ["node_modules", "logs"],
// interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
//autorestart: true,
instances: 1,
watch: false,
env: {
"NODE_ENV": "production"
},
log_file: "logs/combined.test.outerr.log",
error_file: "logs/errtest.log",
out_file: "logs/outtest.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
}
]
};

21
ecosystem.config.pcb_test.js Executable file
View File

@@ -0,0 +1,21 @@
module.exports = {
apps: [
{
name: "PCB-TEST",
script: "/var/www/nodejs_test.piuchebuono_server/src/server.js",
ignore_watch: ["node_modules", "logs"],
// interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
instances: 1,
watch: false,
env: {
"PORT": 0,
"NODE_ENV": "test"
},
log_file: "logs/combined.test.outerr.log",
error_file: "logs/errtest.log",
out_file: "logs/outtest.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
}
]
};

View File

@@ -0,0 +1,21 @@
module.exports = {
apps: [
{
name: "PRODUZIONE - FREEPLANET",
script: "/var/www/www.freeplanet_server/src/server.js",
ignore_watch: ["node_modules", "logs"],
// interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
//autorestart: true,
instances: 1,
watch: false,
env: {
"NODE_ENV": "production"
},
log_file: "logs/combined.outerr.log",
error_file: "logs/error.log",
out_file: "logs/out.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
}
]
};

21
ecosystem.config.riso_prod.js Executable file
View File

@@ -0,0 +1,21 @@
module.exports = {
apps: [
{
name: "RISO-PROD",
script: "/var/www/nodejs_riso_server/src/server.js",
ignore_watch: ["node_modules", "logs"],
// interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
//autorestart: true,
instances: 1,
watch: false,
env: {
"NODE_ENV": "production"
},
log_file: "logs/combined.outerr.log",
error_file: "logs/error.log",
out_file: "logs/out.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
}
]
};

View File

@@ -1,12 +1,11 @@
module.exports = {
apps : [
apps: [
{
name: "TESTRISO2 FreePlanetServerSide",
script: "./src/server/server.js",
ignore_watch : ["node_modules"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
name: "RISO-TEST",
script: "./src/server.js",
ignore_watch: ["node_modules", "logs"],
// interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
watch: false,
//autorestart: true,
instances: 1,
env_test: {
"PORT": 3001,

BIN
emails/.DS_Store vendored

Binary file not shown.

View File

@@ -0,0 +1,492 @@
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;
}
.email-body {
padding: 32px 24px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
}
.congrats-card {
background: linear-gradient(135deg, #e8f5e9 0%, #f1f8f4 100%);
border: 2px solid #7cb342;
border-radius: 12px;
padding: 24px;
margin: 20px 0;
text-align: center;
}
.congrats-card .congrats-icon {
font-size: 48px;
margin-bottom: 12px;
}
.congrats-card h3 {
font-size: 22px;
color: #558b2f;
margin-bottom: 12px;
font-weight: 700;
}
.congrats-card .territory-name {
font-size: 20px;
color: #7cb342;
font-weight: 600;
margin-top: 8px;
}
.info-section {
background: #ffffff;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
}
.info-section h3 {
font-size: 18px;
color: #1a1a1a;
margin-bottom: 16px;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
}
.info-section p {
font-size: 15px;
color: #555;
line-height: 1.7;
margin-bottom: 12px;
}
.info-section ul {
margin: 12px 0;
padding-left: 24px;
}
.info-section li {
font-size: 15px;
color: #555;
line-height: 1.7;
margin-bottom: 8px;
}
.highlight-box {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border-left: 4px solid #f0ad4e;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.highlight-box h4 {
font-size: 17px;
color: #f0ad4e;
margin-bottom: 12px;
font-weight: 600;
}
.highlight-box p {
font-size: 15px;
color: #555;
line-height: 1.7;
margin-bottom: 8px;
}
.example-box {
background: #e3f2fd;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.example-box h4 {
font-size: 16px;
color: #1976d2;
margin-bottom: 12px;
font-weight: 600;
}
.example-box .transaction {
background: white;
border-radius: 6px;
padding: 12px;
margin: 8px 0;
font-size: 14px;
}
.example-box .benefit {
background: #c8e6c9;
border-radius: 6px;
padding: 12px;
margin-top: 12px;
font-size: 14px;
color: #2e7d32;
}
.steps-box {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.steps-box h4 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 16px;
font-weight: 600;
text-align: center;
}
.step-item {
display: flex;
align-items: flex-start;
margin-bottom: 16px;
padding: 12px;
background: white;
border-radius: 6px;
}
.step-number {
font-size: 24px;
font-weight: 700;
color: #7cb342;
min-width: 40px;
margin-right: 12px;
}
.step-content h5 {
font-size: 16px;
color: #1a1a1a;
margin-bottom: 6px;
font-weight: 600;
}
.step-content p {
font-size: 14px;
color: #555;
line-height: 1.6;
margin: 0;
}
.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;
}
.community-box {
background: linear-gradient(135deg, #e8f5e9 0%, #f1f8f4 100%);
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
}
.community-box h4 {
font-size: 17px;
color: #558b2f;
margin-bottom: 12px;
font-weight: 600;
}
.community-box p {
font-size: 15px;
color: #555;
line-height: 1.7;
margin-bottom: 12px;
}
.community-box a {
color: #2196f3;
text-decoration: none;
font-weight: 600;
}
.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;
}
.email-body {
padding: 20px 16px;
}
.congrats-card .congrats-icon {
font-size: 40px;
}
.congrats-card h3 {
font-size: 20px;
}
.cta-button {
padding: 16px 40px;
font-size: 18px;
width: 100%;
max-width: 300px;
}
.step-item {
flex-direction: column;
}
.step-number {
margin-bottom: 8px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt=nomeapp)
h1 🎉 Benvenuto nel #{nomeTerritorio}!
p.subtitle Sei stato abilitato con successo
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{usernameMembro}</strong>,<br>
| complimenti! Sei stato abilitato #{nomeTerritorio} da #{usernameInvitante}.
if linkProfiloAdmin
.divider(style="margin: 16px 0;")
p(style="text-align: center; margin: 16px 0;")
a.profile-button(href=linkProfiloAdmin target="_blank" style="display: inline-block; padding: 10px 24px; font-size: 15px; font-weight: 600; color: #7cb342; background: white; border: 2px solid #7cb342; border-radius: 20px; text-decoration: none; transition: all 0.3s ease;")
span(style="margin-right: 6px;") 👤
| Profilo #{usernameInvitante}
//- Congratulazioni
.congrats-card
.congrats-icon ✅
h3 Abilitazione Completata
p(style="font-size: 15px; color: #555; margin-top: 8px;")
| Ora puoi utilizzare i #{symbol} per i tuoi scambi nella comunità
.territory-name 📍 #{nomeTerritorio}
//- Info comunità
.community-box
h4 💬 Unisciti alla Comunità Territoriale
p
| Entra nel gruppo Telegram di <strong>#{nomeTerritorio}</strong> per interagire con i partecipanti, rimanere aggiornato su eventi, mercatini e opportunità di scambio nella tua zona, e per poter inserire, anche tu, annunci di offro/cerco.
if linkTelegramTerritorio
a.telegram-button(href=linkTelegramTerritorio target="_blank" style="display: inline-block; margin-top: 16px; padding: 14px 32px; font-size: 17px; font-weight: 600; color: white; background: linear-gradient(135deg, #0088cc 0%, #006699 100%); border-radius: 25px; text-decoration: none; box-shadow: 0 4px 12px rgba(0, 136, 204, 0.3); transition: all 0.3s ease;")
span(style="font-size: 20px; margin-right: 8px; vertical-align: middle;") ✈️
| Unisciti al gruppo Telegram
//- Cos'è RIS
.info-section
h3
span 💰
| Cosa sono i RIS?
p
| <strong>RIS</strong> (Rete Italiana Scambio) è un sistema di <strong>credito comunitario</strong> basato sulla fiducia reciproca. Non sono soldi tradizionali, ma un'unità di misura che rappresenta il valore degli scambi all'interno della comunità RISO.
p
| <strong>Parità con l'Euro:</strong> 1 RIS = 1 Euro (solo come riferimento di valore, non come convertibilità)
//- Come funziona la fiducia
.highlight-box
h4 🤝 Come Funziona la "Fiducia Concessa"
p
| <strong>Parti da 0 RIS</strong> - Non devi avere un "saldo positivo" per iniziare a scambiare!
p
| <strong>Quando ricevi</strong> un bene o servizio pagando in RIS → il tuo saldo <strong>diventa positivo</strong>
p
| <strong>Quando offri</strong> un bene o servizio ricevendo RIS → il tuo saldo <strong>diventa negativo</strong>
p(style="margin-top: 12px; padding-top: 12px; border-top: 1px solid #f0ad4e;")
| 💡 <strong>Il saldo negativo non è un debito!</strong> È la fiducia che la comunità ti concede. Significa che hai ricevuto prima di aver dato, e la comunità si fida che restituirai nel tempo.
//- Esempio pratico
.example-box
h4 📖 Esempio Pratico
.transaction
| <strong>Situazione:</strong> Sei un grafico e vuoi comprare 100€ di verdure da un produttore locale
.transaction
| <strong>Transazione mista:</strong>
| <br>• Paghi <strong>80€ in Euro</strong>
| <br>• Paghi <strong>20 RIS</strong> (20% in RIS)
| <br><br>🔻 Il tuo saldo RIS passa da 0 a <strong>-20 RIS</strong>
.benefit
| <strong>✓ Beneficio:</strong> Hai ridotto del 20% l'uso degli Euro, sostenendo il produttore locale e rafforzando la comunità! Puoi iniziare con percentuali basse (5-10%) e aumentare man mano che acquisisci fiducia.
//- Come riequilibrare
.info-section
h3
span ⚖️
| Come Riequilibrare il Saldo
p
| Per riportare il tuo saldo verso lo zero (o in positivo), puoi:
ul
li <strong>Offrire beni o servizi</strong> ricevendo RIS in cambio
li <strong>Vendere prodotti</strong> accettando pagamenti parziali o totali in RIS
li <strong>Mettere annunci</strong> sulla piattaforma specificando che accetti RIS
li <strong>Partecipare ai mercatini</strong> locali della comunità RISO
//- Primi passi
.steps-box
h4 🚀 I Tuoi Primi Passi
.step-item
.step-number 1
.step-content
h5 Esplora la Piattaforma
p Familiarizza con gli annunci, i membri e le funzionalità del #{nomeTerritorio}
.step-item
.step-number 2
.step-content
h5 Crea il Tuo Primo Annuncio
p Pubblica cosa offri o cosa cerchi, specificando se accetti pagamenti in RIS
.step-item
.step-number 3
.step-content
h5 Inizia con Piccole Transazioni
p Comincia con percentuali basse di RIS (5-10%) per prendere confidenza e vedi cosa succede. Più siamo aperti noi e più l'Universo ci aiuta e sostiene e ci dona quello di cui abbiamo bisogno.
.step-item
.step-number 4
.step-content
h5 Partecipa alla Comunità
p Unisciti agli incontri locali e ai mercatini per conoscere altri membri. Se non ci sono membri che propongono incontri, puoi proporti anche tu!
//- CTA
.cta-section
.cta-title Inizia Subito a Usare i RIS!
a.cta-button(href=strlinksito target="_blank")
span.button-icon 🌾
| Vai alla Piattaforma
//- Supporto
.info-section
h3
span ❓
| Hai Domande?
p
| Se hai dubbi sul funzionamento dei RIS o sulla piattaforma, non esitare a:
ul
li Contattare il facilitatore del tuo territorio
li Chiedere nel gruppo Telegram locale
li Partecipare agli incontri di comunità
//- Footer
.email-footer
.divider
p Benvenuto nella Rete Italiana Scambio orizzontale - #{nomeTerritorio}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp}

View File

@@ -0,0 +1 @@
=`Abilitazione avvenuta su ${nomeTerritorio} in ${nomeapp} - (${usernameMembro})`

View File

@@ -0,0 +1,401 @@
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, #e3f2fd 0%, #f0f7ff 100%);
border: 2px solid #2196f3;
border-radius: 8px;
padding: 24px;
margin: 20px 0;
text-align: center;
}
.request-card h3 {
font-size: 14px;
text-transform: uppercase;
color: #2196f3;
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: #2196f3;
}
.territory-badge {
background: linear-gradient(135deg, #4caf50 0%, #388e3c 100%);
color: white;
display: inline-block;
padding: 8px 20px;
border-radius: 20px;
font-size: 16px;
font-weight: 600;
margin-top: 12px;
}
.question-box {
background: #e1f5fe;
border-left: 4px solid #2196f3;
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, #2196f3 0%, #1976d2 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 6px 20px rgba(33, 150, 243, 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;
}
.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;
}
.territory-badge {
font-size: 14px;
padding: 6px 16px;
}
.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 Abilitazione #{nomeTerritorio}
p.subtitle Nuovo membro in attesa di attivazione
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{nomeFacilitatore}</strong>,<br>
| un nuovo membro richiede l'abilitazione alla fiducia al Circuito del tuo territorio!
//- Card richiesta
.request-card
h3 👤 Richiesta Ingresso Circuito
.member-name #{usernameMembro}
if nomeMembro
if cognomeMembro
.member-detail
strong Nome:
| #{nomeMembro} #{cognomeMembro}
else
.member-detail
strong Nome:
| #{nomeMembro}
if emailMembro
.member-detail
strong Email:
| #{emailMembro}
if telegramMembro
.member-detail
strong Telegram:
a(href=`https://t.me/${telegramMembro}` target="_blank" style="color: #2196f3; text-decoration: none;") @#{telegramMembro}
if comuneResidenza
.member-detail
strong Comune:
| #{comuneResidenza} (#{provinciaResidenza})
.territory-badge 📍 #{nomeTerritorio}
if usernameInvitante
.divider(style="margin: 20px auto; width: 80%;")
h3(style="font-size: 14px; text-transform: uppercase; color: #2196f3; margin-bottom: 12px;") 👥 Invitato da
.member-detail
strong Invitante:
| #{usernameInvitante}
if nomeInvitante
if cognomeInvitante
.member-detail
strong Nome:
| #{nomeInvitante} #{cognomeInvitante}
else
.member-detail
strong Nome:
| #{nomeInvitante}
if telegramInvitante
.member-detail
strong Telegram:
a(href=`https://t.me/${telegramInvitante}` target="_blank" style="color: #2196f3; text-decoration: none;") @#{telegramInvitante}
//- CTA principale
.cta-section
a.cta-button(href=linkAbilitazione target="_blank")
span.button-icon ✓
| Abilita fiducia
.divider(style="margin: 24px 0;")
p(style="font-size: 16px; color: #666; margin-bottom: 16px;") Visualizza i profili
.button-group(style="display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;")
a.secondary-button(href=linkProfiloMembro target="_blank" style="display: inline-block; padding: 12px 24px; font-size: 16px; font-weight: 600; color: #2196f3; background: white; border: 2px solid #2196f3; border-radius: 25px; text-decoration: none; transition: all 0.3s ease;")
span(style="margin-right: 6px;") 👤
| Profilo Membro
if linkProfiloInvitante
a.secondary-button(href=linkProfiloInvitante target="_blank" style="display: inline-block; padding: 12px 24px; font-size: 16px; font-weight: 600; color: #7cb342; background: white; border: 2px solid #7cb342; border-radius: 25px; text-decoration: none; transition: all 0.3s ease;")
span(style="margin-right: 6px;") 👥
| Profilo Invitante
//- Responsabilità
.responsibility-box
h3 📋 Compiti del Facilitatore RISO
.responsibility-item
span.responsibility-icon 🔍
span.responsibility-text
strong Verifica:
| Contatta il membro, se non lo conosci, oppure il suo invitante: #{usernameInvitante}
.responsibility-item
span.responsibility-icon 🌍
span.responsibility-text
strong Territorio:
| Assicurati che il membro appartenga effettivamente al territorio di competenza
.responsibility-item
span.responsibility-icon 👥
span.responsibility-text
strong Integrazione:
| Supporta il nuovo membro nell'attivazione e utilizzo del Circuito locale
//- Info box
.info-box
p
| ✓ Dopo l'abilitazione, #{usernameMembro} potrà accedere al #{nomeTerritorio}
p
| ✓ Il membro riceverà una notifica automatica dell'avvenuta attivazione
//- Footer
.email-footer
.divider
p Hai ricevuto questa email in qualità di Facilitatore RISO per #{nomeTerritorio}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp}

View File

@@ -0,0 +1 @@
=`Richiesta ingresso di ${usernameMembro} - ${nomeMembro} ${cognomeMembro} su ${nomeTerritorio} in ${nomeapp}`

View File

@@ -0,0 +1,370 @@
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}
if userprofile && userprofile.profile.resid_str_comune && userprofile.profile.resid_province
.member-detail
strong Comune Residenza:
| #{userprofile.profile.resid_str_comune} (#{userprofile.profile.resid_province})
//- Domanda di conferma
.question-box
p 🤔 Confermi di conoscere #{nomeInvitato}?
//- CTA principale
.cta-section
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à #{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
//- 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}

View File

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

View File

@@ -0,0 +1,534 @@
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: 80px;
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, #2E7D32 0%, #1B5E20 100%);
color: white;
padding: 40px 24px;
text-align: center;
}
.email-header h1 {
margin: 0 0 8px 0;
font-size: 28px;
font-weight: 600;
}
.email-header p {
margin: 8px 0 0 0;
font-size: 16px;
opacity: 0.95;
line-height: 1.5;
}
.welcome-icon {
font-size: 48px;
margin-bottom: 16px;
}
.email-body {
padding: 24px 20px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
padding: 0 10px;
}
.intro-text strong {
color: #2E7D32;
}
.welcome-message {
background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);
border-left: 4px solid #2E7D32;
border-radius: 8px;
padding: 20px;
margin-bottom: 24px;
text-align: center;
}
.welcome-message h2 {
color: #1B5E20;
font-size: 20px;
margin-bottom: 12px;
font-weight: 600;
}
.welcome-message p {
color: #2E7D32;
font-size: 15px;
line-height: 1.6;
margin: 8px 0;
}
.credentials-box {
background: #f8f9fa;
border-left: 4px solid #2E7D32;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
}
.credentials-title {
font-size: 15px;
font-weight: 600;
color: #555;
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.credential-row {
display: flex;
align-items: center;
padding: 8px 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: #2E7D32;
text-decoration: none;
}
.credential-value a:hover {
text-decoration: underline;
}
.cta-section {
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
.cta-title {
font-size: 19px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 8px;
text-align: center;
}
.cta-subtitle {
font-size: 14px;
color: #666;
margin-bottom: 16px;
text-align: center;
line-height: 1.5;
}
.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 28px;
font-size: 15px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #2E7D32 0%, #1B5E20 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(46, 125, 50, 0.3);
transition: transform 0.2s, box-shadow 0.2s;
flex: 1;
min-width: 160px;
max-width: 200px;
text-align: center;
}
.cta-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(46, 125, 50, 0.4);
}
.cta-button-secondary {
background: linear-gradient(135deg, #388E3C 0%, #2E7D32 100%);
box-shadow: 0 4px 12px rgba(56, 142, 60, 0.3);
}
.cta-button-secondary:hover {
box-shadow: 0 6px 16px rgba(56, 142, 60, 0.4);
}
.cta-button-tertiary {
background: linear-gradient(135deg, #66BB6A 0%, #4CAF50 100%);
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
}
.cta-button-tertiary:hover {
box-shadow: 0 6px 16px rgba(76, 175, 80, 0.4);
}
.button-icon {
font-size: 18px;
margin-right: 6px;
vertical-align: middle;
}
.next-steps {
background: #fff;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
}
.next-steps-title {
font-size: 18px;
font-weight: 600;
color: #2E7D32;
margin-bottom: 16px;
text-align: center;
}
.step-item {
display: flex;
align-items: flex-start;
padding: 12px;
margin-bottom: 12px;
background: #f8fdf9;
border-radius: 8px;
border-left: 3px solid #4CAF50;
}
.step-number {
background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%);
color: white;
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 16px;
margin-right: 12px;
flex-shrink: 0;
}
.step-content {
flex: 1;
}
.step-content h3 {
font-size: 16px;
color: #1B5E20;
margin-bottom: 4px;
font-weight: 600;
}
.step-content p {
font-size: 14px;
color: #555;
line-height: 1.5;
margin: 0;
}
.info-box {
background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);
border-radius: 8px;
padding: 16px;
margin-top: 20px;
text-align: center;
border: 1px solid #A5D6A7;
}
.info-box p {
margin: 0;
color: #1B5E20;
font-size: 14px;
line-height: 1.6;
}
.info-box strong {
color: #2E7D32;
}
.community-note {
background: #fff3e0;
border-left: 4px solid #FF9800;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
text-align: center;
}
.community-note p {
color: #E65100;
font-size: 14px;
margin: 0;
line-height: 1.6;
}
.email-footer {
padding: 20px 16px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.email-footer p {
margin: 6px 0;
}
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 24px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 8px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 24px;
}
.email-header p {
font-size: 15px;
}
.email-body {
padding: 20px 14px;
}
.welcome-message {
padding: 16px;
}
.credentials-box {
padding: 16px 12px;
}
.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;
width: 100%;
max-width: 100%;
min-width: 100%;
}
.step-item {
padding: 10px;
}
.step-number {
width: 28px;
height: 28px;
font-size: 14px;
}
.step-content h3 {
font-size: 15px;
}
.step-content p {
font-size: 13px;
}
}
body
.email-container
.email-header
- var baseimg = baseurl + '/';
img.header-logo(src=baseimg+"images/logo.png" alt=nomeapp || 'Logo')
h1 Benvenuto/a #{name || username} nella community RISO! 💚
.email-body
.welcome-message
if ammessoUtente
h2 🎉 Il tuo invitante #{nomeInvitante} ti ha ammesso!
p Sei ora un membro della Rete Italiana di Scambio Orizzontale
p Inizia subito a scoprire beni, servizi e ospitalità nella tua comunità territoriale
.intro-text
| La tua comunità RISO ti aspetta! 🌱 Qui potrai
strong scambiare beni e servizi
| usando i
strong RIS
| , conoscere persone straordinarie e contribuire a costruire
strong un'economia più umana e solidale
| .
.next-steps
.next-steps-title 🎯 I tuoi primi passi nella community RISO
.step-item
.step-number 1
.step-content
h3 ✅ Completa il tuo profilo
p Collega il tuo profilo a Telegram ed accedi ai Circuiti Territoriali per poter iniziare ad usare i RIS. Un profilo completo aiuta gli altri membri a conoscerti meglio!
.step-item
.step-number 2
.step-content
h3 🔍 Esplora gli annunci
p Scopri cosa offrono gli altri membri nella tua area. Potresti trovare esattamente ciò che cerchi!
.step-item
.step-number 3
.step-content
h3 📢 Pubblica il tuo primo annuncio
p Cosa puoi offrire? Beni, servizi o ospitalità - ogni contributo arricchisce la comunità. Ricorda di includere come strumento di scambio il RIS e sperimentalo da subito!
.step-item
.step-number 4
.step-content
h3 💬 Unisciti al gruppo territoriale
p Partecipa alle conversazioni, agli eventi e alle iniziative della tua comunità locale sulle chat Telegram di RISO
.cta-section
.cta-title 🚀 Accedi e inizia il tuo viaggio RISO
.cta-subtitle Scegli come vuoi accedere alla piattaforma
.credentials-box
.credentials-title 📋 I tuoi dati di accesso
if username
.credential-row
.credential-label Username:
.credential-value #{username}
if emailto
.credential-row
.credential-label Email:
.credential-value #{emailto}
if forgetpwd
.credential-row
.credential-label Password:
.credential-value
| (la password che hai inserito)
br
a(href=forgetpwd target="_blank") Hai dimenticato la password?
if strlinksito
.cta-buttons-wrapper
a.cta-button(href=strlinksito target="_blank")
span.button-icon 🌐
| Accedi da Web
a.cta-button.cta-button-secondary(href=strlinksito+'/installaapp' target="_blank")
span.button-icon 📱
| Installa l'App
a.cta-button.cta-button-tertiary(href=strlinksito+'/guida' target="_blank")
span.button-icon 📖
| Leggi la Guida
.info-box
p
strong 💰 Cos'è il RIS?
br
| Il RIS è l'unità di scambio della comunità RISO, basata sulla
strong fiducia reciproca
| . Parti da 0 RIS e accumula crediti offrendo i tuoi beni/servizi. Usalo per ottenere ciò di cui hai bisogno. Il bilancio totale della comunità è sempre zero - ogni credito corrisponde al debito di qualcun altro.
.community-note
p
| 🤝
strong Ricorda:
| Ogni scambio che fai, ogni annuncio che pubblichi, ogni interazione che hai rafforza la rete RISO. Non sei solo un utente -
strong sei un membro attivo
| di una comunità che crede nella solidarietà e nella condivisione!
.email-footer
.divider
p 💚 Benvenuto/a nella famiglia RISO!
p(style="margin-top: 8px;") Hai ricevuto questa email perché sei stato/a ammesso/a nella comunità #{nomeapp || 'RISO'}
p(style="margin-top: 12px; font-size: 12px;")
| © #{new Date().getFullYear()} #{nomeapp || 'RISO'} - Rete Italiana di Scambio Orizzontale
p(style="margin-top: 8px; font-size: 11px; color: #999;")
| Costruiamo insieme un'economia più umana e solidale

View File

@@ -0,0 +1 @@
=`Benvenuto in ${nomeapp}`

View File

@@ -0,0 +1,394 @@
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;
}
.success-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;
}
.highlight-box {
background: #fff8dc;
border-left: 4px solid #7cb342;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.highlight-box p {
margin: 0;
font-size: 17px;
color: #1a1a1a;
line-height: 1.6;
}
.member-card {
background: linear-gradient(135deg, #f8fdf8 0%, #e8f5e9 100%);
border: 2px solid #7cb342;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
}
.member-card h3 {
font-size: 14px;
text-transform: uppercase;
color: #558b2f;
margin-bottom: 12px;
letter-spacing: 0.5px;
font-weight: 600;
}
.member-card .member-name {
font-size: 24px;
color: #1a1a1a;
font-weight: 600;
margin-bottom: 8px;
}
.member-card .member-detail {
font-size: 15px;
color: #555;
margin: 6px 0;
}
.member-card .member-detail strong {
color: #558b2f;
}
.info-box {
background: #e8f5e9;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.info-box p {
margin: 0 0 8px 0;
color: #2e7d32;
font-size: 16px;
line-height: 1.6;
}
.info-box p:last-child {
margin-bottom: 0;
}
.tips-section {
background: #f8f9fa;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.tips-section h3 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.tip-item {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
padding: 6px 0;
}
.tip-icon {
font-size: 20px;
margin-right: 10px;
min-width: 24px;
flex-shrink: 0;
}
.tip-text {
font-size: 16px;
color: #555;
line-height: 1.5;
}
.buttprof-section {
text-align: center;
}
.cta-section {
text-align: center;
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
.cta-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16px;
}
.cta-button {
display: inline-block;
padding: 16px 48px;
font-size: 18px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(124, 179, 66, 0.3);
transition: all 0.3s ease;
}
.thank-you-box {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
}
.thank-you-box p {
font-size: 17px;
color: #555;
line-height: 1.7;
margin: 8px 0;
}
.thank-you-box strong {
color: #558b2f;
}
.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;
}
.profile-button {
display: inline-block;
margin-top: 16px;
padding: 12px 32px;
font-size: 16px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 25px;
text-decoration: none;
box-shadow: 0 3px 10px rgba(124, 179, 66, 0.25);
transition: all 0.3s ease;
}
@media only screen and (max-width: 600px) {
body {
padding: 10px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 22px;
}
.success-icon {
font-size: 48px;
}
.email-body {
padding: 20px 16px;
}
.cta-button {
padding: 14px 32px;
font-size: 16px;
width: 100%;
max-width: 300px;
}
.member-card .member-name {
font-size: 20px;
}
.tip-item {
font-size: 15px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt=nomeapp+' - Rete Italiana Scambio orizzontale')
h1 🎉 Il tuo invito è stato accettato!
p.subtitle Un nuovo membro si è unito a #{nomeapp}
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{nomeInvitante}</strong>,<br>
| la persona che hai invitato, o che ha usato il tuo username come invitante, si è appena registrata su #{nomeapp}!
//- Card nuovo membro
.member-card
h3 👤 Nuovo Membro Registrato
.member-name #{nomeInvitato}
if emailInvitato
.member-detail
strong Email:
a(href=`mailto:${emailInvitato}` style="color: #667eea; text-decoration: none;") #{emailInvitato}
if usernameInvitato
.member-detail
strong Username:
| #{usernameInvitato}
//- Bottone profilo
if usernameInvitato
.buttprof-section
a.profile-button(href=strlinksito + '/my/' + usernameInvitato target="_blank")
| 👤 Visualizza Profilo di #{usernameInvitato}
//- Ringraziamento
.thank-you-box
p
| 🙏 <strong>Grazie per aver contribuito alla crescita di #{nomeapp}!</strong>
p
| Ogni nuovo ingresso rende la nostra comunità più forte e ricca di opportunità.
| Il tuo invito aiuta #{nomeInvitato} a scoprire un nuovo modo di fare economia,
| basato su fiducia, comunità e scambi solidali.
//- Suggerimenti
.tips-section
h3 💡 Come puoi aiutare #{nomeInvitato}
.tip-item
span.tip-icon 🤝
span.tip-text
strong Connettiti con loro:
| Aiutali a sentirsi parte della comunità e presentali ad altri membri del circuito
.tip-item
span.tip-icon 📱
span.tip-text
strong Mostra come funziona #{nomeapp}:
| Spiega come creare annunci, usare i RIS e partecipare agli scambi nella tua zona
.tip-item
span.tip-icon 📲
span.tip-text
strong Gruppo Telegram:
| Incoraggiali a unirsi al gruppo Telegram del vostro circuito provinciale
.tip-item
span.tip-icon 🎯
span.tip-text
strong Profilo completo:
| Ricorda loro di completare il profilo per poter iniziare a scambiare
//- Info box
.info-box
p
| ✓ #{nomeInvitato} ha ricevuto un'email di benvenuto con tutte le istruzioni
p
| ✓ Dovrà completare il profilo prima di poter usare i RIS
p
| ✓ Il facilitatore locale valuterà l'abilitazione all'uso dei RIS
//- CTA
.cta-section
.cta-title Visita la Piattaforma
a.cta-button(href=strlinksito target="_blank") Vai su #{nomeapp}
//- Highlight box
.highlight-box
p
| 🌱 <strong>Costruiamo insieme un'economia più solidale!</strong><br>
| Continua a condividere #{nomeapp} con persone di fiducia della tua comunità.
| Più siamo, più scambi possibili ci sono per tutti!
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché hai invitato #{nomeInvitato} su #{nomeapp} oppure la persona ha usato il tuo username come invitante
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp} - Rete Italiana Scambio orizzontale
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

View File

@@ -0,0 +1 @@
=`🎉 Il tuo invito è stato accettato su RISO da ${name ? name : username} !`

View File

@@ -1,71 +0,0 @@
p #{username} (#{name} #{surname}) si è appena Iscritto ad Arcadei Foundation su #{nomeapp}
p Con i seguenti dati di accesso:
span Nome:&nbsp;
strong #{iscritto.name}<br>
span Cognome:&nbsp;
strong #{iscritto.surname}<br>
span Email:&nbsp;
strong #{iscritto.email}<br>
span Email Secondaria:&nbsp;
strong #{iscritto.email2}<br>
span Indirizzo di Residenza:&nbsp;
strong #{iscritto.residency_address}<br>
span Città di Residenza:&nbsp;
strong #{iscritto.residency_city}<br>
span Provincia:&nbsp;
strong #{iscritto.residency_province}<br>
span CAP:&nbsp;
strong #{iscritto.residency_zipcode}<br>
span Nazione:&nbsp;
strong #{iscritto.residency_country}<br>
span Data di Nascita:&nbsp;
strong #{data_nascita}<br>
span Città di Nascita:&nbsp;
strong #{iscritto.born_city}<br>
span Provincia di Nascita:&nbsp;
strong #{iscritto.born_province}<br>
span Paese di Nascita:&nbsp;
strong #{iscritto.born_country}<br>
span Telefono:&nbsp;
strong #{iscritto.cell_phone}<br>
span Telefono2:&nbsp;
strong #{iscritto.cell_phone2}<br>
span Tipo di Documento :&nbsp;
strong #{iscritto.doctype}<br>
span Numero Documento :&nbsp;
strong #{iscritto.documentnumber}<br>
span Metodo di Pagamento :&nbsp;
strong #{iscritto.metodo_pagamento}<br>
span Quota scelta da versare :&nbsp;
strong #{iscritto.quota_versata}<br>
span Scrivi altre eventuali informazioni o comunicazioni:&nbsp;
strong #{iscritto.altre_comunicazioni}<br>
span Categorie d'Interesse :&nbsp;
strong #{iscritto.categorie_interesse}<br>
p <br>Saluti
style(type="text/css").
html, body {
padding: 0;
margin: 0;
}
p {
font-size: 1rem;
}
.divbtn {
display: flex;
align-items: center;
justify-content: center;
}
.btn-lg {
padding: 5px;
margin: 5px;
font-size: 26px;
cursor: pointer;
color: white;
background: #027be3 !important;
border-radius: 28px;
}

View File

@@ -1 +0,0 @@
=`Nuova Iscrizione Arcadei di ${name} ${surname} (${emailto}) su ${nomeapp}`

View File

@@ -1,40 +1,185 @@
p #{username} (#{name} #{surname}) si è appena Registrato su #{nomeapp}
p Con i seguenti dati di accesso:
span Username:&nbsp;
strong #{username}<br>
span Email:&nbsp;
strong #{emailto}<br>
span Invitante:&nbsp;
strong #{aportador_solidario}<br>
span Nome:&nbsp;
strong #{user.name}<br>
span Cognome:&nbsp;
strong #{user.surname}<br>
span Cellulare:&nbsp;
strong #{user.profile.intcode_cell} #{user.profile.cell}<br>
span Nazionalità:&nbsp;
strong #{user.profile.nationality}<br>
p <br>Saluti
style(type="text/css").
html, body {
padding: 0;
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;
}
.divbtn {
display: flex;
align-items: center;
justify-content: center;
}
.btn-lg {
padding: 5px;
margin: 5px;
font-size: 26px;
cursor: pointer;
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;
}
.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, #027be3 0%, #0056b3 100%);
color: white;
background: #027be3 !important;
border-radius: 28px;
padding: 32px 24px;
text-align: center;
}
.email-header h1 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.email-header p {
margin: 8px 0 0 0;
font-size: 14px;
opacity: 0.9;
}
.email-body {
padding: 32px 24px;
}
.user-info {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin-bottom: 24px;
}
.info-row {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #e0e0e0;
}
.info-row:last-child {
border-bottom: none;
}
.info-label {
font-weight: 600;
color: #555;
min-width: 140px;
font-size: 14px;
}
.info-value {
color: #1a1a1a;
font-size: 14px;
flex: 1;
word-break: break-word;
}
.email-footer {
padding: 24px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.highlight {
display: inline-block;
background: #e3f2fd;
color: #027be3;
padding: 2px 8px;
border-radius: 4px;
font-weight: 600;
}
@media only screen and (max-width: 600px) {
body {
padding: 10px;
}
.email-header {
padding: 24px 16px;
}
.email-body {
padding: 24px 16px;
}
.info-row {
flex-direction: column;
}
.info-label {
margin-bottom: 4px;
}
}
}
body
.email-container
.email-header
h1 ✓ Nuova Registrazione su #{nomeapp}
p #{nomeapp || 'Piattaforma'}
.email-body
p(style="margin-bottom: 20px; font-size: 15px; color: #333;")
| L'utente
span.highlight #{username || 'N/D'}
| si è appena registrato sulla piattaforma #{nomeapp}.
.user-info
if username
.info-row
.info-label Username:
.info-value #{username}
if emailto
.info-row
.info-label Email:
.info-value #{emailto}
if user && user.name
.info-row
.info-label Nome:
.info-value #{user.name}
if user && user.surname
.info-row
.info-label Cognome:
.info-value #{user.surname}
if user && user.profile && (user.profile.cell || user.profile.intcode_cell)
.info-row
.info-label Cellulare:
.info-value
| #{user.profile.intcode_cell || ''} #{user.profile.cell || ''}
if user && user.profile && (user.profile.resid_str_comune && user.profile.resid_province)
.info-row
.info-label Comune di Residenza:
.info-value
| #{user.profile.resid_str_comune || ''} (#{user.profile.resid_province || ''})
if user && user.profile && user.profile.nationality
.info-row
.info-label Nazionalità:
.info-value #{user.profile.nationality}
if aportador_solidario
.info-row
.info-label Invitante:
.info-value #{aportador_solidario}
if idMyGroup
.info-row
.info-label Gruppo:
.info-value #{idMyGroup}
.email-footer
p Questa è una email automatica di notifica
p(style="margin-top: 8px; font-size: 12px;")
| © #{new Date().getFullYear()} #{nomeapp || ''}.

View File

@@ -0,0 +1,375 @@
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}
if userprofile && userprofile.profile.resid_str_comune && userprofile.profile.resid_province
.member-detail
strong Comune Residenza:
| #{userprofile.profile.resid_str_comune} (#{userprofile.profile.resid_province})
//- 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

@@ -0,0 +1,471 @@
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: 80px;
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, #2E7D32 0%, #1B5E20 100%);
color: white;
padding: 40px 24px;
text-align: center;
}
.email-header h1 {
margin: 0 0 8px 0;
font-size: 28px;
font-weight: 600;
}
.email-header p {
margin: 8px 0 0 0;
font-size: 16px;
opacity: 0.95;
line-height: 1.5;
}
.welcome-icon {
font-size: 48px;
margin-bottom: 16px;
}
.email-body {
padding: 24px 20px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
padding: 0 10px;
}
.intro-text strong {
color: #2E7D32;
}
.welcome-message {
background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);
border-left: 4px solid #2E7D32;
border-radius: 8px;
padding: 20px;
margin-bottom: 24px;
text-align: center;
}
.welcome-message h2 {
color: #1B5E20;
font-size: 20px;
margin-bottom: 12px;
font-weight: 600;
}
.welcome-message p {
color: #2E7D32;
font-size: 15px;
line-height: 1.6;
margin: 8px 0;
}
.credentials-box {
background: #f8f9fa;
border-left: 4px solid #2E7D32;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
}
.credentials-title {
font-size: 15px;
font-weight: 600;
color: #555;
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.credential-row {
display: flex;
align-items: center;
padding: 8px 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: #2E7D32;
text-decoration: none;
}
.credential-value a:hover {
text-decoration: underline;
}
.cta-section {
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
.cta-title {
font-size: 19px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 8px;
text-align: center;
}
.cta-subtitle {
font-size: 14px;
color: #666;
margin-bottom: 16px;
text-align: center;
line-height: 1.5;
}
.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 28px;
font-size: 15px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #2E7D32 0%, #1B5E20 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(46, 125, 50, 0.3);
transition: transform 0.2s, box-shadow 0.2s;
flex: 1;
min-width: 160px;
max-width: 200px;
text-align: center;
}
.cta-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(46, 125, 50, 0.4);
}
.cta-button-secondary {
background: linear-gradient(135deg, #388E3C 0%, #2E7D32 100%);
box-shadow: 0 4px 12px rgba(56, 142, 60, 0.3);
}
.cta-button-secondary:hover {
box-shadow: 0 6px 16px rgba(56, 142, 60, 0.4);
}
.cta-button-tertiary {
background: linear-gradient(135deg, #66BB6A 0%, #4CAF50 100%);
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
}
.cta-button-tertiary:hover {
box-shadow: 0 6px 16px rgba(76, 175, 80, 0.4);
}
.button-icon {
font-size: 18px;
margin-right: 6px;
vertical-align: middle;
}
.next-steps {
background: #fff;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
}
.next-steps-title {
font-size: 18px;
font-weight: 600;
color: #2E7D32;
margin-bottom: 16px;
text-align: center;
}
.step-item {
display: flex;
align-items: flex-start;
padding: 12px;
margin-bottom: 12px;
background: #f8fdf9;
border-radius: 8px;
border-left: 3px solid #4CAF50;
}
.step-number {
background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%);
color: white;
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 16px;
margin-right: 12px;
flex-shrink: 0;
}
.step-content {
flex: 1;
}
.step-content h3 {
font-size: 16px;
color: #1B5E20;
margin-bottom: 4px;
font-weight: 600;
}
.step-content p {
font-size: 14px;
color: #555;
line-height: 1.5;
margin: 0;
}
.info-box {
background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);
border-radius: 8px;
padding: 16px;
margin-top: 20px;
text-align: center;
border: 1px solid #A5D6A7;
}
.info-box p {
margin: 0;
color: #1B5E20;
font-size: 14px;
line-height: 1.6;
}
.info-box strong {
color: #2E7D32;
}
.community-note {
background: #fff3e0;
border-left: 4px solid #FF9800;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
text-align: center;
}
.community-note p {
color: #E65100;
font-size: 14px;
margin: 0;
line-height: 1.6;
}
.email-footer {
padding: 20px 16px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.email-footer p {
margin: 6px 0;
}
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 24px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 8px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 24px;
}
.email-header p {
font-size: 15px;
}
.email-body {
padding: 20px 14px;
}
.welcome-message {
padding: 16px;
}
.credentials-box {
padding: 16px 12px;
}
.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;
width: 100%;
max-width: 100%;
min-width: 100%;
}
.step-item {
padding: 10px;
}
.step-number {
width: 28px;
height: 28px;
font-size: 14px;
}
.step-content h3 {
font-size: 15px;
}
.step-content p {
font-size: 13px;
}
}
body
.email-container
.email-header
- var baseimg = baseurl + '/';
img.header-logo(src=baseimg+"images/logo.png" alt=nomeapp || 'Logo')
h1 💚 #{name || username ? ',' : ''} Benvenuto/a nella piattaforma #{nomeapp} 💚 !
.email-body
.welcome-message
if ammessoUtente
h2 🎉 Il tuo invitante #{nomeInvitante} ti ha ammesso!
p Sei ora un membro attivo della Rete Italiana di Scambio Orizzontale
p Inizia subito a scoprire beni, servizi e ospitalità nella tua comunità territoriale
.credentials-box
.credentials-title 📋 I tuoi dati di accesso
if username
.credential-row
.credential-label Username:
.credential-value #{username}
if emailto
.credential-row
.credential-label Email:
.credential-value #{emailto}
if forgetpwd
.credential-row
.credential-label Password:
.credential-value
| (la password che hai inserito)
br
a(href=forgetpwd target="_blank") Hai dimenticato la password?
.cta-section
.cta-title 🚀 Accedi e inizia il tuo viaggio
.cta-subtitle Scegli come vuoi accedere alla piattaforma
if strlinksito
.cta-buttons-wrapper
a.cta-button(href=strlinksito target="_blank")
span.button-icon 🌐
| Accedi da Web
.email-footer
.divider
p 💚 Benvenuto/a nella famiglia #{nomeapp}!
p(style="margin-top: 8px;") Hai ricevuto questa email perché sei stato/a ammesso/a nella community di #{nomeapp}
p(style="margin-top: 12px; font-size: 12px;")
| © #{new Date().getFullYear()} #{nomeapp}

View File

@@ -0,0 +1 @@
=`Benvenuto in ${nomeapp}`

View File

@@ -0,0 +1,342 @@
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;
}
.success-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;
}
.highlight-box {
background: #fff8dc;
border-left: 4px solid #7cb342;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.highlight-box p {
margin: 0;
font-size: 17px;
color: #1a1a1a;
line-height: 1.6;
}
.member-card {
background: linear-gradient(135deg, #f8fdf8 0%, #e8f5e9 100%);
border: 2px solid #7cb342;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
}
.member-card h3 {
font-size: 14px;
text-transform: uppercase;
color: #558b2f;
margin-bottom: 12px;
letter-spacing: 0.5px;
font-weight: 600;
}
.member-card .member-name {
font-size: 24px;
color: #1a1a1a;
font-weight: 600;
margin-bottom: 8px;
}
.member-card .member-detail {
font-size: 15px;
color: #555;
margin: 6px 0;
}
.member-card .member-detail strong {
color: #558b2f;
}
.info-box {
background: #e8f5e9;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.info-box p {
margin: 0 0 8px 0;
color: #2e7d32;
font-size: 16px;
line-height: 1.6;
}
.info-box p:last-child {
margin-bottom: 0;
}
.tips-section {
background: #f8f9fa;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.tips-section h3 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.tip-item {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
padding: 6px 0;
}
.tip-icon {
font-size: 20px;
margin-right: 10px;
min-width: 24px;
flex-shrink: 0;
}
.tip-text {
font-size: 16px;
color: #555;
line-height: 1.5;
}
.cta-section {
text-align: center;
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
.cta-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16px;
}
.cta-button {
display: inline-block;
padding: 16px 48px;
font-size: 18px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(124, 179, 66, 0.3);
transition: all 0.3s ease;
}
.thank-you-box {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
}
.thank-you-box p {
font-size: 17px;
color: #555;
line-height: 1.7;
margin: 8px 0;
}
.thank-you-box strong {
color: #558b2f;
}
.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;
}
.success-icon {
font-size: 48px;
}
.email-body {
padding: 20px 16px;
}
.cta-button {
padding: 14px 32px;
font-size: 16px;
width: 100%;
max-width: 300px;
}
.member-card .member-name {
font-size: 20px;
}
.tip-item {
font-size: 15px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt=nomeapp+' - Rete Italiana Scambio orizzontale')
h1 🎉 Il tuo invito è stato accettato!
p.subtitle Un nuovo membro si è unito a #{nomeapp}
//- Body
.email-body
//- Intro
.intro-text
| Ciao <strong>#{nomeInvitante}</strong>,<br>
| la persona che hai invitato, o che ha usato il tuo username come invitante, si è appena registrata su #{nomeapp}!
//- Card nuovo membro
.member-card
h3 👤 Nuovo Membro Registrato
.member-name #{nomeInvitato}
if emailInvitato
.member-detail
strong Email:
a(href=`mailto:${emailInvitato}` style="color: #667eea; text-decoration: none;") #{emailInvitato}
if usernameInvitato
.member-detail
strong Username:
| #{usernameInvitato}
//- Ringraziamento
.thank-you-box
p
| 🙏 <strong>Grazie per aver contribuito alla crescita di #{nomeapp}!</strong>
p
| Ogni nuovo membro rende la nostra comunità più forte e ricca di opportunità.
| Il tuo invito ha aiutato #{nomeInvitato} a scoprire un nuovo modo di fare economia,
| basato su fiducia, comunità e scambi solidali.
//- Info box
.info-box
p
| ✓ #{nomeInvitato} ha ricevuto un'email di benvenuto con tutte le istruzioni
//- CTA
.cta-section
.cta-title Visita la Piattaforma
a.cta-button(href=strlinksito target="_blank") Vai su #{nomeapp}
//- Highlight box
.highlight-box
p
| 🌱 <strong>Costruiamo insieme un'economia più solidale!</strong><br>
| Continua a condividere #{nomeapp} con persone di fiducia della tua comunità.
| Più siamo, più scambi possibili ci sono per tutti!
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché hai invitato #{nomeInvitato} su #{nomeapp} oppure la persona ha usato il tuo username come invitante
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp}
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

View File

@@ -0,0 +1 @@
=`🎉 Il tuo invito è stato accettato su ${nomeapp} da ${name ? name : username} !`

View File

@@ -0,0 +1,404 @@
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: 80px;
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, #1976D2 0%, #1565C0 100%);
color: white;
padding: 40px 24px;
text-align: center;
}
.email-header h1 {
margin: 0 0 8px 0;
font-size: 26px;
font-weight: 600;
}
.email-header p {
margin: 8px 0 0 0;
font-size: 16px;
opacity: 0.95;
line-height: 1.5;
}
.verification-icon {
font-size: 56px;
margin-bottom: 16px;
}
.email-body {
padding: 24px 20px;
}
.intro-text {
font-size: 16px;
color: #333;
margin-bottom: 20px;
text-align: center;
line-height: 1.7;
padding: 0 10px;
}
.intro-text strong {
color: #1976D2;
}
.info-message {
background: linear-gradient(135deg, #E3F2FD 0%, #BBDEFB 100%);
border-left: 4px solid #1976D2;
border-radius: 8px;
padding: 20px;
margin-bottom: 24px;
text-align: center;
}
.info-message h2 {
color: #1565C0;
font-size: 18px;
margin-bottom: 12px;
font-weight: 600;
}
.info-message p {
color: #1976D2;
font-size: 15px;
line-height: 1.6;
margin: 8px 0;
}
.warning-box {
background: #FFF8E1;
border-left: 4px solid #FFA000;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
}
.warning-box p {
color: #E65100;
font-size: 14px;
margin: 0;
line-height: 1.6;
}
.warning-box strong {
color: #BF360C;
}
.email-info-box {
background: #f8f9fa;
border-left: 4px solid #1976D2;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
text-align: center;
}
.email-info-title {
font-size: 14px;
font-weight: 600;
color: #555;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.email-address {
font-size: 18px;
font-weight: 600;
color: #1976D2;
word-break: break-word;
}
.cta-section {
margin: 24px 0;
padding: 24px 0;
text-align: center;
}
.cta-title {
font-size: 19px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 8px;
}
.cta-subtitle {
font-size: 14px;
color: #666;
margin-bottom: 20px;
line-height: 1.5;
}
.cta-button {
display: inline-block;
padding: 18px 40px;
font-size: 16px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #1976D2 0%, #1565C0 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(25, 118, 210, 0.35);
transition: transform 0.2s, box-shadow 0.2s;
}
.cta-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(25, 118, 210, 0.45);
}
.button-icon {
font-size: 20px;
margin-right: 8px;
vertical-align: middle;
}
.link-fallback {
margin-top: 20px;
padding: 16px;
background: #f5f5f5;
border-radius: 8px;
text-align: center;
}
.link-fallback p {
font-size: 13px;
color: #666;
margin-bottom: 8px;
}
.link-fallback a {
font-size: 12px;
color: #1976D2;
word-break: break-all;
}
.expiry-notice {
background: linear-gradient(135deg, #FFEBEE 0%, #FFCDD2 100%);
border-radius: 8px;
padding: 16px;
margin: 24px 0;
text-align: center;
border: 1px solid #EF9A9A;
}
.expiry-notice p {
margin: 0;
color: #C62828;
font-size: 14px;
line-height: 1.6;
}
.expiry-notice strong {
color: #B71C1C;
}
.help-section {
background: #FAFAFA;
border-radius: 8px;
padding: 20px;
margin: 24px 0;
text-align: center;
}
.help-section h3 {
font-size: 16px;
color: #333;
margin-bottom: 12px;
font-weight: 600;
}
.help-section p {
font-size: 14px;
color: #666;
margin: 8px 0;
line-height: 1.6;
}
.help-section a {
color: #1976D2;
text-decoration: none;
}
.help-section a:hover {
text-decoration: underline;
}
.security-note {
background: #E8F5E9;
border-left: 4px solid #4CAF50;
border-radius: 8px;
padding: 14px;
margin: 20px 0;
}
.security-note p {
font-size: 13px;
color: #2E7D32;
margin: 0;
line-height: 1.5;
}
.email-footer {
padding: 20px 16px;
text-align: center;
background: #f8f9fa;
color: #777;
font-size: 13px;
}
.email-footer p {
margin: 6px 0;
}
.divider {
height: 1px;
background: linear-gradient(to right, transparent, #e0e0e0, transparent);
margin: 24px 0;
}
@media only screen and (max-width: 600px) {
body {
padding: 8px;
}
.email-header {
padding: 24px 16px;
}
.email-header h1 {
font-size: 22px;
}
.email-header p {
font-size: 15px;
}
.email-body {
padding: 20px 14px;
}
.info-message {
padding: 16px;
}
.email-address {
font-size: 16px;
}
.cta-button {
padding: 16px 32px;
font-size: 15px;
display: block;
width: 100%;
}
.link-fallback a {
font-size: 11px;
}
}
body
.email-container
.email-header
- var baseimg = baseurl + '/';
h1 ✉️ Verifica il tuo indirizzo email
p Conferma la tua email per continuare a usare #{nomeapp}
.email-body
.intro-text
| Ciao
strong #{name || username}
| ! 👋
br
| Abbiamo ricevuto una richiesta per verificare nuovamente il tuo indirizzo email.
.info-message
h2 📧 Perché devo verificare di nuovo?
p Potrebbe essere perché hai cambiato email, per motivi di sicurezza, o perché la verifica precedente è scaduta.
p Questa procedura ci aiuta a mantenere sicuro il tuo account.
if emailto
.email-info-box
.email-info-title Email da verificare
.email-address #{emailto}
.cta-section
.cta-title Conferma il tuo indirizzo email
.cta-subtitle Clicca il bottone qui sotto per completare la verifica
if verifyLink
a.cta-button(href=verifyLink target="_blank")
span.button-icon ✓
| Verifica Email
.link-fallback
p Se il bottone non funziona, copia e incolla questo link nel browser:
a(href=verifyLink) #{verifyLink}
.expiry-notice
p ⏰ Questo link scadrà tra
strong 24 ore
| .
p Se non completi la verifica in tempo, dovrai richiedere un nuovo link.
.warning-box
p ⚠️
strong Non hai richiesto questa verifica?
| Ignora questa email. Il tuo account resterà al sicuro.
.security-note
p 🔒 Per la tua sicurezza: non condividere mai questo link con nessuno. Il team di #{nomeapp} non ti chiederà mai la password via email.
.help-section
h3 Hai bisogno di aiuto?
p Non riesci a verificare la tua email?
if supportEmail
p Contattaci a
a(href="mailto:" + supportEmail) #{supportEmail}
if strlinksito
p Oppure visita la nostra
a(href=strlinksito + '/supporto' target="_blank") pagina di supporto
.email-footer
.divider
p Hai ricevuto questa email perché è stata richiesta una verifica per il tuo account su #{nomeapp}
p(style="margin-top: 8px; font-size: 12px; color: #999;")
| Se non hai fatto tu questa richiesta, puoi ignorare questa email.
p(style="margin-top: 12px; font-size: 12px;")
| © #{new Date().getFullYear()} #{nomeapp}

View File

@@ -0,0 +1 @@
Verifica la tua Email - ${nomeapp}`

View File

@@ -55,8 +55,7 @@ html
tr
td(class="whitespace", height="10")
p &nbsp;
td
- var totalPrice = orders.totalPrice
- var note = orders.note
@@ -64,7 +63,8 @@ html
each rec in orders.items
- var descr = rec.order.product.productInfo.name
- var img = rec.order.product.productInfo.img
- var code = rec.order.product.productInfo.code
- var img = dirimg + rec.order.product.productInfo.imagefile
- var price = rec.order.price
- var after_price = rec.order.after_price
- var TotalPriceProduct = rec.order.TotalPriceProductstr
@@ -104,6 +104,9 @@ html
tr
td(class="sectionContentTitle boldhigh", valign="top")
p #{descr}
tr
td(class="sectionContent", valign="top")
p Codice: #{code}
tr
td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price}
@@ -118,7 +121,7 @@ html
p Totale: #{TotalPriceProduct} €
if (note)
p Note Aggiuntive: #{note}
p Note Aggiuntive: #{note}<br>
p.sectionContentTitle.boldhigh.sectionTotal Totale Ordine: #{totalPrice} €
tr

View File

@@ -19,7 +19,6 @@ html
}
body(yahoofix, style="background: #ffffff")
- var baseimg = baseurl + '/statics/'
span(id='body_style', style='display:block')
table(cellpadding="10", cellspacing="0", width="600", align="center")
tr

View File

@@ -52,7 +52,7 @@ html
if (miordconfirmed)
p!= miordconfirmed
else
p Puoi pertanto venire a ritirarli direttamente in sede, negli orari che ti sono stati indicati.
p Puoi venire a ritirarli direttamente in sede, negli orari che ti sono stati indicati.
p &nbsp;
@@ -62,7 +62,8 @@ html
each rec in orders.items
- var descr = rec.order.product.productInfo.name
- var img = rec.order.product.productInfo.img
- var code = rec.order.product.productInfo.code
- var img = dirimg + rec.order.product.productInfo.imagefile
- var price = rec.order.product.price
- var after_price = rec.order.product.after_price
if (rec.order.gasordine)
@@ -101,6 +102,9 @@ html
tr
td(class="sectionContentTitle boldhigh", valign="top")
p #{descr}
tr
td(class="sectionContent", valign="top")
p Codice: #{code}
tr
td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price}
@@ -117,7 +121,7 @@ html
p Totale: #{TotalPriceProduct} €
if (note)
p Note Aggiuntive: #{note}
p Note Aggiuntive: #{note}<br>
p.sectionContentTitle.boldhigh.sectionTotal Totale Ordine: #{totalPrice} €
tr

View File

@@ -45,7 +45,7 @@ html
p Ciao #{mioname},
p L'ordine n. #{ordernumber} è stato Consegnato correttamente 📦 !
p Grazie per averci scelto 🙏🏻 e alla prossima !
p &nbsp;
p &nbsp;
if (orders.items[0].order.quantitypreordered > 0)
- var miomakeorder = mystorehouse.email_html_GAS_order_consegnato
@@ -61,7 +61,7 @@ html
each rec in orders.items
- var descr = rec.order.product.productInfo.name
- var img = rec.order.product.productInfo.img
- var img = dirimg + rec.order.product.productInfo.imagefile
- var price = rec.order.product.price
- var after_price = rec.order.product.after_price
if (rec.order.gasordine)
@@ -116,7 +116,7 @@ html
p Totale: #{TotalPriceProduct} €
if (note)
p Note Aggiuntive: #{note}
p Note Aggiuntive: #{note}<br>
p.sectionContentTitle.boldhigh.sectionTotal Totale Ordine: #{totalPrice} €
tr

View File

@@ -0,0 +1,422 @@
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;
}
.welcome-icon {
font-size: 48px;
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;
}
.highlight-box {
background: #fff8dc;
border-left: 4px solid #7cb342;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.highlight-box p {
margin: 0;
font-size: 17px;
color: #1a1a1a;
line-height: 1.6;
}
.riso-info {
background: #fef9f3;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
border: 1px solid #7cb342;
}
.riso-info h3 {
font-size: 16px;
color: #558b2f;
margin-bottom: 10px;
text-align: center;
}
.riso-info p {
font-size: 16px;
color: #555;
line-height: 1.6;
margin-bottom: 8px;
}
.benefits-list {
background: #f8f9fa;
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.benefits-list h3 {
font-size: 17px;
color: #1a1a1a;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.benefit-item {
display: flex;
align-items: flex-start;
margin-bottom: 8px;
padding: 6px 0;
}
.benefit-icon {
font-size: 20px;
margin-right: 10px;
min-width: 24px;
flex-shrink: 0;
}
.benefit-text {
font-size: 16px;
color: #555;
line-height: 1.5;
}
.values-section {
background: linear-gradient(135deg, #fff8dc 0%, #fef9f3 100%);
border-radius: 8px;
padding: 16px;
margin: 20px 0;
}
.values-section h3 {
font-size: 16px;
color: #558b2f;
margin-bottom: 12px;
text-align: center;
font-weight: 600;
}
.value-item {
display: flex;
align-items: center;
margin-bottom: 8px;
font-size: 16px;
color: #555;
}
.value-item strong {
color: #558b2f;
margin-right: 6px;
}
.cta-section {
text-align: center;
margin: 24px 0;
padding: 20px 0;
border-top: 1px solid #e0e0e0;
border-bottom: 1px solid #e0e0e0;
}
.cta-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16px;
}
.cta-button {
display: inline-block;
padding: 16px 48px;
font-size: 18px;
font-weight: 600;
color: white;
background: linear-gradient(135deg, #7cb342 0%, #558b2f 100%);
border-radius: 50px;
text-decoration: none;
box-shadow: 0 4px 12px rgba(210, 105, 30, 0.3);
transition: all 0.3s ease;
}
.info-box {
background: #e8f5e9;
border-radius: 8px;
padding: 14px;
margin-top: 20px;
text-align: center;
}
.info-box p {
margin: 0;
color: #2e7d32;
font-size: 16px;
line-height: 1.6;
}
.telegram-box {
background: #e3f2fd;
border-radius: 8px;
padding: 14px;
margin: 16px 0;
text-align: center;
border: 1px solid #64b5f6;
}
.telegram-box p {
margin: 0;
color: #1976d2;
font-size: 16px;
line-height: 1.6;
}
.telegram-box strong {
color: #0d47a1;
}
.link-box {
background: #fff3e0;
border-radius: 8px;
padding: 12px;
margin: 16px 0;
text-align: center;
}
.link-box a {
color: #558b2f;
text-decoration: none;
font-weight: 600;
font-size: 16px;
}
.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;
}
.email-body {
padding: 20px 16px;
}
.cta-button {
padding: 14px 32px;
font-size: 16px;
width: 100%;
max-width: 300px;
}
.benefit-item, .value-item {
font-size: 15px;
}
}
body
.email-container
//- Header
.email-header
img.header-logo(src=baseurl+'/images/logo.png' alt='RISO - Rete Italiana Scambio orizzontale')
h1 Sei stato invitato ad unirti a #{nomeapp}!
p.subtitle Rete Italiana Scambio orizzontale
//- Body
.email-body
//- Intro
.intro-text
if usernameInvitante
| <strong>#{usernameInvitante}</strong> ti ha invitato a far parte della comunità RISO, una rete di persone che credono in un'economia basata su fiducia, comunità e scambi solidali.
else
| Hai ricevuto un invito speciale per unirti alla comunità RISO, una rete di persone che credono in un'economia basata su fiducia, comunità e scambi solidali.
.cta-section
.cta-title Unisciti alla Comunità RISO 🍚💚☀️
a.cta-button(href=linkRegistrazione target="_blank") Registrati Ora
//- Messaggio personalizzato
if messaggioPersonalizzato
.highlight-box
p
| 💌 <strong>Messaggio da #{usernameInvitante}:</strong><br>
| "#{messaggioPersonalizzato}"
//- Cos'è RISO
.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 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.
//- Benefici
.benefits-list
h3 ✨ Cosa puoi fare con RISO
.benefit-item
span.benefit-icon 🔄
span.benefit-text Scambiare beni, servizi e ospitalità con baratto, dono, RIS o Euro
.benefit-item
span.benefit-icon 🤝
span.benefit-text Connetterti con la tua comunità territoriale locale (circuito provinciale)
.benefit-item
span.benefit-icon 💰
span.benefit-text Usare i RIS, uno strumento di scambio che parte da zero (nessun debito iniziale!)
.benefit-item
span.benefit-icon 🌱
span.benefit-text Ridurre la dipendenza dall'economia tradizionale e vivere in modo più sostenibile
.benefit-item
span.benefit-icon 📱
span.benefit-text Creare annunci di ciò che offri o cerchi direttamente dall'app
.benefit-item
span.benefit-icon 🎯
span.benefit-text Partecipare a mercatini ed eventi locali organizzati dalla tua comunità
//- Valori
.values-section
h3 ⭐ I Valori della Comunità RISO
.value-item
span.benefit-icon 🤝
| <strong>Comunità:</strong> Creiamo legami autentici tra persone
.value-item
span.benefit-icon ✅
| <strong>Fiducia:</strong> Base del nostro sistema di scambio
.value-item
span.benefit-icon 🚫
| <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
.value-item
span.benefit-icon 👁️
| <strong>Trasparenza:</strong> Tutte le transazioni in RIS sono visibili alla comunità
//- Info RIS
.riso-info
h3 💡 Come funzionano i RIS?
p
| • Non esiste una banca centrale che li crea<br>
| • Ogni utente parte da <strong>0 RIS</strong><br>
| • Quando ricevi vai in positivo (+), quando spendi vai in negativo (-)<br>
| • I facilitatori locali ti abilitano all'uso in base a conoscenza e fiducia<br>
| • I circuiti provinciali hanno bilancio sempre a zero (sostenibilità garantita!)
//- CTA
.cta-section
.cta-title Unisciti alla Comunità RISO 🍚💚☀️
a.cta-button(href=linkRegistrazione target="_blank") Registrati Ora
//- Info pratica
.info-box
p
| ✓ <strong>Piattaforma Libera e Gratuita</strong><br>
| ✓ <strong>Registrazione ad invito</strong> · Necessario username Telegram<br>
| ✓ <strong>App web installabile</strong> · Non serve store, installa da browser
//- Telegram
.telegram-box
p
| 📲 <strong>Unisciti al gruppo Telegram della tua provincia!</strong><br>
| Cerca "<strong>Progetto RISO</strong>" su Telegram e trova il gruppo nel messaggio fissato.<br>
| Qui organizziamo incontri reali e mercatini. 🍚
//- Link utile
.link-box
p 📚 Vuoi saperne di più sul sistema RIS?
a(href="https://sicrenacc.info/" target="_blank") Leggi il libro Si.cre.na.C.C →
//- Footer
.email-footer
.divider
p Hai ricevuto questa email perché #{usernameInvitante || 'un membro della comunità'} ti ha invitato su #{nomeapp}
p(style="margin-top: 12px; font-size: 12px;")
| #{new Date().getFullYear()} #{nomeapp} - Rete Italiana Scambio orizzontale
p(style="margin-top: 8px; font-size: 11px; color: #999;")
| Se non sei interessato, puoi semplicemente ignorare questa email.
p(style="margin-top: 12px; font-size: 12px;")
| 🍚 Comunità · Fiducia · Scambi Solidali · Sostenibilità

Some files were not shown because too many files have changed in this diff Show More