-- Migration: Système de campagnes email -- Date: 2025-11-14 -- Description: Tables pour gérer les campagnes d'emailing -- Table des campagnes email CREATE TABLE IF NOT EXISTS email_campaigns ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, subject VARCHAR(500) NOT NULL, template_html TEXT NOT NULL, template_text TEXT, created_by UUID NOT NULL REFERENCES users(id), status VARCHAR(50) DEFAULT 'DRAFT', -- DRAFT, SCHEDULED, SENT, CANCELLED scheduled_at TIMESTAMP, sent_at TIMESTAMP, recipient_count INTEGER DEFAULT 0, opened_count INTEGER DEFAULT 0, clicked_count INTEGER DEFAULT 0, criteria JSONB, -- Critères de ciblage notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Table des destinataires (pour tracking individuel) CREATE TABLE IF NOT EXISTS email_campaign_recipients ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), campaign_id UUID NOT NULL REFERENCES email_campaigns(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id), email VARCHAR(255) NOT NULL, status VARCHAR(50) DEFAULT 'PENDING', -- PENDING, SENT, FAILED, BOUNCED sent_at TIMESTAMP, opened_at TIMESTAMP, clicked_at TIMESTAMP, unsubscribed_at TIMESTAMP, error_message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Table des templates prédéfinis CREATE TABLE IF NOT EXISTS email_templates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, description TEXT, subject VARCHAR(500), html_content TEXT NOT NULL, text_content TEXT, category VARCHAR(100), -- welcome, promotion, notification, etc. is_active BOOLEAN DEFAULT TRUE, created_by UUID REFERENCES users(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Index pour performance CREATE INDEX IF NOT EXISTS idx_email_campaigns_status ON email_campaigns(status); CREATE INDEX IF NOT EXISTS idx_email_campaigns_created_by ON email_campaigns(created_by); CREATE INDEX IF NOT EXISTS idx_email_campaigns_scheduled_at ON email_campaigns(scheduled_at); CREATE INDEX IF NOT EXISTS idx_email_campaign_recipients_campaign ON email_campaign_recipients(campaign_id); CREATE INDEX IF NOT EXISTS idx_email_campaign_recipients_user ON email_campaign_recipients(user_id); CREATE INDEX IF NOT EXISTS idx_email_campaign_recipients_status ON email_campaign_recipients(status); CREATE INDEX IF NOT EXISTS idx_email_templates_category ON email_templates(category); CREATE INDEX IF NOT EXISTS idx_email_templates_is_active ON email_templates(is_active); -- Commentaires COMMENT ON TABLE email_campaigns IS 'Campagnes email marketing'; COMMENT ON TABLE email_campaign_recipients IS 'Destinataires individuels avec tracking'; COMMENT ON TABLE email_templates IS 'Templates email reutilisables'; COMMENT ON COLUMN email_campaigns.criteria IS 'Criteres JSON de ciblage des destinataires'; COMMENT ON COLUMN email_campaigns.status IS 'DRAFT=Brouillon, SCHEDULED=Planifie, SENT=Envoye, CANCELLED=Annule';