﻿-- ============================================================
-- NÃ‰BULA OS Â· Fase 1 (MVP) â€” CRM de ventas
-- InstalaciÃ³n: crear BD en cPanel + importar este archivo
-- (phpMyAdmin > Importar) o: mysql -u USER -p DB < schema.sql
-- ============================================================

-- Usuarios
CREATE TABLE IF NOT EXISTS usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  email VARCHAR(191) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  rol ENUM('admin','vendedor') DEFAULT 'vendedor',
  activo BOOLEAN DEFAULT TRUE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Empresas (cuenta 360Â°)
CREATE TABLE IF NOT EXISTS empresas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(255) NOT NULL,
  rut VARCHAR(20),
  giro VARCHAR(255),
  rubro VARCHAR(100),
  comuna VARCHAR(100),
  region VARCHAR(100),
  direccion TEXT,
  telefono VARCHAR(50),
  email VARCHAR(255),
  web VARCHAR(500),
  instagram VARCHAR(500),
  facebook VARCHAR(500),
  fuente VARCHAR(100) DEFAULT 'manual',
  score INT DEFAULT 40,
  notas TEXT,
  portal_token VARCHAR(64) NULL UNIQUE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_empresas_nombre (nombre(191)),
  INDEX idx_empresas_score (score),
  INDEX idx_empresas_email (email(191)),
  INDEX idx_empresas_telefono (telefono)
);

-- Contactos de cada empresa
CREATE TABLE IF NOT EXISTS contactos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  empresa_id INT NOT NULL,
  nombre VARCHAR(255) NOT NULL,
  cargo VARCHAR(100),
  telefono VARCHAR(50),
  email VARCHAR(255),
  es_principal BOOLEAN DEFAULT FALSE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  INDEX idx_contactos_empresa (empresa_id)
);

-- Deals (negocios en pipeline por embudo de servicio)
CREATE TABLE IF NOT EXISTS deals (
  id INT AUTO_INCREMENT PRIMARY KEY,
  empresa_id INT NOT NULL,
  contacto_id INT NULL,
  embudo ENUM('web','sistemas','rec360') NOT NULL DEFAULT 'web',
  titulo VARCHAR(255) NOT NULL,
  plan ENUM('web','sistema','combo','custom') DEFAULT 'web',
  valor_mensual INT DEFAULT 0,
  etapa ENUM('nuevo','contactado','reunion','propuesta','negociacion','ganado','perdido') DEFAULT 'nuevo',
  probabilidad INT DEFAULT 10,
  fecha_cierre DATE NULL,
  origen VARCHAR(100),
  notas TEXT,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  FOREIGN KEY (contacto_id) REFERENCES contactos(id) ON DELETE SET NULL,
  INDEX idx_deals_embudo_etapa (embudo, etapa),
  INDEX idx_deals_empresa (empresa_id)
);

-- Actividades y recordatorios
CREATE TABLE IF NOT EXISTS actividades (
  id INT AUTO_INCREMENT PRIMARY KEY,
  empresa_id INT NULL,
  deal_id INT NULL,
  tipo ENUM('llamada','whatsapp','email','reunion','tarea') DEFAULT 'tarea',
  titulo VARCHAR(255) NOT NULL,
  detalle TEXT,
  fecha_vencimiento DATETIME NULL,
  hecha BOOLEAN DEFAULT FALSE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  FOREIGN KEY (deal_id) REFERENCES deals(id) ON DELETE CASCADE,
  INDEX idx_act_deal (deal_id),
  INDEX idx_act_venc (fecha_vencimiento, hecha)
);

-- Cotizaciones
CREATE TABLE IF NOT EXISTS cotizaciones (
  id INT AUTO_INCREMENT PRIMARY KEY,
  deal_id INT NULL,
  empresa_id INT NOT NULL,
  titulo VARCHAR(255) NOT NULL DEFAULT 'Propuesta NÃ©bula',
  items LONGTEXT NOT NULL,
  total_mensual INT DEFAULT 0,
  estado ENUM('borrador','enviada','aceptada','rechazada') DEFAULT 'borrador',
  notas TEXT,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (deal_id) REFERENCES deals(id) ON DELETE SET NULL,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  INDEX idx_cot_empresa (empresa_id)
);

