the-tip-top-backend/database/migrations/add-email-campaigns.sql
2025-11-17 23:47:54 +01:00

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';