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 0000000..4b561c6 Binary files /dev/null and b/dump.zip differ 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 ""