diff --git a/schemas/01-construction-schema-ddl.sql b/schemas/01-construction-schema-ddl.sql index 470ebf9..510ffa9 100644 --- a/schemas/01-construction-schema-ddl.sql +++ b/schemas/01-construction-schema-ddl.sql @@ -552,6 +552,89 @@ CREATE TABLE IF NOT EXISTS construction.tickets_postventa ( CONSTRAINT uq_tickets_number_tenant UNIQUE (tenant_id, ticket_number) ); +-- Tabla: no_conformidades (no conformidades detectadas) +CREATE TABLE IF NOT EXISTS construction.no_conformidades ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL REFERENCES auth.tenants(id) ON DELETE CASCADE, + inspeccion_id UUID REFERENCES construction.inspecciones(id), + lote_id UUID REFERENCES construction.lotes(id), + nc_number VARCHAR(50) NOT NULL, + detection_date DATE NOT NULL, + category VARCHAR(100), + severity VARCHAR(20) NOT NULL DEFAULT 'minor', + description TEXT NOT NULL, + root_cause TEXT, + photo_url VARCHAR(500), + contractor_id UUID REFERENCES construction.subcontratistas(id), + status VARCHAR(20) NOT NULL DEFAULT 'open', + due_date DATE, + closed_at TIMESTAMPTZ, + closed_by UUID REFERENCES auth.users(id), + verified_at TIMESTAMPTZ, + verified_by UUID REFERENCES auth.users(id), + closure_photo_url VARCHAR(500), + closure_notes TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by UUID REFERENCES auth.users(id), + updated_at TIMESTAMPTZ, + updated_by UUID REFERENCES auth.users(id), + CONSTRAINT uq_nc_number_tenant UNIQUE (tenant_id, nc_number), + CONSTRAINT chk_nc_severity CHECK (severity IN ('minor', 'major', 'critical')), + CONSTRAINT chk_nc_status CHECK (status IN ('open', 'in_progress', 'closed', 'verified')) +); + +-- Tabla: acciones_correctivas (CAPA) +CREATE TABLE IF NOT EXISTS construction.acciones_correctivas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL REFERENCES auth.tenants(id) ON DELETE CASCADE, + no_conformidad_id UUID NOT NULL REFERENCES construction.no_conformidades(id) ON DELETE CASCADE, + action_type VARCHAR(20) NOT NULL DEFAULT 'corrective', + description TEXT NOT NULL, + responsible_id UUID NOT NULL REFERENCES auth.users(id), + due_date DATE NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'pending', + completed_at TIMESTAMPTZ, + completion_notes TEXT, + verified_at TIMESTAMPTZ, + verified_by UUID REFERENCES auth.users(id), + effectiveness_verified BOOLEAN DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by UUID REFERENCES auth.users(id), + updated_at TIMESTAMPTZ, + updated_by UUID REFERENCES auth.users(id), + CONSTRAINT chk_action_type CHECK (action_type IN ('corrective', 'preventive', 'improvement')), + CONSTRAINT chk_action_status CHECK (status IN ('pending', 'in_progress', 'completed', 'verified')) +); + +-- Tabla: ticket_asignaciones (asignaciones de tickets a técnicos) +CREATE TABLE IF NOT EXISTS construction.ticket_asignaciones ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id UUID NOT NULL REFERENCES auth.tenants(id) ON DELETE CASCADE, + ticket_id UUID NOT NULL REFERENCES construction.tickets_postventa(id) ON DELETE CASCADE, + technician_id UUID NOT NULL REFERENCES auth.users(id), + assigned_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + assigned_by UUID NOT NULL REFERENCES auth.users(id), + status VARCHAR(20) NOT NULL DEFAULT 'assigned', + accepted_at TIMESTAMPTZ, + scheduled_date DATE, + scheduled_time TIME, + completed_at TIMESTAMPTZ, + work_notes TEXT, + reassignment_reason TEXT, + is_current BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ, + CONSTRAINT chk_assignment_status CHECK (status IN ('assigned', 'accepted', 'in_progress', 'completed', 'reassigned')) +); + +-- Indices adicionales para calidad +CREATE INDEX IF NOT EXISTS idx_no_conformidades_tenant ON construction.no_conformidades(tenant_id); +CREATE INDEX IF NOT EXISTS idx_no_conformidades_status ON construction.no_conformidades(status); +CREATE INDEX IF NOT EXISTS idx_no_conformidades_inspeccion ON construction.no_conformidades(inspeccion_id); +CREATE INDEX IF NOT EXISTS idx_acciones_correctivas_nc ON construction.acciones_correctivas(no_conformidad_id); +CREATE INDEX IF NOT EXISTS idx_ticket_asignaciones_ticket ON construction.ticket_asignaciones(ticket_id); +CREATE INDEX IF NOT EXISTS idx_ticket_asignaciones_technician ON construction.ticket_asignaciones(technician_id); + -- ============================================================================ -- TABLES - CONTRATOS Y SUBCONTRATOS (MAI-012) -- ============================================================================