From a7df004348d91b63d341bfe02aafb4d021acd5dc Mon Sep 17 00:00:00 2001 From: marco370 <48531002-marco370@users.noreply.replit.com> Date: Thu, 16 Oct 2025 10:54:16 +0000 Subject: [PATCH] Update deployment scripts and server setup for automatic deployment and database backup Update deploy scripts to include database backup and restore functionality, configure Nginx for vt.alfacom.it, and modify server setup to use the provided database password. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 42d8028a-fa71-4ec2-938c-e43eedf7df01 Replit-Commit-Checkpoint-Type: intermediate_checkpoint --- .env.production.example | 25 +- .replit | 2 +- deploy/deploy.sh | 57 ++- deploy/nginx.conf | 8 +- deploy/setup-server.sh | 91 ++-- dump.sql | 1007 +++++++++++++++++++++++++++++++++++++++ dump.zip | Bin 0 -> 16956 bytes push-to-gitlab.sh | 23 +- 8 files changed, 1141 insertions(+), 72 deletions(-) create mode 100644 dump.sql create mode 100644 dump.zip mode change 100755 => 100644 push-to-gitlab.sh diff --git a/.env.production.example b/.env.production.example index 804d73b..893e87c 100644 --- a/.env.production.example +++ b/.env.production.example @@ -13,20 +13,21 @@ PGPASSWORD=YOUR_SECURE_PASSWORD # Genera con: openssl rand -base64 32 SESSION_SECRET=YOUR_RANDOM_SESSION_SECRET_HERE -# =================== REPLIT AUTH (Produzione) =================== -# Configurazione OIDC per autenticazione -ISSUER_URL=https://replit.com/oidc -REPL_ID=your-repl-id-here -REPLIT_DOMAINS=tuodominio.it,www.tuodominio.it +# =================== AUTHENTICATION =================== +# Configurazione OIDC (senza Replit) +ISSUER_URL=https://auth.vt.alfacom.it/oidc +CLIENT_ID=vigilanza-turni +CLIENT_SECRET=YOUR_OIDC_CLIENT_SECRET -# =================== NODE ENVIRONMENT =================== +# =================== APPLICATION =================== NODE_ENV=production PORT=5000 +APP_URL=https://vt.alfacom.it -# =================== LOGGING (opzionale) =================== +# =================== BACKUP =================== +BACKUP_ENABLED=true +BACKUP_DIR=/var/backups/vigilanza-turni +BACKUP_RETENTION_DAYS=30 + +# =================== LOGGING =================== LOG_LEVEL=info - -# =================== BACKUP (opzionale) =================== -# BACKUP_ENABLED=true -# BACKUP_SCHEDULE="0 2 * * *" # Daily at 2 AM -# BACKUP_RETENTION_DAYS=30 diff --git a/.replit b/.replit index 6051d75..048618b 100644 --- a/.replit +++ b/.replit @@ -4,7 +4,7 @@ hidden = [".config", ".git", "generated-icon.png", "node_modules", "dist"] [nix] channel = "stable-24_05" -packages = ["nano"] +packages = ["nano", "zip", "openssh"] [deployment] deploymentTarget = "autoscale" diff --git a/deploy/deploy.sh b/deploy/deploy.sh index fe70b64..81eeab6 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -2,19 +2,50 @@ set -e # Script di deployment automatico per VigilanzaTurni -# Eseguito da GitLab CI/CD Runner +# Uso: bash deploy/deploy.sh APP_DIR="/var/www/vigilanza-turni" APP_NAME="vigilanza-turni" +BACKUP_DIR="/var/backups/vigilanza-turni" echo "πŸš€ Deployment VigilanzaTurni - $(date)" # Vai alla directory applicazione cd $APP_DIR -# Pull ultime modifiche (giΓ  fatto da GitLab Runner) -echo "πŸ“¦ Repository aggiornato" +# Pull ultime modifiche (se eseguito manualmente) +if [ -d .git ]; then + echo "πŸ“₯ Pull ultime modifiche da GitLab..." + git pull origin main || true +fi +# =================== BACKUP DATABASE =================== +echo "πŸ’Ύ Backup database pre-deployment..." +mkdir -p $BACKUP_DIR +BACKUP_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).sql" + +# Load env vars +if [ -f .env ]; then + export $(cat .env | grep -v '^#' | xargs) +fi + +# Esegui backup PostgreSQL +if command -v pg_dump &> /dev/null; then + PGPASSWORD=$PGPASSWORD pg_dump -h $PGHOST -U $PGUSER -d $PGDATABASE > $BACKUP_FILE + echo "βœ… Backup salvato: $BACKUP_FILE" + + # Comprimi backup + gzip $BACKUP_FILE + echo "βœ… Backup compresso: ${BACKUP_FILE}.gz" + + # Pulisci backup vecchi (> 30 giorni) + find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +30 -delete + echo "🧹 Backup vecchi eliminati (retention: 30 giorni)" +else + echo "⚠️ pg_dump non trovato, skip backup" +fi + +# =================== BUILD & DEPLOY =================== # Installa TUTTE le dipendenze (serve per build e migrations) echo "πŸ“₯ Installazione dipendenze (include devDependencies)..." npm ci @@ -32,6 +63,7 @@ npm run db:push || true echo "🧹 Pulizia devDependencies (mantiene solo production)..." npm prune --production +# =================== RESTART APPLICATION =================== # Restart applicazione con PM2 echo "πŸ”„ Restart applicazione..." if pm2 show $APP_NAME > /dev/null 2>&1; then @@ -50,8 +82,27 @@ if pm2 show $APP_NAME | grep -q "online"; then else echo "❌ Errore: applicazione non online" pm2 logs $APP_NAME --lines 50 --nostream + + # Rollback: ripristina ultimo backup + echo "πŸ”„ Tentativo rollback backup..." + LATEST_BACKUP=$(ls -t $BACKUP_DIR/backup_*.sql.gz 2>/dev/null | head -1) + if [ -f "$LATEST_BACKUP" ]; then + echo "πŸ“¦ Ripristino da: $LATEST_BACKUP" + gunzip -c $LATEST_BACKUP | PGPASSWORD=$PGPASSWORD psql -h $PGHOST -U $PGUSER -d $PGDATABASE + echo "βœ… Database ripristinato" + fi + exit 1 fi +# =================== STATUS =================== +echo "" echo "πŸ“Š Status PM2:" pm2 status + +echo "" +echo "πŸ“ˆ Ultimi backup disponibili:" +ls -lht $BACKUP_DIR/*.gz 2>/dev/null | head -5 || echo "Nessun backup trovato" + +echo "" +echo "🌐 Applicazione disponibile su: https://vt.alfacom.it" diff --git a/deploy/nginx.conf b/deploy/nginx.conf index d382553..86e2522 100644 --- a/deploy/nginx.conf +++ b/deploy/nginx.conf @@ -10,7 +10,7 @@ upstream vigilanza_backend { server { listen 80; listen [::]:80; - server_name tuodominio.it www.tuodominio.it; + server_name vt.alfacom.it; # Let's Encrypt challenge location /.well-known/acme-challenge/ { @@ -26,11 +26,11 @@ server { server { listen 443 ssl http2; listen [::]:443 ssl http2; - server_name tuodominio.it www.tuodominio.it; + server_name vt.alfacom.it; # SSL Certificate (generato da certbot) - ssl_certificate /etc/letsencrypt/live/tuodominio.it/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/tuodominio.it/privkey.pem; + ssl_certificate /etc/letsencrypt/live/vt.alfacom.it/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/vt.alfacom.it/privkey.pem; # SSL Security ssl_protocols TLSv1.2 TLSv1.3; diff --git a/deploy/setup-server.sh b/deploy/setup-server.sh index f0bab48..b6bf1cc 100644 --- a/deploy/setup-server.sh +++ b/deploy/setup-server.sh @@ -1,55 +1,57 @@ #!/bin/bash +# Setup automatico server AlmaLinux 9 per VigilanzaTurni +# Esegui: sudo bash deploy/setup-server.sh + set -e -echo "================================================" -echo "Setup VigilanzaTurni su AlmaLinux 9" -echo "================================================" - -# Colori per output +# Colori output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' -NC='\033[0m' # No Color +NC='\033[0m' -# Funzione di log -log_info() { - echo -e "${GREEN}[INFO]${NC} $1" -} - -log_warn() { - echo -e "${YELLOW}[WARN]${NC} $1" -} - -log_error() { - echo -e "${RED}[ERROR]${NC} $1" -} +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Verifica root if [ "$EUID" -ne 0 ]; then - log_error "Esegui questo script come root: sudo bash setup-server.sh" + log_error "Esegui come root: sudo bash $0" exit 1 fi +log_info "πŸš€ Setup server AlmaLinux 9 per VigilanzaTurni" +log_info "Dominio: vt.alfacom.it" + +# =================== SYSTEM UPDATE =================== log_info "Aggiornamento sistema..." dnf update -y -# =================== NODE.JS 20 =================== -log_info "Installazione Node.js 20 LTS..." +# =================== NODE.JS =================== +log_info "Installazione Node.js 20..." dnf module reset nodejs -y dnf module enable nodejs:20 -y dnf install nodejs -y node --version npm --version -# =================== POSTGRESQL 15 =================== +# =================== PM2 =================== +log_info "Installazione PM2..." +npm install -g pm2 +pm2 startup systemd -u root --hp /root +systemctl enable pm2-root + +# =================== POSTGRESQL =================== log_info "Installazione PostgreSQL 15..." -dnf install -y postgresql15-server postgresql15-contrib +dnf install -y postgresql15-server postgresql15 + +# Inizializza database postgresql-setup --initdb systemctl enable postgresql systemctl start postgresql -# Generazione password sicura PostgreSQL -DB_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-25) +# Password database fornita dall'utente +DB_PASSWORD="553da84c94093919d46055d6ec37dfa2a03d0f46" # Creazione database e utente log_info "Configurazione database..." @@ -61,26 +63,22 @@ GRANT ALL PRIVILEGES ON DATABASE vigilanza_turni TO vigilanza_user; GRANT ALL ON SCHEMA public TO vigilanza_user; EOF -# Salva password in file sicuro -echo "PGPASSWORD=${DB_PASSWORD}" > /root/.vigilanza_db_password -chmod 600 /root/.vigilanza_db_password -log_info "Password PostgreSQL salvata in: /root/.vigilanza_db_password" +log_info "βœ… Database configurato con password fornita" # Configurazione PostgreSQL per connessioni locali log_info "Configurazione autenticazione PostgreSQL..." PG_HBA="/var/lib/pgsql/data/pg_hba.conf" -sed -i 's/ident$/md5/' $PG_HBA -systemctl restart postgresql - -# =================== PM2 (Process Manager) =================== -log_info "Installazione PM2..." -npm install -g pm2 -pm2 startup systemd -u root --hp /root +if ! grep -q "vigilanza_user" $PG_HBA; then + echo "local vigilanza_turni vigilanza_user md5" >> $PG_HBA + echo "host vigilanza_turni vigilanza_user 127.0.0.1/32 md5" >> $PG_HBA + systemctl restart postgresql +fi # =================== NGINX =================== log_info "Installazione Nginx..." dnf install -y nginx systemctl enable nginx +systemctl start nginx # =================== GIT =================== log_info "Installazione Git..." @@ -89,10 +87,14 @@ dnf install -y git # =================== DIRECTORY APPLICAZIONE =================== log_info "Creazione directory applicazione..." mkdir -p /var/www/vigilanza-turni -chown -R root:root /var/www/vigilanza-turni +mkdir -p /var/backups/vigilanza-turni +chmod 755 /var/www/vigilanza-turni +chmod 700 /var/backups/vigilanza-turni # =================== FIREWALL =================== -log_info "Configurazione Firewall..." +log_info "Configurazione firewall..." +systemctl enable firewalld +systemctl start firewalld firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload @@ -107,14 +109,11 @@ log_info "Setup completato con successo!" log_info "================================================" log_info "" log_warn "PROSSIMI PASSI:" -echo "1. Configura il DNS per puntare questo server" -echo "2. Copia DATABASE_URL qui sotto nel file /var/www/vigilanza-turni/.env" -echo "3. Ottieni certificato SSL: sudo certbot --nginx -d tuodominio.it" -echo "4. Esegui il primo deployment con GitLab CI/CD" -echo "" -log_warn "⚠️ IMPORTANTE - Salva questa password (disponibile in /root/.vigilanza_db_password):" +echo "1. Copia deploy/nginx.conf β†’ /etc/nginx/conf.d/vigilanza-turni.conf" +echo "2. Clone repository: cd /var/www/vigilanza-turni && git clone ." +echo "3. Crea file .env con DATABASE_URL (password giΓ  configurata)" +echo "4. Ottieni certificato SSL: sudo certbot --nginx -d vt.alfacom.it" +echo "5. Esegui primo deploy: bash deploy/deploy.sh" echo "" log_info "DATABASE_URL per .env:" echo "postgresql://vigilanza_user:${DB_PASSWORD}@localhost:5432/vigilanza_turni" -echo "" -log_warn "Password PostgreSQL generata automaticamente: ${DB_PASSWORD}" diff --git a/dump.sql b/dump.sql new file mode 100644 index 0000000..74a47a0 --- /dev/null +++ b/dump.sql @@ -0,0 +1,1007 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 16.9 (165f042) +-- Dumped by pg_dump version 16.9 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: absence_type; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.absence_type AS ENUM ( + 'sick_leave', + 'vacation', + 'personal_leave', + 'injury' +); + + +ALTER TYPE public.absence_type OWNER TO neondb_owner; + +-- +-- Name: certification_status; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.certification_status AS ENUM ( + 'valid', + 'expiring_soon', + 'expired' +); + + +ALTER TYPE public.certification_status OWNER TO neondb_owner; + +-- +-- Name: shift_preference; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.shift_preference AS ENUM ( + 'morning', + 'afternoon', + 'night', + 'any' +); + + +ALTER TYPE public.shift_preference OWNER TO neondb_owner; + +-- +-- Name: shift_status; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.shift_status AS ENUM ( + 'planned', + 'active', + 'completed', + 'cancelled' +); + + +ALTER TYPE public.shift_status OWNER TO neondb_owner; + +-- +-- Name: shift_type; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.shift_type AS ENUM ( + 'fixed_post', + 'patrol', + 'night_inspection', + 'quick_response' +); + + +ALTER TYPE public.shift_type OWNER TO neondb_owner; + +-- +-- Name: site_preference_type; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.site_preference_type AS ENUM ( + 'preferred', + 'blacklisted' +); + + +ALTER TYPE public.site_preference_type OWNER TO neondb_owner; + +-- +-- Name: training_status; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.training_status AS ENUM ( + 'scheduled', + 'completed', + 'expired', + 'cancelled' +); + + +ALTER TYPE public.training_status OWNER TO neondb_owner; + +-- +-- Name: user_role; Type: TYPE; Schema: public; Owner: neondb_owner +-- + +CREATE TYPE public.user_role AS ENUM ( + 'admin', + 'coordinator', + 'guard', + 'client' +); + + +ALTER TYPE public.user_role OWNER TO neondb_owner; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: absence_affected_shifts; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.absence_affected_shifts ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + absence_id character varying NOT NULL, + shift_id character varying NOT NULL, + is_substituted boolean DEFAULT false, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.absence_affected_shifts OWNER TO neondb_owner; + +-- +-- Name: absences; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.absences ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + guard_id character varying NOT NULL, + type public.absence_type NOT NULL, + start_date date NOT NULL, + end_date date NOT NULL, + certificate_url character varying, + notes text, + is_approved boolean DEFAULT false, + needs_substitute boolean DEFAULT true, + substitute_guard_id character varying, + created_at timestamp without time zone DEFAULT now(), + approved_at timestamp without time zone, + approved_by character varying +); + + +ALTER TABLE public.absences OWNER TO neondb_owner; + +-- +-- Name: certifications; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.certifications ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + guard_id character varying NOT NULL, + type character varying NOT NULL, + name character varying NOT NULL, + issue_date date NOT NULL, + expiry_date date NOT NULL, + status public.certification_status DEFAULT 'valid'::public.certification_status NOT NULL, + document_url character varying, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.certifications OWNER TO neondb_owner; + +-- +-- Name: contract_parameters; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.contract_parameters ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + contract_type character varying DEFAULT 'CCNL_VIGILANZA_2023'::character varying NOT NULL, + max_hours_per_day integer DEFAULT 8 NOT NULL, + max_overtime_per_day integer DEFAULT 2 NOT NULL, + max_hours_per_week integer DEFAULT 40 NOT NULL, + max_overtime_per_week integer DEFAULT 8 NOT NULL, + min_daily_rest_hours integer DEFAULT 11 NOT NULL, + min_weekly_rest_hours integer DEFAULT 24 NOT NULL, + max_night_hours_per_week integer DEFAULT 48, + holiday_pay_increase integer DEFAULT 30, + night_pay_increase integer DEFAULT 20, + overtime_pay_increase integer DEFAULT 15, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.contract_parameters OWNER TO neondb_owner; + +-- +-- Name: guard_constraints; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.guard_constraints ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + guard_id character varying NOT NULL, + preferred_shift_type public.shift_preference DEFAULT 'any'::public.shift_preference, + max_hours_per_day integer DEFAULT 10, + max_hours_per_week integer DEFAULT 48, + preferred_days_off integer[], + available_on_holidays boolean DEFAULT true, + notes text, + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.guard_constraints OWNER TO neondb_owner; + +-- +-- Name: guards; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.guards ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + user_id character varying, + badge_number character varying NOT NULL, + phone_number character varying, + is_armed boolean DEFAULT false, + has_fire_safety boolean DEFAULT false, + has_first_aid boolean DEFAULT false, + has_driver_license boolean DEFAULT false, + languages text[], + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.guards OWNER TO neondb_owner; + +-- +-- Name: holiday_assignments; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.holiday_assignments ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + holiday_id character varying NOT NULL, + guard_id character varying NOT NULL, + shift_id character varying, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.holiday_assignments OWNER TO neondb_owner; + +-- +-- Name: holidays; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.holidays ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + name character varying NOT NULL, + date date NOT NULL, + is_national boolean DEFAULT true, + worked_guard_ids text[], + created_at timestamp without time zone DEFAULT now(), + year integer NOT NULL +); + + +ALTER TABLE public.holidays OWNER TO neondb_owner; + +-- +-- Name: notifications; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.notifications ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + user_id character varying NOT NULL, + title character varying NOT NULL, + message text NOT NULL, + type character varying NOT NULL, + is_read boolean DEFAULT false, + related_entity_id character varying, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.notifications OWNER TO neondb_owner; + +-- +-- Name: sessions; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.sessions ( + sid character varying NOT NULL, + sess jsonb NOT NULL, + expire timestamp without time zone NOT NULL +); + + +ALTER TABLE public.sessions OWNER TO neondb_owner; + +-- +-- Name: shift_assignments; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.shift_assignments ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + shift_id character varying NOT NULL, + guard_id character varying NOT NULL, + assigned_at timestamp without time zone DEFAULT now(), + confirmed_at timestamp without time zone, + check_in_time timestamp without time zone, + check_out_time timestamp without time zone +); + + +ALTER TABLE public.shift_assignments OWNER TO neondb_owner; + +-- +-- Name: shifts; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.shifts ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + site_id character varying NOT NULL, + start_time timestamp without time zone NOT NULL, + end_time timestamp without time zone NOT NULL, + status public.shift_status DEFAULT 'planned'::public.shift_status NOT NULL, + notes text, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.shifts OWNER TO neondb_owner; + +-- +-- Name: site_preferences; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.site_preferences ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + site_id character varying NOT NULL, + guard_id character varying NOT NULL, + preference character varying NOT NULL, + priority integer DEFAULT 0, + reason text, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.site_preferences OWNER TO neondb_owner; + +-- +-- Name: sites; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.sites ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + name character varying NOT NULL, + address character varying NOT NULL, + client_id character varying, + shift_type public.shift_type NOT NULL, + min_guards integer DEFAULT 1 NOT NULL, + requires_armed boolean DEFAULT false, + requires_driver_license boolean DEFAULT false, + latitude character varying, + longitude character varying, + is_active boolean DEFAULT true, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.sites OWNER TO neondb_owner; + +-- +-- Name: training_courses; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.training_courses ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + guard_id character varying NOT NULL, + course_name character varying NOT NULL, + course_type character varying NOT NULL, + scheduled_date date, + completion_date date, + expiry_date date, + status public.training_status DEFAULT 'scheduled'::public.training_status NOT NULL, + certificate_url character varying, + provider character varying, + hours integer, + notes text, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.training_courses OWNER TO neondb_owner; + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: neondb_owner +-- + +CREATE TABLE public.users ( + id character varying DEFAULT gen_random_uuid() NOT NULL, + email character varying, + first_name character varying, + last_name character varying, + profile_image_url character varying, + role public.user_role DEFAULT 'guard'::public.user_role NOT NULL, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE public.users OWNER TO neondb_owner; + +-- +-- Data for Name: absence_affected_shifts; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.absence_affected_shifts (id, absence_id, shift_id, is_substituted, created_at) FROM stdin; +\. + + +-- +-- Data for Name: absences; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.absences (id, guard_id, type, start_date, end_date, certificate_url, notes, is_approved, needs_substitute, substitute_guard_id, created_at, approved_at, approved_by) FROM stdin; +\. + + +-- +-- Data for Name: certifications; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.certifications (id, guard_id, type, name, issue_date, expiry_date, status, document_url, created_at) FROM stdin; +\. + + +-- +-- Data for Name: contract_parameters; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.contract_parameters (id, contract_type, max_hours_per_day, max_overtime_per_day, max_hours_per_week, max_overtime_per_week, min_daily_rest_hours, min_weekly_rest_hours, max_night_hours_per_week, holiday_pay_increase, night_pay_increase, overtime_pay_increase, created_at, updated_at) FROM stdin; +\. + + +-- +-- Data for Name: guard_constraints; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.guard_constraints (id, guard_id, preferred_shift_type, max_hours_per_day, max_hours_per_week, preferred_days_off, available_on_holidays, notes, updated_at) FROM stdin; +\. + + +-- +-- Data for Name: guards; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.guards (id, user_id, badge_number, phone_number, is_armed, has_fire_safety, has_first_aid, has_driver_license, languages, created_at, updated_at) FROM stdin; +bd6451cc-2b35-49f2-9fc6-249a32892fe3 \N GPV-BPxp +39 333 1234567 t f f f {} 2025-10-11 10:06:22.578144 2025-10-11 10:06:22.578144 +54b94b52-e7c7-440c-a3fc-7a3eb73bc0ec \N Guardia di test t t t t {} 2025-10-11 10:08:48.44518 2025-10-11 10:08:48.44518 +d969de12-6b2e-4922-856a-25ef7ffb4151 \N ARMEDQ7Z +393331111111 t t f f {italiano} 2025-10-11 10:47:21.967514 2025-10-11 10:47:21.967514 +6939d71f-ec78-47ff-a5cc-8b34862264a6 \N NOARMPo1 +393332222222 f f t t {italiano} 2025-10-11 10:47:36.37076 2025-10-11 10:47:36.37076 +6f8f5d9d-0f10-4c25-9390-7d179fe53455 \N ARMZ7 3910000000 t f f f {it} 2025-10-11 10:56:56.418186 2025-10-11 10:56:56.418186 +guard-edit-test \N GPV-EDIT-002 +39 999 8888777 t t f t {} 2025-10-11 15:51:27.834342 2025-10-11 15:52:31.214 +\. + + +-- +-- Data for Name: holiday_assignments; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.holiday_assignments (id, holiday_id, guard_id, shift_id, created_at) FROM stdin; +\. + + +-- +-- Data for Name: holidays; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.holidays (id, name, date, is_national, worked_guard_ids, created_at, year) FROM stdin; +aef7418f-10bc-4e30-a7cb-b161de8c268f Natale 2025 2025-12-25 t \N 2025-10-11 19:22:16.473591 2025 +\. + + +-- +-- Data for Name: notifications; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.notifications (id, user_id, title, message, type, is_read, related_entity_id, created_at) FROM stdin; +\. + + +-- +-- Data for Name: sessions; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.sessions (sid, sess, expire) FROM stdin; +EOx2wCIiYXs6ymvWltapMxSk_OnpDO1X {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:29:52.444Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760178591, "iat": 1760174991, "iss": "https://test-mock-oidc.replit.app/", "jti": "d2897fd603422350e9c771fdfb2bb0c2", "sub": "admin001", "role": "admin", "email": "admin@vigilanza.it", "auth_time": 1760174991, "last_name": "Rossi", "first_name": "Mario"}, "expires_at": 1760178591, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc0OTkxLCJleHAiOjE3NjAxNzg1OTEsInN1YiI6ImFkbWluMDAxIiwiZW1haWwiOiJhZG1pbkB2aWdpbGFuemEuaXQiLCJmaXJzdF9uYW1lIjoiTWFyaW8iLCJsYXN0X25hbWUiOiJSb3NzaSIsInJvbGUiOiJhZG1pbiJ9.Q1Vi6UskNt8GEVPKVBtzBe7m-zV5vCQWmL1fgXb0g9ktNV_l09qvUCTLwHk9i8c5uzNtr-3uYqtW4wsG1mAmsw0Ax2JACA7mlVWXTZ1aZFqP2HRKlyOvrphoT05NAdDuScR726UpnsXfrLoZd29IH08I5kZcRqX51EiCfAMDac8adK8eZZlgSz2WfgkrxKLxa46uvnffO3NnsLG2CBniEE_OqpP-zoMItZnPHmm3-Nb-q_gPK2bP7zEuWWIEOF4Dlsf315t3S_jeN4A6fi3u1XS5K6KcMPUH3itRe8w_T8e0yKYiq-STuXrW0XsKCesanrgtc-1_DG_IatdbXS3_uA", "refresh_token": "eyJzdWIiOiJhZG1pbjAwMSIsImVtYWlsIjoiYWRtaW5AdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6Ik1hcmlvIiwibGFzdF9uYW1lIjoiUm9zc2kiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 09:36:39 +bHcuoH7eaupU1HmlAUuhDCWk1OCai1yX {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:17:29.732Z", "httpOnly": true, "originalMaxAge": 604800000}, "test-mock-oidc.replit.app": {"code_verifier": "XVRn_28dGTxuDcD_EqY_1FVcvsg6T_VLw8LBM0mDOeo"}} 2025-10-18 15:17:30 +j_-MaFHmjhRMHMo0tmPD_zDtYfmJY9NM {"cookie": {"path": "/", "secure": true, "expires": "2025-10-20T07:19:22.605Z", "httpOnly": true, "originalMaxAge": 604800000}, "replit.com": {"code_verifier": "7aA8NPNPCXpK5DZZ8EtIsAzPlvRdwY3yTq1iiSB5OvQ"}} 2025-10-22 08:09:45 +MaoXbrXPuQZddUf3Oc5pG9wXmV8Vpvqg {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:29:10.214Z", "httpOnly": true, "originalMaxAge": 604800000}, "replit.com": {"code_verifier": "ftUe_DWh6Lzz_1Yqg51bbkUZQIs_D3Q5l0BOiFp-1lg"}} 2025-10-18 09:29:11 +BCb25dspMJL_35e-GK-uhPg4JZqE6a8N {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:03:26.943Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760180606, "iat": 1760177006, "iss": "https://test-mock-oidc.replit.app/", "jti": "e0fe7223680d5c9f10d10e365296e745", "sub": "RELy01vi", "role": "admin", "email": "test-jv_1@vigilanza.it", "auth_time": 1760177006, "last_name": "User", "first_name": "Test"}, "expires_at": 1760180606, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc3MDA2LCJleHAiOjE3NjAxODA2MDYsInN1YiI6IlJFTHkwMXZpIiwiZW1haWwiOiJ0ZXN0LWp2XzFAdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6IlRlc3QiLCJsYXN0X25hbWUiOiJVc2VyIiwicm9sZSI6ImFkbWluIn0.XAZyuW1mJ-IWmAnoLriVfQWjkEDl3Af5SgjRTrekvtBaNOz5eZjc0adWziJHg4zmVVLNA0daClb-tr-sHMSm-55mw6Nn5rR12jDCuFSKFiCZYsUfDbyurPXpy5qWHPs9N6C8AFtDWV-YtZhmi1k28ZHyKqSqdUIfVKVuAOew-6WO1fxkqbvs7SDiTMr0eXHETJwf2ofAma4N8PK2N-EfJnMhno0E8seFaKK_a27lXRqlzitH3iNgMEKnDpEKHnudy4pO92D_Mjx_wh6k6QyfvhkL1kP5T_WMT5b3YHbpoePj-Bj33kybCac8O_KTiZ5qOKpbfrKyWtUpmsS2oHjzzw", "refresh_token": "eyJzdWIiOiJSRUx5MDF2aSIsImVtYWlsIjoidGVzdC1qdl8xQHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJUZXN0IiwibGFzdF9uYW1lIjoiVXNlciIsInJvbGUiOiJhZG1pbiJ9"}}} 2025-10-18 10:07:03 +pUCOXknX_aeGMXMO3Thr_IG5vnEuFX7t {"cookie": {"path": "/", "secure": true, "expires": "2025-10-20T07:12:32.468Z", "httpOnly": true, "originalMaxAge": 604800000}, "replit.com": {"code_verifier": "dPtnXTfpcDEqx_ONtmKbQ93jnP7p-sc4I22t0LJyLBc"}} 2025-10-20 07:12:33 +0MK06XSaPIpFv4XSuJeGKXvi1SxOlenq {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T19:52:57.199Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760215976, "iat": 1760212376, "iss": "https://replit.com/oidc", "sub": "48531002", "email": "marco@lanzara.eu", "at_hash": "eJHjY3-MxDZI-SmzsihfmQ", "username": "marco370", "auth_time": 1760196628, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760215976, "access_token": "5fLtx-nV43vr4TjerSFAWwU0umQR_pqCNeqLJqB_wtE", "refresh_token": "EAEqWZHNzy2bvEYSc3nqQ5umyFMROY1fnJffaHbHNSR"}}} 2025-10-18 19:56:04 +MGRsxqgxDuQWtazi3fyWmpKRzAnln9HH {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T14:54:00.458Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760198039, "iat": 1760194439, "iss": "https://replit.com/oidc", "sub": "48531002", "email": "marco@lanzara.eu", "at_hash": "ULFFV2r1H9HpeXPMBm9Pjg", "username": "marco370", "auth_time": 1760194438, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760198039, "access_token": "zqt-2nhoCJPqQE3Q3h8oEf5svEfbGlUP5oF7agsG4VH", "refresh_token": "92JyqY20XUAnkFrjwl4zrwldG_B0wCHrloL8BGTHwUz"}}} 2025-10-18 14:54:08 +9R3eXldzJgCJtvRidjnATOHleQqU-VPm {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:05:15.530Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760198715, "iat": 1760195115, "iss": "https://test-mock-oidc.replit.app/", "jti": "2638b26901698500dad7ac25664d26fc", "sub": "menu-test-user", "role": "admin", "email": "menu@test.it", "auth_time": 1760195114, "last_name": "Tester", "first_name": "Menu"}, "expires_at": 1760198715, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk1MTE1LCJleHAiOjE3NjAxOTg3MTUsInN1YiI6Im1lbnUtdGVzdC11c2VyIiwiZW1haWwiOiJtZW51QHRlc3QuaXQiLCJmaXJzdF9uYW1lIjoiTWVudSIsImxhc3RfbmFtZSI6IlRlc3RlciIsInJvbGUiOiJhZG1pbiJ9.FyUIOvOStYhb7IdGZmsuuZCBwGelj_UzU-pQEnXKNz9HIz_o1Esvrb1oDzef9i3gZ3DZD2QLO9oQgwY-EcJr74SzYQ-mZUWLNyXw3znOa8V5SgZd6xauovUiF27Kdhx8HY3V2eevlePVTCU_1zcy0lH6MzmrKKh6a7YYvq-v1TIabebPlM1rGuhGBq8D5HLPlnxtIpjOSuITy1alxZpj0x0mF2L1fke-wGdzOJhSpOBxebNohtfgQ5ZEcNnIF7_R4aZcA6Fxwz0hOjcOXSgtJ5Q_SHJqefpDT_RuBppZ42c_in-mx4pCl-703cg0mHTB762KuBP_6RR1Hj1pllYEaw", "refresh_token": "eyJzdWIiOiJtZW51LXRlc3QtdXNlciIsImVtYWlsIjoibWVudUB0ZXN0Lml0IiwiZmlyc3RfbmFtZSI6Ik1lbnUiLCJsYXN0X25hbWUiOiJUZXN0ZXIiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 15:05:19 +h-lYn0EHxUnWyDm0-Uw2Kpkb-Qc8YKtz {"cookie": {"path": "/", "secure": true, "expires": "2025-10-20T07:19:36.520Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760343575, "iat": 1760339975, "iss": "https://replit.com/oidc", "sub": "48531002", "email": "marco@lanzara.eu", "at_hash": "6TmaYJVt8NoBvvHW0zODKw", "username": "marco370", "auth_time": 1760176372, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760343575, "access_token": "Xa3NG-7gQ7VBePQCs-RQve8o6LR9j3ca-FUTIots4A4", "refresh_token": "b5teeGRFvjtKUZ73L2QpPtmWFC6A10CjP9u_IHWYVn8"}}} 2025-10-20 07:21:03 +CGdg7w4Rx4yhNg4HzM6x83UxA7erKxcK {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:47:16.831Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760179636, "iat": 1760176036, "iss": "https://replit.com/oidc", "sub": "48531002", "email": "marco@lanzara.eu", "at_hash": "UH5Ee9wj0LQVDxxlcC4xlA", "username": "marco370", "auth_time": 1760176035, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760179636, "access_token": "IoFFIzDnDVvT9WVwxZh_YVpagO0mzEoTVQIrKt-BDr-", "refresh_token": "fuWRFgDokC6JmXbNt9P4ppQqMkOInRpT_uaP6KUPA6g"}}} 2025-10-18 09:47:54 +sF24qvCjN9H31oy-4Qe43JaY44TUj9PE {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:48:05.682Z", "httpOnly": true, "originalMaxAge": 604800000}, "replit.com": {"code_verifier": "tXX4r9Lnnc4S47qzYkKHaxakmskn6bQdO2H5aCCKkgc"}, "test-mock-oidc.replit.app": {"code_verifier": "fq9U9BlmiFYq481ShXN75xVKhrA33PNWHoLNR83uitc"}} 2025-10-18 09:48:06 +oWaGRXLDo4rpH0G6I6lOD5WGgvcsDs9n {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:56:23.918Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760183783, "iat": 1760180183, "iss": "https://test-mock-oidc.replit.app/", "jti": "3f7e81adf85c2185fdd5c44b9120aef3", "sub": "jGUQSg", "role": "admin", "email": "refetch-cYC@test.it", "auth_time": 1760180183, "last_name": "Test", "first_name": "Refetch"}, "expires_at": 1760183783, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTgwMTgzLCJleHAiOjE3NjAxODM3ODMsInN1YiI6ImpHVVFTZyIsImVtYWlsIjoicmVmZXRjaC1jWUNAdGVzdC5pdCIsImZpcnN0X25hbWUiOiJSZWZldGNoIiwibGFzdF9uYW1lIjoiVGVzdCIsInJvbGUiOiJhZG1pbiJ9.iRNCC8Vo3ngYUYKDitOhucneKkK6fqfn6y34sLMIo47PSIxJ06cXSuj7BZd1p1kDXIjOcFcS1aW5Rsq59F2mWoCx2554olKDDSKMJ-0aRZHF5vKu1ctHdD9_6UoKCnKOkuv31GkIwUoumJBebagX764LA3dkKFvCGc44vV3GmzhFA_zxYkdLFzCdATuVY8cTG-yzZ3zIYAgrdTraTC9Xyh2It8AjULLRRVH_nqpknkWIFtOZl3PI61Mk5ak7UFi29l67-QNikreEt48sjWHh_J5J7FVlD5-LmsMEYqOyok-MXzn7ac_PRQ8CDpgOrvcwUE6OVUq0odJwiDe7w_1D9Q", "refresh_token": "eyJzdWIiOiJqR1VRU2ciLCJlbWFpbCI6InJlZmV0Y2gtY1lDQHRlc3QuaXQiLCJmaXJzdF9uYW1lIjoiUmVmZXRjaCIsImxhc3RfbmFtZSI6IlRlc3QiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 11:00:41 +rr6VHF5XVx-H_UGZLQLkpauI9ryJ7Y14 {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:39:18.339Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760182757, "iat": 1760179157, "iss": "https://test-mock-oidc.replit.app/", "jti": "6db441aed924d3f8a1376a445910e73b", "sub": "xujCTTYv", "role": "admin", "email": "assign-test-l71q@vigilanza.it", "auth_time": 1760179157, "last_name": "Test", "first_name": "Assignment"}, "expires_at": 1760182757, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc5MTU3LCJleHAiOjE3NjAxODI3NTcsInN1YiI6Inh1akNUVFl2IiwiZW1haWwiOiJhc3NpZ24tdGVzdC1sNzFxQHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJBc3NpZ25tZW50IiwibGFzdF9uYW1lIjoiVGVzdCIsInJvbGUiOiJhZG1pbiJ9.HQm4qNaItsrIa84yPFJMGy_J2_B9DvB8jiLqVC8NkKXow2EgLnj1nsBkBueDs_S1Waa4ptAHpNfopEHzgVVCs3lk5YZG2OjK4-ws-O7sC8HiCQ0r0Dk6UATNbxYhGZb-7LPCzrwSitWESSX21Nz9yDAuYfUIdByz0BEXDWfKTXHvjTaeamLqj-nIvsgl4w9oq3hrWS6cQOLtKAJZekUHGvDkyy8xQprPGLApcldY0uQAYdDZ6HbWg3eVgKpP8pQ6jJq3580cXimW-NhGpsbKQeDyi-149k9glREamgfw4r1GwTyUlpZkQi4mDbGOttLdQLD9sZTK4rCLmbBRLhkTOA", "refresh_token": "eyJzdWIiOiJ4dWpDVFRZdiIsImVtYWlsIjoiYXNzaWduLXRlc3QtbDcxcUB2aWdpbGFuemEuaXQiLCJmaXJzdF9uYW1lIjoiQXNzaWdubWVudCIsImxhc3RfbmFtZSI6IlRlc3QiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 10:45:07 +-NyLj_NDThlkVS_V1S3wEscq70x8tRNG {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:46:50.670Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760183210, "iat": 1760179610, "iss": "https://test-mock-oidc.replit.app/", "jti": "eb3cd3d5cf59b547a03194ee2324b94a", "sub": "K4vWdf31", "role": "admin", "email": "fix-test-iq8w@vigilanza.it", "auth_time": 1760179610, "last_name": "User", "first_name": "FixTest"}, "expires_at": 1760183210, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc5NjEwLCJleHAiOjE3NjAxODMyMTAsInN1YiI6Iks0dldkZjMxIiwiZW1haWwiOiJmaXgtdGVzdC1pcTh3QHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJGaXhUZXN0IiwibGFzdF9uYW1lIjoiVXNlciIsInJvbGUiOiJhZG1pbiJ9.wdegIwgmTZKonTDopkHaFFnNL0yyWOdDjQrR9ad-WuJuZqzDr5NCMfwHFZORJy_ZND9P21DU1_M8O2V5eUNPV4OYFE2IdExsjFwnLRmjRf1yp9stiL6-Gq-p3Kzyipb-xEAnhLQc0MRPT1Ggcz4K9OyvAytS8Tpon0JmGenO4qJRf4eHhuVkfADDW0EJCPzuzzy87lNf1qW59bB6-zoF509XW0EbvMOpYQYWvF_uE5B29HjBErZNFDZubeh4NTYdS27kJ76mgQhAWYhl1HKbk31OngXxB6wKOV3lxxvJxSHDjszwYlhDzPSjSU9Z7b9vh0QFgPCoxoQmBfk0SWHYYw", "refresh_token": "eyJzdWIiOiJLNHZXZGYzMSIsImVtYWlsIjoiZml4LXRlc3QtaXE4d0B2aWdpbGFuemEuaXQiLCJmaXJzdF9uYW1lIjoiRml4VGVzdCIsImxhc3RfbmFtZSI6IlVzZXIiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 10:54:13 +qHdexxU_vkm0SANJWvqXEsBvmGKnxktG {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:10:40.581Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760181039, "iat": 1760177439, "iss": "https://test-mock-oidc.replit.app/", "jti": "42ef5883a7ed0f48274417a33674620a", "sub": "cS6VwdUj", "role": "admin", "email": "final-test-T6pt@vigilanza.it", "auth_time": 1760177439, "last_name": "Test", "first_name": "Final"}, "expires_at": 1760181039, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc3NDM5LCJleHAiOjE3NjAxODEwMzksInN1YiI6ImNTNlZ3ZFVqIiwiZW1haWwiOiJmaW5hbC10ZXN0LVQ2cHRAdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6IkZpbmFsIiwibGFzdF9uYW1lIjoiVGVzdCIsInJvbGUiOiJhZG1pbiJ9.vEB2tmJLEcLBbHrGrvVoJZzgiU2tiBAcRiYSRYq9qyPfFbbIhkgZUHTPnpKmpsbIzHJm0ngBMUUu7YQsGOAYr_AxpA3u9OLPnYJSmBnCrYGP1hTjhpQqU6DPKZh9DGi0yn8xRt1Jy9wO4V8tLXyOYy46GmxDdq3aH0ZQC-ateHuKUgz0RMeuNS-_IMGvxcS4A9fJgGC0nNJDFpfuBRdOJqIVAgRef4A4QbbzWg-jKVi2SbdIhrJWWhirpoNM-6kfBO8K6ELHddApdlzDckGrZbAe6ZNcY8p23qLYlF8ecIfAr0LtZpXwQFkCikl43WpPpr4TTKOlchyhrz8d0wNWKQ", "refresh_token": "eyJzdWIiOiJjUzZWd2RVaiIsImVtYWlsIjoiZmluYWwtdGVzdC1UNnB0QHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJGaW5hbCIsImxhc3RfbmFtZSI6IlRlc3QiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 10:14:16 +wSmAm4Srk2KEuQ01VGmNE0Vq3zT0eCaR {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:59:42.800Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760180382, "iat": 1760176782, "iss": "https://test-mock-oidc.replit.app/", "jti": "314219805b34fb5c71c433e7daac2ccd", "sub": "vCRhJG-V", "role": "admin", "email": "admin-UNbw8C@vigilanza.it", "auth_time": 1760176781, "last_name": "Rossi", "first_name": "Mario"}, "expires_at": 1760180382, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc2NzgyLCJleHAiOjE3NjAxODAzODIsInN1YiI6InZDUmhKRy1WIiwiZW1haWwiOiJhZG1pbi1VTmJ3OENAdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6Ik1hcmlvIiwibGFzdF9uYW1lIjoiUm9zc2kiLCJyb2xlIjoiYWRtaW4ifQ.KHf-xmZ1NSCwTMgeHJmrPJmm7Bt3T18d-i23kCtnt2TlQtPy1L_td0wgewr-UBeceMb0omMtOevDK6406dqmV_Xqkm6WPRhDtvXgsaQaDL-eg_ito2kkTvJQdD9peOsTTvQ1BVwQPW5XFGRsvs8293SrzWoOs-eiQqw-zbQ36HzrBiGCIy7-L40Bs0_L9Gpx2BXQVk2UurB9shY_RHqlygzDWioHrvjtjoH3CNcSYuCosoW_WQLvEB0E9Etw561G1mynUk8WvA11owdOOdfIodnuA683JTaIo0QFttavPytwufBlPO6RGPM1wQ43R32BOLF79Nsv6VQcPbOaGPvpPA", "refresh_token": "eyJzdWIiOiJ2Q1JoSkctViIsImVtYWlsIjoiYWRtaW4tVU5idzhDQHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJNYXJpbyIsImxhc3RfbmFtZSI6IlJvc3NpIiwicm9sZSI6ImFkbWluIn0"}}} 2025-10-18 10:00:30 +aTDDzJwwmT3UbBAN5TASdAZPLMAAXopj {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:17:37.663Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760181456, "iat": 1760177856, "iss": "https://test-mock-oidc.replit.app/", "jti": "9b777e0d39bd576a633b45ba3fcb76f7", "sub": "IDxjtq9A", "role": "admin", "email": "final-zod-wxYt@vigilanza.it", "auth_time": 1760177856, "last_name": "Test", "first_name": "Zod"}, "expires_at": 1760181456, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc3ODU2LCJleHAiOjE3NjAxODE0NTYsInN1YiI6IklEeGp0cTlBIiwiZW1haWwiOiJmaW5hbC16b2Qtd3hZdEB2aWdpbGFuemEuaXQiLCJmaXJzdF9uYW1lIjoiWm9kIiwibGFzdF9uYW1lIjoiVGVzdCIsInJvbGUiOiJhZG1pbiJ9.xLN3sEzJk5mrVfs9xUCQ1zIHs6efkBmHFTtUZZ2SS6w-1jd9d6dzYSkIhY41MZnTQgUd664UdeAMKJoT0qjx2xOEFzeTPpp2bPuVmCqQT41zjU1U5j1sGIpcuiAKZOiBDDwsmd_92BmhpJYim-fKL2ICu4VCSzhqedrN2v4i6cGWrt9_GTr9M8Fn4IbmxCdjtv4_8HZuoJOZOBQGu4lsRHk2_EAwARVxTQYn-NVMxgLRhwc3NertTEzS_mtr0IYtDg_ZD4EXuP5d3LOuLeamSD5T6I-tY3_ojg57PxUysWy-sju0OEY9qpD8WiZhZJx7IT8xoE3NT_6ge1ll64HdEA", "refresh_token": "eyJzdWIiOiJJRHhqdHE5QSIsImVtYWlsIjoiZmluYWwtem9kLXd4WXRAdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6IlpvZCIsImxhc3RfbmFtZSI6IlRlc3QiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 10:19:36 +rBOv-IOJDsfLpoqpD2dULNNIXRNVIS6Y {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:23:07.251Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760181786, "iat": 1760178186, "iss": "https://test-mock-oidc.replit.app/", "jti": "cf4d4c31d279a71c40b28e5491d85763", "sub": "JMGdwYph", "role": "admin", "email": "refine-fix-sigB@vigilanza.it", "auth_time": 1760178186, "last_name": "Fix", "first_name": "Refine"}, "expires_at": 1760181786, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc4MTg2LCJleHAiOjE3NjAxODE3ODYsInN1YiI6IkpNR2R3WXBoIiwiZW1haWwiOiJyZWZpbmUtZml4LXNpZ0JAdmlnaWxhbnphLml0IiwiZmlyc3RfbmFtZSI6IlJlZmluZSIsImxhc3RfbmFtZSI6IkZpeCIsInJvbGUiOiJhZG1pbiJ9.i8yCJFN_Uoc3H9L7VD9FtiIuAitsG6LQAbYQm51hsQQJabSgmQ2FNB-dCBYRQiwz_-vbiFSsyJf8VxGsqvcyST8PNGQx3wdrbx0eZrqtXAS1WDOmmR1kC5vwzSsk1qOW9Hcu9G_hGBigwor5uHWZVhrONoTH2C8cqz40QECDz58Vyj-tfEY-vxDVMaeOoz3qPvrtIEUwXwVDxfkq69CQnLngJkW7QBouwaw5AzmS6ZZsq3wuzHb5hO44wCNaqH61T_n_PIvE89aMS0UZ9PIjDrO4WC_PJ6f4HAbijxfXE5CV2MJf7kMffsIyBoW8CpclP7Evic6DVtc9sAzMO279Hw", "refresh_token": "eyJzdWIiOiJKTUdkd1lwaCIsImVtYWlsIjoicmVmaW5lLWZpeC1zaWdCQHZpZ2lsYW56YS5pdCIsImZpcnN0X25hbWUiOiJSZWZpbmUiLCJsYXN0X25hbWUiOiJGaXgiLCJyb2xlIjoiYWRtaW4ifQ"}}} 2025-10-18 10:26:27 +O4cjg1auQoYPvA9kIeugk2b-7uwsbxSU {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T10:28:18.421Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760182097, "iat": 1760178497, "iss": "https://test-mock-oidc.replit.app/", "jti": "b1b6c1050ccfca9db2f8adcbecfd3901", "sub": "eVS7usSc", "role": "admin", "email": "debug-IoeB@test.it", "auth_time": 1760178497, "last_name": "User", "first_name": "Debug"}, "expires_at": 1760182097, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc4NDk3LCJleHAiOjE3NjAxODIwOTcsInN1YiI6ImVWUzd1c1NjIiwiZW1haWwiOiJkZWJ1Zy1Jb2VCQHRlc3QuaXQiLCJmaXJzdF9uYW1lIjoiRGVidWciLCJsYXN0X25hbWUiOiJVc2VyIiwicm9sZSI6ImFkbWluIn0.pUWo5lXHt17hDU6XQrN_jNkdpfDra9OsJbSxGCuiiOnWXkD7isSGQEjIHgKdwHIqBro3Ss76Yvjm3or5iHIqxOXU6LY8E2u31WxgDtnX0Y-rhvguN7rpLJIYkSTMvezwcXY4rdtzPiT2NmdN1HgdODqfsETeJr1Itk9qO8iyJJDQSwRwzfwvscWRE3O8hhF6r0sRjioXUpxH_myqgdfrlTheyzjlnLM2ESsFUkV9UrH-YxOusgcuS-BWusOOZjK2nL8L2N2jJIbbqYwgtyZOXK8d_U8Zz1CF1JIpsLder9ql4XDiI9bvTrOVEkJ_dy15DM0GfS3dJhEb74ibkwPVTQ", "refresh_token": "eyJzdWIiOiJlVlM3dXNTYyIsImVtYWlsIjoiZGVidWctSW9lQkB0ZXN0Lml0IiwiZmlyc3RfbmFtZSI6IkRlYnVnIiwibGFzdF9uYW1lIjoiVXNlciIsInJvbGUiOiJhZG1pbiJ9"}}} 2025-10-18 10:29:53 +sqnKaJZhmGqrBQ0mVupW1z_-HeqPSv9b {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:50:29.528Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760201428, "iat": 1760197828, "iss": "https://test-mock-oidc.replit.app/", "jti": "61a7a06f540598b0fe43bd089b85683f", "sub": "admin-test-2", "email": "admin2@test.com", "auth_time": 1760197828, "last_name": "Test", "first_name": "Admin"}, "expires_at": 1760201428, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk3ODI4LCJleHAiOjE3NjAyMDE0MjgsInN1YiI6ImFkbWluLXRlc3QtMiIsImVtYWlsIjoiYWRtaW4yQHRlc3QuY29tIiwiZmlyc3RfbmFtZSI6IkFkbWluIiwibGFzdF9uYW1lIjoiVGVzdCJ9.OddLXmyAQJND5-38ipitOCceqONCcvfpu-TfCH2QlVg4lOzJ5gL6HwFOk-OKyipCn0BUUHDEthftf27wo60gYd5WkgUe0UlaFEdjZGn9dEHFaHkuuB6_ShtDDRkGExwY2OT2DqqR1AVSFj228r6QhUaJMedgP6U753hcGtwCoAYPkqiXGQDyKL6TlF3tFShxFpSNoUKxzbgmiyRYCcFgQZwdeiG_pFryquzuOTjeYSn1ekj_ayG4O35Sgavglx9m6js_78ND1x2TB_jz02IyA5T6kq1mz6oQP2B44ATFu-3WClQX4y4CuZyhkAZ-jhvSufnJSHmIWgHHkF8mZEa1Jw", "refresh_token": "eyJzdWIiOiJhZG1pbi10ZXN0LTIiLCJlbWFpbCI6ImFkbWluMkB0ZXN0LmNvbSIsImZpcnN0X25hbWUiOiJBZG1pbiIsImxhc3RfbmFtZSI6IlRlc3QifQ"}}} 2025-10-18 15:50:33 +CTsWAmVjRCDIeJWmv2gu3EByl_nNK1Er {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:22:48.261Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760199767, "iat": 1760196167, "iss": "https://test-mock-oidc.replit.app/", "jti": "deec8b729995ac3f71974438f94ba6bb", "sub": "security-test-admin", "email": "security-admin@test.it", "auth_time": 1760196167, "last_name": "Admin", "first_name": "Security"}, "expires_at": 1760199767, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk2MTY3LCJleHAiOjE3NjAxOTk3NjcsInN1YiI6InNlY3VyaXR5LXRlc3QtYWRtaW4iLCJlbWFpbCI6InNlY3VyaXR5LWFkbWluQHRlc3QuaXQiLCJmaXJzdF9uYW1lIjoiU2VjdXJpdHkiLCJsYXN0X25hbWUiOiJBZG1pbiJ9.SrpW_aZZMcZAS-jYZU4MnUGUdDSCVb81qMiC3yATh5oBcPYpmxCKlpZS-iOLXViBSBnIsYyeJJwynsFPbZn9yv57Vxhi9PEz5EndF99yMMXYngSw6tQXBhTKo51PjssXEbRYJ6_MdCpWoPLVOTYN9mvAoTvDHmT5GiVApxsS0ksEtAIDc9dev0wSw2o2IhXh4Sz4Ck6_29a0RYqyVffXh03qjk8zrpk3TQtUJxP9J6x6WmvAfxWoYsMEq8OWxXxUW3YgenJuHghv4P3BSOPMlF21_jX90xVbniorkycBqjKAAsLQIOsaiwN4xbV97vb89gqnmoafU3x66XNczbYf3A", "refresh_token": "eyJzdWIiOiJzZWN1cml0eS10ZXN0LWFkbWluIiwiZW1haWwiOiJzZWN1cml0eS1hZG1pbkB0ZXN0Lml0IiwiZmlyc3RfbmFtZSI6IlNlY3VyaXR5IiwibGFzdF9uYW1lIjoiQWRtaW4ifQ"}}} 2025-10-18 15:23:14 +rSR1OAJ1n-2EJf4uKVhr7ZEvMT7drJZY {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:24:32.968Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760199872, "iat": 1760196272, "iss": "https://test-mock-oidc.replit.app/", "jti": "a84ed05c9dfee4cea533cc8450efa714", "sub": "marco-lanzara-admin", "email": "marco@lanzara.eu", "auth_time": 1760196272, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760199872, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk2MjcyLCJleHAiOjE3NjAxOTk4NzIsInN1YiI6Im1hcmNvLWxhbnphcmEtYWRtaW4iLCJlbWFpbCI6Im1hcmNvQGxhbnphcmEuZXUiLCJmaXJzdF9uYW1lIjoiTWFyY28iLCJsYXN0X25hbWUiOiJMYW56YXJhIn0.fZeD9geXmiTH_ZHdVq8Up2seOaVQN-41fAPhxc0jNy3CMKwcAJ5qPTLBu0xRfmd1HPBU_r08aD1r0SDQIi5zi7ym29H1mIuxwJ5uVsTRzwESwvJrwEMZaQpZeHoXxNZY5eWdHPF6I9g4GOoSd2OxPr3byFXLT5s2gm_B4aUeTjloQv39a1c9BAZvD7LKWIrln2ucrlLlCpFX1jHJCrlG5uCbUDdPTNSPUtUBQ1STyeB2AFcRtCGHChl7HKr7_WCLJO6kyxmTdKuQhz9NACeLJsDCQRbCZz1Wk3XX69djsYbye1t1yZqSveAW5gu9nRVwb-nz_S0PmRR741RWljUqPA", "refresh_token": "eyJzdWIiOiJtYXJjby1sYW56YXJhLWFkbWluIiwiZW1haWwiOiJtYXJjb0BsYW56YXJhLmV1IiwiZmlyc3RfbmFtZSI6Ik1hcmNvIiwibGFzdF9uYW1lIjoiTGFuemFyYSJ9"}}} 2025-10-18 15:24:37 +8RpUruKQx6G5UgL98xG4h_PD8MME56kT {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:18:57.242Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760199536, "iat": 1760195936, "iss": "https://test-mock-oidc.replit.app/", "jti": "c3aca2826c2b6b6dc4bd3c864d622b12", "sub": "marco-admin", "email": "marco@lanzara.eu", "auth_time": 1760195936, "last_name": "Lanzara", "first_name": "Marco"}, "expires_at": 1760199536, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk1OTM2LCJleHAiOjE3NjAxOTk1MzYsInN1YiI6Im1hcmNvLWFkbWluIiwiZW1haWwiOiJtYXJjb0BsYW56YXJhLmV1IiwiZmlyc3RfbmFtZSI6Ik1hcmNvIiwibGFzdF9uYW1lIjoiTGFuemFyYSJ9.rZHKW6NJfYB8zOD_HN_ynHAFSprCoND7IzQ8rvugxS8kZn67JkBbHnD2vrkoBQk6XS0yj8-Fn__riz41cqzCJFzMHOzQNOJvj4BJyH8ss8gftQx4L63fb3IrBw21GYfQXx9BICilnPUB9gd9vHgAL1nQlSxd4Szg9VyKwLdKC4I_qClxI42JasaZcur1VBsz--c3J2zo-ia1yJeUGChrxBRodbvjczrlEWEuKlaZsqnx0L7fMLyl-7M_rdEtJQS2CEIR9lwYu-5Z7N55XQpcdr2qMc-Okjp58u_rHQZQOVm4t35eKpNS_Vdou80fjKjkCyN_e40BBZhV2nIDlSd9Vg", "refresh_token": "eyJzdWIiOiJtYXJjby1hZG1pbiIsImVtYWlsIjoibWFyY29AbGFuemFyYS5ldSIsImZpcnN0X25hbWUiOiJNYXJjbyIsImxhc3RfbmFtZSI6IkxhbnphcmEifQ"}}} 2025-10-18 15:20:06 +LplSh1-TmAlPl9VqBYRZOmQhHAlFkNtf {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:48:20.085Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760201299, "iat": 1760197699, "iss": "https://test-mock-oidc.replit.app/", "jti": "518e0a1c09594f15a5f2dc183738f1b5", "sub": "admin-test", "email": "admin@test.com", "auth_time": 1760197699, "last_name": "Test", "first_name": "Admin"}, "expires_at": 1760201299, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTk3Njk5LCJleHAiOjE3NjAyMDEyOTksInN1YiI6ImFkbWluLXRlc3QiLCJlbWFpbCI6ImFkbWluQHRlc3QuY29tIiwiZmlyc3RfbmFtZSI6IkFkbWluIiwibGFzdF9uYW1lIjoiVGVzdCJ9.yYSJEWeKNj6UbT77sak5rgKaGHe8QFINKsW7vRoFpCENQGsbgo7DofYaiWMHzoYhhZkBNyT1FwydU53pjnr4UNVjKZpjqiN0MI8o2XiUK2J9fmerwkMVyihPOJsInE909eF6NYlaAQKuyEPNATRnd15VBXFHL9yo8o9CiaNQSpX1uwJh8NZVxOCShas5uGVuvSTjIApVFauI7eCrbPkUZIygWzGZ0HkattdvQGTmLvuAbmQqptHadZCBUTdg7Sh2SCnQBTgzR6-9fsMMTWoP-4fXRQSojeH1ioxE4z6LCvupCyALEQkL8z4LPmKvjOgbzLAuop9ZIhv0NRg-Pjbt2Q", "refresh_token": "eyJzdWIiOiJhZG1pbi10ZXN0IiwiZW1haWwiOiJhZG1pbkB0ZXN0LmNvbSIsImZpcnN0X25hbWUiOiJBZG1pbiIsImxhc3RfbmFtZSI6IlRlc3QifQ"}}} 2025-10-18 15:48:47 +YfwL6PA7Xv2fL1R4Saj7uVlxWClGbCj_ {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T14:51:13.614Z", "httpOnly": true, "originalMaxAge": 604800000}} 2025-10-18 14:51:16 +i1-TNkwzaiBtwt7prUEQc0IlverS_FB5 {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T09:55:07.280Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760180106, "iat": 1760176506, "iss": "https://test-mock-oidc.replit.app/", "jti": "8ed556ffcd8e0b7c03f612e8699504dc", "sub": "test-admin-001", "email": "admin@vigilanza.test", "auth_time": 1760176506, "last_name": "Admin", "first_name": "Test"}, "expires_at": 1760180106, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMTc2NTA2LCJleHAiOjE3NjAxODAxMDYsInN1YiI6InRlc3QtYWRtaW4tMDAxIiwiZW1haWwiOiJhZG1pbkB2aWdpbGFuemEudGVzdCIsImZpcnN0X25hbWUiOiJUZXN0IiwibGFzdF9uYW1lIjoiQWRtaW4ifQ.WmdnfET4FTruZT7cL4qWxPccjGmPwjIkRen_xd1JXhCaqE8W99MeATkMArt4kbKJQZ8hrorWtRpZ5iOzl8563eybH7xufLwfPTjD6gR5IPYj2eyj69yzs0El2_hjJaUkTHz1qRSyxK815PAQ8-qxt-qW_iWl2DUeVgnYSZpu2ZpIEdhZdsDOly4mOvCtm6Y3wpTzAOLaQmO8dnJHfiD6L1xmCU7OB1KkVwnC74GZYe4rU6dwQbGc9dz513U2sL9eviCwZkT69-W4cM4hbooA9Ik5WVHlwUTs8mFnDJN2IqN_jxei97cY1c0ahibM2JN7wJRE0gz2C6w1kQJhldFNoA", "refresh_token": "eyJzdWIiOiJ0ZXN0LWFkbWluLTAwMSIsImVtYWlsIjoiYWRtaW5AdmlnaWxhbnphLnRlc3QiLCJmaXJzdF9uYW1lIjoiVGVzdCIsImxhc3RfbmFtZSI6IkFkbWluIn0"}}} 2025-10-18 09:55:42 +-U9sF1yoO4caKgRnSqmF_MgbJpJvFQ8C {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T19:25:48.729Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760214348, "iat": 1760210748, "iss": "https://test-mock-oidc.replit.app/", "jti": "9c53a7347cd119fce6eb7bbd02e65122", "sub": "test-admin-planning-v2", "email": "admin@planning-v2.test", "auth_time": 1760210748, "last_name": "PlanningV2", "first_name": "Admin"}, "expires_at": 1760214348, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMjEwNzQ4LCJleHAiOjE3NjAyMTQzNDgsInN1YiI6InRlc3QtYWRtaW4tcGxhbm5pbmctdjIiLCJlbWFpbCI6ImFkbWluQHBsYW5uaW5nLXYyLnRlc3QiLCJmaXJzdF9uYW1lIjoiQWRtaW4iLCJsYXN0X25hbWUiOiJQbGFubmluZ1YyIn0.P9jkI_LtRrFtfLY5O3tkRalvPM9Db5Lg-s28S1-yyJpEpyZwwhtjFnJG9s4165LntdhP2E4obzXgdm0PHZGrfkBSRQM-ipzWWSEYJR_R78arB6PZZEVB2C0GsBMUrPABL3TA5wZVeIiyDkh_t8rj-TloYV4sP0nccxgtabWZZLdJqnbuzHgPEvVMVP3-TmbqJL-KiwrZpjPuSKape58JAShRq0wG47VuiASkjq1Z2URe8X9ouhNNBFQCmTEuNPyOaG7UpIaj3j3nLacfXtad_gdH6T1Bsez6LaF1WVL2YalRlrsNg0GhfOXSPw3UebLClbKm6UPaTv1qKcf43ufvRg", "refresh_token": "eyJzdWIiOiJ0ZXN0LWFkbWluLXBsYW5uaW5nLXYyIiwiZW1haWwiOiJhZG1pbkBwbGFubmluZy12Mi50ZXN0IiwiZmlyc3RfbmFtZSI6IkFkbWluIiwibGFzdF9uYW1lIjoiUGxhbm5pbmdWMiJ9"}}} 2025-10-18 19:28:10 +bf_EBibyQEKJ6BzLDgQt-ixp3tjoVyAE {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T19:18:42.177Z", "httpOnly": true, "originalMaxAge": 604800000}, "passport": {"user": {"claims": {"aud": "6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80", "exp": 1760213921, "iat": 1760210321, "iss": "https://test-mock-oidc.replit.app/", "jti": "92511eea1d9a22cdee4343b6d56bd014", "sub": "test-admin-planning", "email": "admin@planning.test", "auth_time": 1760210321, "last_name": "Planning", "first_name": "Admin"}, "expires_at": 1760213921, "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ijc4MDgyZTlmZjVhOTA1YjIifQ.eyJpc3MiOiJodHRwczovL3Rlc3QtbW9jay1vaWRjLnJlcGxpdC5hcHAvIiwiaWF0IjoxNzYwMjEwMzIxLCJleHAiOjE3NjAyMTM5MjEsInN1YiI6InRlc3QtYWRtaW4tcGxhbm5pbmciLCJlbWFpbCI6ImFkbWluQHBsYW5uaW5nLnRlc3QiLCJmaXJzdF9uYW1lIjoiQWRtaW4iLCJsYXN0X25hbWUiOiJQbGFubmluZyJ9.c4AuBsI678zxAk6rlhe4Hai5GV-A1jIHvdLfGzAbcxmSmxGE5YKlRz-LJk1dvvt980O2kfXH_j6MoedLyN9xhuYmZ4ovKrCUu0WNHH6qK977ckBJPAt1_FpMopmgPCpYcOpWupz-X1TZbR0kpWXWz5ycNTANAtUmdrDj5JYzzfli4ZAEtTAEjXMWWK0w_-ErkkFmvea8B2JLLslDVAIBK59sAQksSoDPjHY7Ww2cB4m7ykWVp4kXVNH_uW7lbHnd7wgf_XFAbW-LKzpVg37FLZv4Zi7MWwcNG_67ISR5NB6UfLzYlXZFdYuQhty-wOq_DlvtezqGmjC1ekqbcXwpBg", "refresh_token": "eyJzdWIiOiJ0ZXN0LWFkbWluLXBsYW5uaW5nIiwiZW1haWwiOiJhZG1pbkBwbGFubmluZy50ZXN0IiwiZmlyc3RfbmFtZSI6IkFkbWluIiwibGFzdF9uYW1lIjoiUGxhbm5pbmcifQ"}}} 2025-10-18 19:23:05 +sIMx1lBq3K5NzCEOvdzEQ-H0ec7hks_i {"cookie": {"path": "/", "secure": true, "expires": "2025-10-18T15:56:05.693Z", "httpOnly": true, "originalMaxAge": 604800000}} 2025-10-18 15:56:09 +\. + + +-- +-- Data for Name: shift_assignments; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.shift_assignments (id, shift_id, guard_id, assigned_at, confirmed_at, check_in_time, check_out_time) FROM stdin; +69698965-69f2-4167-93c3-a5d5ca38b726 4da5e14f-d0a4-46fa-a77f-58f35d55fa6d bd6451cc-2b35-49f2-9fc6-249a32892fe3 2025-10-11 10:45:03.991232 \N \N \N +b333cbb8-cbad-4edb-94b6-885f8d2b30f0 855172fc-ce14-47a0-a01f-294a2cc85898 d969de12-6b2e-4922-856a-25ef7ffb4151 2025-10-11 11:00:38.786784 \N \N \N +\. + + +-- +-- Data for Name: shifts; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.shifts (id, site_id, start_time, end_time, status, notes, created_at, updated_at) FROM stdin; +1bc94a2a-b48a-4e96-9da7-53ee4d68a764 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-11 09:55:45.524 2025-10-11 09:55:45.524 planned \N 2025-10-11 09:55:50.21058 2025-10-11 09:55:50.21058 +96b40beb-dac9-4369-8981-e0b011501d08 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-12 08:00:00 2025-10-12 16:00:00 planned \N 2025-10-11 10:05:22.835039 2025-10-11 10:05:22.835039 +ad5c4ddd-1491-4d02-bbde-44cb47964501 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-11 10:09:03.219 2025-10-11 10:09:03.219 planned \N 2025-10-11 10:09:14.142048 2025-10-11 10:09:14.142048 +12eeb4f4-bb02-4e26-86d6-6e681c44eb70 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-15 09:00:00 2025-10-15 17:00:00 planned \N 2025-10-11 10:12:01.045964 2025-10-11 10:12:01.045964 +d1051d76-9dcb-4947-bbcf-9748d6dec917 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-11 10:14:00 2025-10-18 13:16:00 planned \N 2025-10-11 10:14:11.573726 2025-10-11 10:14:11.573726 +0bba1222-fbf1-4b31-9a9c-2a7e1b5722ea 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-17 10:00:00 2025-10-17 18:00:00 planned \N 2025-10-11 10:14:15.001963 2025-10-11 10:14:15.001963 +7ed9101f-822c-443d-bc9a-50ecb59eb21f 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-20 08:00:00 2025-10-20 16:00:00 planned \N 2025-10-11 10:19:34.302835 2025-10-11 10:19:34.302835 +f0a16c0a-d1e9-432a-ac9b-f8ce759d2b03 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-09 10:20:00 2025-10-12 10:20:00 planned \N 2025-10-11 10:21:03.458271 2025-10-11 10:21:03.458271 +6b7876db-f358-458e-b298-1a9aa37ae092 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-22 10:00:00 2025-10-22 18:00:00 planned \N 2025-10-11 10:25:59.585871 2025-10-11 10:25:59.585871 +cd4892cc-bbdb-4248-b522-3661628f9fd1 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-10-25 09:00:00 2025-10-25 17:00:00 planned \N 2025-10-11 10:29:31.629532 2025-10-11 10:29:31.629532 +4da5e14f-d0a4-46fa-a77f-58f35d55fa6d 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-11-01 08:00:00 2025-11-01 16:00:00 planned \N 2025-10-11 10:40:56.469271 2025-10-11 10:40:56.469271 +55cde829-6d69-4865-a91b-5686a6bfdacc c46d254f-769a-4184-9b92-0bd2c7dd9468 2025-11-05 09:00:00 2025-11-05 17:00:00 planned \N 2025-10-11 10:50:13.34427 2025-10-11 10:50:13.34427 +adccf142-4fe3-43b9-aaa5-8239a496b33a c46d254f-769a-4184-9b92-0bd2c7dd9468 2025-11-05 09:00:00 2025-11-05 17:00:00 planned \N 2025-10-11 10:51:53.092243 2025-10-11 10:51:53.092243 +855172fc-ce14-47a0-a01f-294a2cc85898 7d80b4c8-77c6-4c26-8641-f8a2fbb067cc 2025-11-10 10:00:00 2025-11-10 18:00:00 planned \N 2025-10-11 10:59:22.833298 2025-10-11 10:59:22.833298 +shift-abc-123 site-edit-456 2025-11-02 10:00:00 2025-11-01 14:00:00 completed \N 2025-10-11 15:55:02.374157 2025-10-11 15:55:42.802 +\. + + +-- +-- Data for Name: site_preferences; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.site_preferences (id, site_id, guard_id, preference, priority, reason, created_at) FROM stdin; +\. + + +-- +-- Data for Name: sites; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.sites (id, name, address, client_id, shift_type, min_guards, requires_armed, requires_driver_license, latitude, longitude, is_active, created_at, updated_at) FROM stdin; +76745907-a110-4765-a7c3-de87902385a9 Centro Commerciale Nord Via Roma 123, Milano \N fixed_post 1 f f \N \N t 2025-10-11 09:32:54.993576 2025-10-11 09:32:54.993576 +aeaf38d4-2aa6-4fe3-b981-6c9e1a92cc18 Final Test Site Via Finale 1 \N fixed_post 2 f f \N \N t 2025-10-11 10:10:51.630603 2025-10-11 10:10:51.630603 +b479db14-0a4d-4944-812e-cfdf51d234c6 Zod Test Site Via Zod 1 \N fixed_post 2 f f \N \N t 2025-10-11 10:17:56.74085 2025-10-11 10:17:56.74085 +28a669ce-dcf2-45d3-ad19-dd7f0126c0ff Test Site z6X Via Test 1 \N fixed_post 2 f f \N \N t 2025-10-11 10:23:25.629625 2025-10-11 10:23:25.629625 +ef1f9633-baf9-4578-8ece-aed2b9e60278 Debug Site Via Debug 1 \N fixed_post 1 f f \N \N t 2025-10-11 10:28:28.07614 2025-10-11 10:28:28.07614 +c46d254f-769a-4184-9b92-0bd2c7dd9468 Site Assignment Test s_y Via Test 456 \N fixed_post 1 t f \N \N t 2025-10-11 10:47:07.798685 2025-10-11 10:47:07.798685 +6ed41828-85a3-46d1-8000-038d4c943039 Refetch Site Via Test 1 \N fixed_post 1 t f \N \N t 2025-10-11 10:56:41.584119 2025-10-11 10:56:41.584119 +site-edit-456 Site UPDATED Via Milano 77 \N patrol 5 t f \N \N t 2025-10-11 15:53:18.999264 2025-10-11 15:54:25.705 +7d80b4c8-77c6-4c26-8641-f8a2fbb067cc Centro Commerciale Test Via Roma 123, Milano \N fixed_post 2 f f \N \N t 2025-10-11 09:32:22.875284 2025-10-11 19:55:28.047 +\. + + +-- +-- Data for Name: training_courses; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.training_courses (id, guard_id, course_name, course_type, scheduled_date, completion_date, expiry_date, status, certificate_url, provider, hours, notes, created_at) FROM stdin; +\. + + +-- +-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: neondb_owner +-- + +COPY public.users (id, email, first_name, last_name, profile_image_url, role, created_at, updated_at) FROM stdin; +admin001 admin@vigilanza.it Mario Rossi \N guard 2025-10-11 09:29:52.16585 2025-10-11 09:29:52.16585 +test-admin-001 admin@vigilanza.test Test Admin \N guard 2025-10-11 09:55:07.018946 2025-10-11 09:55:07.018946 +vCRhJG-V admin-UNbw8C@vigilanza.it Mario Rossi \N guard 2025-10-11 09:59:42.539995 2025-10-11 09:59:42.539995 +RELy01vi test-jv_1@vigilanza.it Test User \N guard 2025-10-11 10:03:26.683873 2025-10-11 10:03:26.683873 +cS6VwdUj final-test-T6pt@vigilanza.it Final Test \N guard 2025-10-11 10:10:40.310873 2025-10-11 10:10:40.310873 +IDxjtq9A final-zod-wxYt@vigilanza.it Zod Test \N guard 2025-10-11 10:17:37.400835 2025-10-11 10:17:37.400835 +JMGdwYph refine-fix-sigB@vigilanza.it Refine Fix \N guard 2025-10-11 10:23:06.994371 2025-10-11 10:23:06.994371 +eVS7usSc debug-IoeB@test.it Debug User \N guard 2025-10-11 10:28:18.161956 2025-10-11 10:28:18.161956 +xujCTTYv assign-test-l71q@vigilanza.it Assignment Test \N guard 2025-10-11 10:39:18.074376 2025-10-11 10:39:18.074376 +K4vWdf31 fix-test-iq8w@vigilanza.it FixTest User \N guard 2025-10-11 10:46:50.407768 2025-10-11 10:46:50.407768 +jGUQSg refetch-cYC@test.it Refetch Test \N guard 2025-10-11 10:56:23.656146 2025-10-11 10:56:23.656146 +nav-test nav@test.it Nav Test \N admin 2025-10-11 14:44:42.051639 2025-10-11 14:47:56.327881 +menu-test-user menu@test.it Menu Tester \N guard 2025-10-11 15:05:15.256762 2025-10-11 15:05:15.256762 +role-test-user roletest@vigilanza.it Role Tester \N coordinator 2025-10-11 15:19:18.363578 2025-10-11 15:20:04.305 +security-test-admin security-admin@test.it Security Admin \N admin 2025-10-11 15:22:47.998495 2025-10-11 15:22:47.998495 +48531002 marco@lanzara.eu Marco Lanzara \N admin 2025-10-11 09:47:16.558501 2025-10-11 15:30:30.389 +admin-test admin@test.com Admin Test \N admin 2025-10-11 15:48:19.825178 2025-10-11 15:48:19.825178 +admin-test-2 admin2@test.com Admin Test \N admin 2025-10-11 15:50:29.267968 2025-10-11 15:51:03.533 +test-admin-planning admin@planning.test Admin Planning \N guard 2025-10-11 19:18:41.917524 2025-10-11 19:18:41.917524 +test-admin-planning-v2 admin@planning-v2.test Admin PlanningV2 \N admin 2025-10-11 19:25:29.373216 2025-10-11 19:25:48.409 +\. + + +-- +-- Name: absence_affected_shifts absence_affected_shifts_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absence_affected_shifts + ADD CONSTRAINT absence_affected_shifts_pkey PRIMARY KEY (id); + + +-- +-- Name: absences absences_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absences + ADD CONSTRAINT absences_pkey PRIMARY KEY (id); + + +-- +-- Name: certifications certifications_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.certifications + ADD CONSTRAINT certifications_pkey PRIMARY KEY (id); + + +-- +-- Name: contract_parameters contract_parameters_contract_type_unique; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.contract_parameters + ADD CONSTRAINT contract_parameters_contract_type_unique UNIQUE (contract_type); + + +-- +-- Name: contract_parameters contract_parameters_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.contract_parameters + ADD CONSTRAINT contract_parameters_pkey PRIMARY KEY (id); + + +-- +-- Name: guard_constraints guard_constraints_guard_id_unique; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guard_constraints + ADD CONSTRAINT guard_constraints_guard_id_unique UNIQUE (guard_id); + + +-- +-- Name: guard_constraints guard_constraints_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guard_constraints + ADD CONSTRAINT guard_constraints_pkey PRIMARY KEY (id); + + +-- +-- Name: guards guards_badge_number_unique; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guards + ADD CONSTRAINT guards_badge_number_unique UNIQUE (badge_number); + + +-- +-- Name: guards guards_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guards + ADD CONSTRAINT guards_pkey PRIMARY KEY (id); + + +-- +-- Name: holiday_assignments holiday_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.holiday_assignments + ADD CONSTRAINT holiday_assignments_pkey PRIMARY KEY (id); + + +-- +-- Name: holidays holidays_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.holidays + ADD CONSTRAINT holidays_pkey PRIMARY KEY (id); + + +-- +-- Name: notifications notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.notifications + ADD CONSTRAINT notifications_pkey PRIMARY KEY (id); + + +-- +-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.sessions + ADD CONSTRAINT sessions_pkey PRIMARY KEY (sid); + + +-- +-- Name: shift_assignments shift_assignments_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.shift_assignments + ADD CONSTRAINT shift_assignments_pkey PRIMARY KEY (id); + + +-- +-- Name: shifts shifts_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.shifts + ADD CONSTRAINT shifts_pkey PRIMARY KEY (id); + + +-- +-- Name: site_preferences site_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.site_preferences + ADD CONSTRAINT site_preferences_pkey PRIMARY KEY (id); + + +-- +-- Name: sites sites_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.sites + ADD CONSTRAINT sites_pkey PRIMARY KEY (id); + + +-- +-- Name: training_courses training_courses_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.training_courses + ADD CONSTRAINT training_courses_pkey PRIMARY KEY (id); + + +-- +-- Name: users users_email_unique; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_email_unique UNIQUE (email); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: IDX_session_expire; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE INDEX "IDX_session_expire" ON public.sessions USING btree (expire); + + +-- +-- Name: unique_absence_shift; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE UNIQUE INDEX unique_absence_shift ON public.absence_affected_shifts USING btree (absence_id, shift_id); + + +-- +-- Name: unique_holiday_date_year; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE UNIQUE INDEX unique_holiday_date_year ON public.holidays USING btree (date, year); + + +-- +-- Name: unique_holiday_guard; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE UNIQUE INDEX unique_holiday_guard ON public.holiday_assignments USING btree (holiday_id, guard_id); + + +-- +-- Name: unique_site_guard_preference; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE UNIQUE INDEX unique_site_guard_preference ON public.site_preferences USING btree (site_id, guard_id); + + +-- +-- Name: absence_affected_shifts absence_affected_shifts_absence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absence_affected_shifts + ADD CONSTRAINT absence_affected_shifts_absence_id_fkey FOREIGN KEY (absence_id) REFERENCES public.absences(id) ON DELETE CASCADE; + + +-- +-- Name: absence_affected_shifts absence_affected_shifts_shift_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absence_affected_shifts + ADD CONSTRAINT absence_affected_shifts_shift_id_fkey FOREIGN KEY (shift_id) REFERENCES public.shifts(id) ON DELETE CASCADE; + + +-- +-- Name: absences absences_approved_by_users_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absences + ADD CONSTRAINT absences_approved_by_users_id_fk FOREIGN KEY (approved_by) REFERENCES public.users(id); + + +-- +-- Name: absences absences_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absences + ADD CONSTRAINT absences_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: absences absences_substitute_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.absences + ADD CONSTRAINT absences_substitute_guard_id_guards_id_fk FOREIGN KEY (substitute_guard_id) REFERENCES public.guards(id); + + +-- +-- Name: certifications certifications_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.certifications + ADD CONSTRAINT certifications_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: guard_constraints guard_constraints_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guard_constraints + ADD CONSTRAINT guard_constraints_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: guards guards_user_id_users_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.guards + ADD CONSTRAINT guards_user_id_users_id_fk FOREIGN KEY (user_id) REFERENCES public.users(id); + + +-- +-- Name: holiday_assignments holiday_assignments_guard_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.holiday_assignments + ADD CONSTRAINT holiday_assignments_guard_id_fkey FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: holiday_assignments holiday_assignments_holiday_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.holiday_assignments + ADD CONSTRAINT holiday_assignments_holiday_id_fkey FOREIGN KEY (holiday_id) REFERENCES public.holidays(id) ON DELETE CASCADE; + + +-- +-- Name: holiday_assignments holiday_assignments_shift_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.holiday_assignments + ADD CONSTRAINT holiday_assignments_shift_id_fkey FOREIGN KEY (shift_id) REFERENCES public.shifts(id) ON DELETE SET NULL; + + +-- +-- Name: notifications notifications_user_id_users_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.notifications + ADD CONSTRAINT notifications_user_id_users_id_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; + + +-- +-- Name: shift_assignments shift_assignments_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.shift_assignments + ADD CONSTRAINT shift_assignments_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: shift_assignments shift_assignments_shift_id_shifts_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.shift_assignments + ADD CONSTRAINT shift_assignments_shift_id_shifts_id_fk FOREIGN KEY (shift_id) REFERENCES public.shifts(id) ON DELETE CASCADE; + + +-- +-- Name: shifts shifts_site_id_sites_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.shifts + ADD CONSTRAINT shifts_site_id_sites_id_fk FOREIGN KEY (site_id) REFERENCES public.sites(id) ON DELETE CASCADE; + + +-- +-- Name: site_preferences site_preferences_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.site_preferences + ADD CONSTRAINT site_preferences_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: site_preferences site_preferences_site_id_sites_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.site_preferences + ADD CONSTRAINT site_preferences_site_id_sites_id_fk FOREIGN KEY (site_id) REFERENCES public.sites(id) ON DELETE CASCADE; + + +-- +-- Name: sites sites_client_id_users_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.sites + ADD CONSTRAINT sites_client_id_users_id_fk FOREIGN KEY (client_id) REFERENCES public.users(id); + + +-- +-- Name: training_courses training_courses_guard_id_guards_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: neondb_owner +-- + +ALTER TABLE ONLY public.training_courses + ADD CONSTRAINT training_courses_guard_id_guards_id_fk FOREIGN KEY (guard_id) REFERENCES public.guards(id) ON DELETE CASCADE; + + +-- +-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: cloud_admin +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE cloud_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO neon_superuser WITH GRANT OPTION; + + +-- +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: cloud_admin +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE cloud_admin IN SCHEMA public GRANT ALL ON TABLES TO neon_superuser WITH GRANT OPTION; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/dump.zip b/dump.zip new file mode 100644 index 0000000000000000000000000000000000000000..4b561c6a8c8aa9fc74bd7ee47eb789207ed0c8ed GIT binary patch literal 16956 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 literal 0 HcmV?d00001 diff --git a/push-to-gitlab.sh b/push-to-gitlab.sh old mode 100755 new mode 100644 index 79073c2..b811caf --- a/push-to-gitlab.sh +++ b/push-to-gitlab.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Script helper per push automatico verso GitLab da Replit +# Script per push automatico verso GitLab set -e @@ -9,9 +9,17 @@ YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' -echo -e "${GREEN}πŸš€ Push to GitLab Production${NC}" +echo -e "${GREEN}πŸš€ Push to GitLab (vt.alfacom.it)${NC}" echo "========================================" +# Verifica remote GitLab +if ! git remote | grep -q "production"; then + echo -e "${YELLOW}⚠️ Remote 'production' non configurato${NC}" + echo "Configurazione remote GitLab..." + read -p "URL repository GitLab: " GITLAB_URL + git remote add production $GITLAB_URL +fi + # Verifica se ci sono modifiche if [[ -z $(git status -s) ]]; then echo -e "${YELLOW}⚠️ Nessuna modifica da committare${NC}" @@ -52,8 +60,11 @@ git push production main echo -e "\n${GREEN}βœ… Push completato!${NC}" echo "========================================" -echo -e "${YELLOW}Prossimi passi:${NC}" -echo "1. Vai su GitLab: https://git.alfacom.it/marco/VigilanzaTurni/-/pipelines" -echo "2. La pipeline CI/CD partirΓ  automaticamente" -echo "3. Clicca su 'deploy_production' per deployare su server" +echo -e "${YELLOW}Deployment automatico disponibile:${NC}" +echo "" +echo "Sul server esegui:" +echo -e "${GREEN} cd /var/www/vigilanza-turni${NC}" +echo -e "${GREEN} bash deploy/deploy.sh${NC}" +echo "" +echo "🌐 Sito: https://vt.alfacom.it" echo ""