isprambiente/medplan

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Inline docs](http://inch-ci.org/github/remote-exec/command-designer.png)](http://inch-ci.org/github/isprambiente/medplan)
[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/isprambiente/medplan/master)
[![Maintainability](https://api.codeclimate.com/v1/badges/606f40e65760b34fbf84/maintainability)](https://codeclimate.com/github/isprambiente/medplan/maintainability)

# Gestione segreteria medica(Med.Plan.)

Il programma, interamente sviluppato all'interno del settore Sviluppo di AGP-INF, nasce da una specifica necessità di [I.S.P.R.A.](http://www.isprambiente.gov.it) nel gestire la sorveglianza sanitaria e la medicina sul lavoro del personale.

Il programma è stato appositamente sviluppato su piattaforma web per consentire l'accesso alle risorse interne tramite l'utilizzo di un comune browser web.

All'interno dell'applicazione è possibile gestire le attività di segreteria dedica programmando, per ciascun dipendente, le analisi cliniche e le visite presso il medico competente. E' possibile gestire i rischi lavorativi connessi alle attività lavorative dell'Istituto raggruppandoli in categorie di rischio collegandoli a ciascun dipendente. Per ogni categoria di rischio è possibile indicare il numero di mesi di sorveglianza sanitaria. Allo scadere dei mesi indicati, il sistema visualizza l'elenco dei dipendenti "scaduti". E' possibile scegliere tra:

* Dipendenti nuovi: elenco di personale che a cui non è associta nessuna categori di rischio;
* Dipendenti scaduti: elenco di personale che è scaduto prima del mese corrente;
* Dipendenti in scadenza nel mese corrente: elenco di personale che ha almeno una categoria di rischio in scadenza nel mese corrente;
*  Dipendenti in scadenza nel primo mese successivo: elenco di personale che ha almeno una categoria di rischio in scadenza nel mese successivo al mese corrente;
*  Dipendenti in scadenza nel secondo mese successivo: elenco di personale che ha almeno una categoria di rischio in scadenza nel secondo mese successivo al mese corrente;
*  Dipendenti cancellati: elenco di personale che è stato cancellato manualmente dal sistema;
*  Dipendenti bloccati e/o cessati: elenco di personale che è stato bloccato automaticamente dal sistema in caso, ad esempio, di scadenza contratto;

Nello specifico il sistema, rilasciato in riuso, permette:

* Una autenticazione SingleSignOn su sistema CAS Server;
* Acquisizione automatica dei dipendenti da repository REST-API Json;
* Creazione e gestione manuale dei dipendenti;
* Gestione dei rischi sul lavoro;
* Raggruppamento in categorie dei rischi sul lavoro;
* Profilazione dei dipendenti in base alle categorie di rischio collegate;
* Calendarizzazione delle analisi e delle visite;
* Comunicazioni tramite e-mail con i dipendenti;
* Gestione dello storico delle idoneità per ciascun dipendente;
* Gestione delle scadenze delle idoneità per ciascuna categoria di rischio;
* Generazione di reportistica riservata al medico competente;
* Manuali d'utilizzo per i tre profili utente: dipendente generico, segreteria e medico competente.

## Licenza
Il codice sorgente del sito progetto è rilasciato sotto licenza MIT License (codice SPDX: MIT). La licenza è visibile nel file [LICENSE](https://opensource.org/licenses/MIT)

## Repository
Questo repository contiene il codice sorgente del programma per la gestione della sorveglianza sanitaria e della medicina sul lavoro del personale.

Il sito è sviluppato in linguaggio Ruby 3.2, framework Rails 7.1 e webpacker StimulusJS 2.

### Specifiche tecniche progetto
* [Ruby 3.3.x](https://www.ruby-lang.org)
* [RVM](https://rvm.io/)
* [Ruby on Rails 7.2](https://rubyonrails.org/)
* [NodeJS](https://nodejs.org/)
* [Yarn](https://yarnpkg.com/)
* [Hotwire](https://hotwired.dev/)
* [Postgresql](https://www.postgresql.org/)
* HTML5 + CSS3
* no jQuery
* [Server CAS](https://rubycas.github.io/) - autenticazione SingleSignOn
* [Openssl](https://www.openssl.org/) - 

\* In alternativa al server CAS e` necessario sviluppare altri sistemi di autenticazione come ldap

### Requisiti tecnici per ambiente server
* Sistema operativo: Linux
* Gestore pacchetto ruby: RVM
* Linguaggio di programmazione: Ruby 3.2
* Framework: Rails 7
* Database: PostgreSQL >= 13.2
* NodeJS: JavaScript runtime >= v13.10
* Package Manager: Yarn >= 1.22
* Deploy applicazione: Accesso ssh per deploy applicazione via Capistrano
* Webserver: Nginx + Puma
* Autenticazione utenti: CAS Server

### Requisiti minimi per i client
* Mozilla Firefox 80, Chrome 80, Microsoft Edge, Safari o altro browser compatibile con HTML 5, CSS 3;
* Internet Explorer 11 non è supportato;
* Javascript abilitato;
* Cookie abilitati;
* Supporto ai certificati SSL;
* Risoluzione schermo 1024x768.

### Configurazione consigliata per i client
* Mozilla Firefox 80, Chrome 80, Microsoft Edge, Safari o altro browser compatibile con HTML 5, CSS 3;
* Javascript abilitato;
* Cookie abilitati;
* Supporto ai certificati SSL;
* Risoluzione schermo >= 1280x1024.

## Installazione ambiente
Installare l'ambiente di sviluppo e di produzione come indicato [qui](https://gorails.com/setup).

## Installazione applicazione

### In sviluppo

1. Clonare il progetto in sviluppo 

    ```
      git clone https://github.com/isprambiente/medplan.git
    ```

2. Da una shell posizionarsi sulla root del progetto ed eseguire

    ```
      gem install bundle
      bundle install
      yarn install
    ```

3. Generare la propria master.key
    ```
      rails secret 
    ```
4. Editare il file delle credenziali
    ``` 
      rails credentials:edit
    ```
5. Inserire il testo indicato di seguito aggiornandolo con i propri parametri:

    ```
      secret_key_base:

      cas:
        base_url: 'https://server.domain.com/cas/'

      development:
        database: nomeistanza_development
        username: username
        password: password
        host: hostname
      test:
        database: nomeistanza_test
        username: username
        password: password
        host: hostname

      production:
        database: nomeistanza_production
        username: username
        password: password
        host: hostname

      \# Indicare le credenziali per collegarsi al servizio REST-API in formato JSON da cui scaricare le informazioni degli utenti.
      api:
        url: 'https://api.domain.com/medplan.json'
        user: 'username'
        secret_access_key: 'password'

      \# Indicare una password se si vuole bloccre la modifica dei file excel
      excel:
        password: nil

      \# Modificare le impostazioni per l'invio delle email con le proprie
      mail:
        address: 'smtp.domain.com'
        port: 465
        domain: 'domain.com'
        ssl: true
        user_name: '<username>'
        password: '<password>'
        sender: 'sender@domain.com'
    ```
6. Modificare il file `config/deploy`

    ```
    lock '3.11.2' # indicare la versione corretta del capistrano
    set :deploy_to, "/home/medplan" # indicare il path in cui installare l'applicazione in produzione
    set :tmp_dir, '/home/medplan/shared/tmp' # indicare il path della tempdir dell'applicazione in produzione
    ```

7. Modificare il file `config/deploy/production.rb`

    ```
    role :app, %w{medplan@medplan.domain.com}
    role :web, %w{medplan@medplan.domain.com}
    role :db,  %w{medplan@medplan.domain.com}

    server 'medplan.domain.com', user: 'medplan', roles: %w{app db web}, my_property: :my_value
    set :branch, 'master'
    set :rails_env, 'production'
    set :ssh_options, {:forward_agent => true}
    ```
8. Creare il file `config/settings.local.yml` partendo da `config/settings.yml` per sovrascrivere i parametri di default. Il file è incluso nel `.gitignore` pertanto sarà necessario ricopiarlo manualmente sul server nel path `shared/config/settings.local.yml`
9. Copiare i seguenti file sul server in produzione nella cartella `shared/config/`
    * settings.local.yml
    * database.yml
    * master.key
    * secrets.yml
10. Per il deploy in produzione utilizzare Capistrano
    ```
    cap production deploy
    ```
    Verificare e risolvere eventuali errori che si potrebbero verificare durante il deploy.
### In produzione
1. Posizionarsi nella root dell'applicazione ed eseguire:
    ```
    gem install bundle
    gem install bundler
    gem install puma
    puma -C /path/to/config
    ```
2. Per nginx, creare un file nella cartella `/etc/nginx/config/medplan.conf` e incollare quanto segue modificando, prima di salvare, con i propri parametri:
    ```
    upstream medplan {
      server unix:///<root_path>/shared/tmp/sockets/puma.sock;
    }

    server {
      server_name medplan.domain.com;
      listen 443 ssl;
      listen [::]:443 ssl;
      ssl_certificate      /etc/nginx/cert/medplanarm.crt;
      ssl_certificate_key  /etc/nginx/cert/medplan.key;
      ssl_protocols TLSv1.2 TLSv1.3;
      ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

      access_log /var/log/nginx/medplan.access.log;
      error_log /var/log/nginx/medplan.error.log;

      root /<root_path>/current/public;

      client_max_body_size 20M;

      location / {
        proxy_pass http://medplan; # match the name of upstream directive which is defined above
        proxy_redirect off;

        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
      }

      location ~ ^/(system|assets)/ {
        root /<root_path>/current/public;
        gzip_static on; # to serve pre-gzipped version
        expires max;
        add_header Cache-Control public;
      }

      location /docs/ {
        root /<root_path>/current/doc/site;
        rewrite ^/docs/(.*)$ /$1 break;
        gzip_static on; # to serve pre-gzipped version
        expires max;
        add_header Cache-Control public;
        index  index.html;
      }
    }
    ```
3. Riavviare Nginx

Verificare e risolvere eventuali errori al riavvio di nginx.

### Demo con docker / docker compose
1. Clonare il progetto in sviluppo 

    ```
      git clone https://github.com/isprambiente/medplan.git
    ```

2. Configurare il DNS o modificare il proprio file hosts per risolvere il nome cas-mock-server sull'indirizzo del server docker.

   Nel seguente esempio il docker viene eseguito localmente e viene modificato il file `/etc/hosts` del computer locale.

   ```
    127.0.0.1       localhost cas-mock-server
   ```
   la modifica è necessaria per raggiungere con un nome condiviso il server CAS

3. Eseguire la build del docker tramite compose

   ```
   sudo docker-compose up --build -d
   ```

4. Per accedere utilizzare le seguenti credenziali:
  * mario.rossi     - password   # per utente standard
  * editor          - password   # per utente editor
  * dottore         - password   # per utente dottore
  * admin           - password   # per utente admin

### Partecipa!
Puoi collaborare allo sviluppo dell'applicazione e della documentazione tramite [github](https://github.com/isprambiente/medplan).

Tramite [Github discussions](https://github.com/isprambiente/medplan/discussions) è possibile richiedere e offrire aiuto.

Se riscontrate errori e bug potete segnalarli nella paggina delle [Issues](https://github.com/isprambiente/medplan/issues)