-- Suscripciones (arriendo mensual por cliente)
CREATE TABLE IF NOT EXISTS suscripciones (
  id INT AUTO_INCREMENT PRIMARY KEY,
  empresa_id INT NOT NULL,
  deal_id INT NULL,
  plan ENUM('web','sistema','combo','custom') DEFAULT 'web',
  titulo VARCHAR(255) NOT NULL,
  valor_mensual INT DEFAULT 0,
  dia_cobro TINYINT DEFAULT 5,
  estado ENUM('activa','pausada','morosa','cancelada') DEFAULT 'activa',
  fecha_inicio DATE NOT NULL,
  fecha_fin DATE NULL,
  notas TEXT,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  FOREIGN KEY (deal_id) REFERENCES deals(id) ON DELETE SET NULL,
  INDEX idx_sus_empresa (empresa_id),
  INDEX idx_sus_estado (estado)
);

-- Cobros mensuales generados
CREATE TABLE IF NOT EXISTS cobros (
  id INT AUTO_INCREMENT PRIMARY KEY,
  suscripcion_id INT NOT NULL,
  periodo CHAR(7) NOT NULL COMMENT 'YYYY-MM',
  monto INT NOT NULL,
  estado ENUM('pendiente','pagado','vencido') DEFAULT 'pendiente',
  fecha_pago DATE NULL,
  metodo VARCHAR(50) NULL,
  notas TEXT,
  recordatorio_enviado DATETIME NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id) ON DELETE CASCADE,
  UNIQUE KEY uq_cobro_periodo (suscripcion_id, periodo),
  INDEX idx_cobros_estado (estado),
  INDEX idx_cobros_periodo (periodo)
);

-- Checklist de onboarding por suscripciÃ³n
CREATE TABLE IF NOT EXISTS onboarding_pasos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  suscripcion_id INT NOT NULL,
  titulo VARCHAR(255) NOT NULL,
  orden INT DEFAULT 0,
  hecho BOOLEAN DEFAULT FALSE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id) ON DELETE CASCADE,
  INDEX idx_onb_sus (suscripcion_id)
);

-- Tickets de soporte
CREATE TABLE IF NOT EXISTS tickets (
  id INT AUTO_INCREMENT PRIMARY KEY,
  empresa_id INT NOT NULL,
  suscripcion_id INT NULL,
  asunto VARCHAR(255) NOT NULL,
  detalle TEXT,
  tipo ENUM('cambio_contenido','soporte','mejora','reclamo') DEFAULT 'soporte',
  prioridad ENUM('baja','media','alta') DEFAULT 'media',
  estado ENUM('abierto','en_proceso','resuelto','cerrado') DEFAULT 'abierto',
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
  FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id) ON DELETE SET NULL,
  INDEX idx_tickets_empresa (empresa_id),
  INDEX idx_tickets_estado (estado)
);

-- Notificaciones (campanita)
CREATE TABLE IF NOT EXISTS notificaciones (
  id INT AUTO_INCREMENT PRIMARY KEY,
  clave VARCHAR(100) NULL UNIQUE COMMENT 'dedup: se ignora si ya existe',
  tipo ENUM('lead_web','ticket_nuevo','morosa','pago','ganado','recordatorio') NOT NULL,
  titulo VARCHAR(255) NOT NULL,
  detalle TEXT,
  link VARCHAR(255),
  leida BOOLEAN DEFAULT FALSE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_not_leida (leida, created_at)
);

-- o manualmente: INSERT INTO usuarios (nombre,email,password,rol)

-- Usuario administrador inicial
INSERT INTO usuarios (nombre, email, password, rol) VALUES ('Admin Nebula', 'contacto@agencianebula.cl', '$2y$10$8c/Gt.Aemp1hdWE5b91/xOjnC/kLyCnqMJWNhrUiwn.vha0VQ64fu', 'admin');

