74 lines
3.0 KiB
SQL
74 lines
3.0 KiB
SQL
-- 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';
|