-- =============================================================
-- ARCHIVO: 50-financial-schema.sql
-- DESCRIPCION: Schema de contabilidad financiera y tipos enumerados
-- VERSION: 1.0.0
-- PROYECTO: ERP-Core V2
-- FECHA: 2026-01-20
-- DEPENDE DE: Ninguno (define el schema base)
-- =============================================================

-- =====================
-- SCHEMA: financial
-- Schema para modulo de contabilidad general
-- =====================
CREATE SCHEMA IF NOT EXISTS financial;

-- =====================
-- EXTENSIONES REQUERIDAS
-- =====================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- =====================
-- TIPOS ENUMERADOS
-- =====================

-- Tipo de cuenta contable (activo, pasivo, capital, ingreso, gasto)
DO $$ BEGIN
    CREATE TYPE financial.account_type_enum AS ENUM (
        'asset',      -- Activo
        'liability',  -- Pasivo
        'equity',     -- Capital/Patrimonio
        'income',     -- Ingreso
        'expense'     -- Gasto
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Tipo de diario contable
DO $$ BEGIN
    CREATE TYPE financial.journal_type_enum AS ENUM (
        'sale',       -- Ventas
        'purchase',   -- Compras
        'cash',       -- Caja
        'bank',       -- Banco
        'general'     -- General
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Estado de asiento contable
DO $$ BEGIN
    CREATE TYPE financial.entry_status_enum AS ENUM (
        'draft',      -- Borrador
        'posted',     -- Publicado/Contabilizado
        'cancelled'   -- Cancelado
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Estado de periodo fiscal
DO $$ BEGIN
    CREATE TYPE financial.period_status_enum AS ENUM (
        'open',       -- Abierto
        'closed'      -- Cerrado
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Tipo de factura
DO $$ BEGIN
    CREATE TYPE financial.invoice_type_enum AS ENUM (
        'customer',   -- Factura de cliente (venta)
        'supplier'    -- Factura de proveedor (compra)
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Estado de factura
DO $$ BEGIN
    CREATE TYPE financial.invoice_status_enum AS ENUM (
        'draft',      -- Borrador
        'open',       -- Abierta/Validada
        'paid',       -- Pagada
        'cancelled'   -- Cancelada
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Tipo de pago
DO $$ BEGIN
    CREATE TYPE financial.payment_type_enum AS ENUM (
        'inbound',    -- Entrada (cobro)
        'outbound'    -- Salida (pago)
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Metodo de pago
DO $$ BEGIN
    CREATE TYPE financial.payment_method_enum AS ENUM (
        'cash',           -- Efectivo
        'bank_transfer',  -- Transferencia bancaria
        'check',          -- Cheque
        'card',           -- Tarjeta
        'other'           -- Otro
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Estado de pago
DO $$ BEGIN
    CREATE TYPE financial.payment_status_enum AS ENUM (
        'draft',      -- Borrador
        'posted',     -- Contabilizado
        'reconciled', -- Conciliado
        'cancelled'   -- Cancelado
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- Tipo de impuesto
DO $$ BEGIN
    CREATE TYPE financial.tax_type_enum AS ENUM (
        'sales',      -- Solo ventas
        'purchase',   -- Solo compras
        'all'         -- Ambos (ventas y compras)
    );
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

-- =====================
-- COMENTARIOS DEL SCHEMA
-- =====================
COMMENT ON SCHEMA financial IS 'Schema para el modulo de contabilidad general: plan de cuentas, diarios, asientos, facturas financieras y pagos';

COMMENT ON TYPE financial.account_type_enum IS 'Clasificacion de cuentas contables: activo, pasivo, capital, ingreso, gasto';
COMMENT ON TYPE financial.journal_type_enum IS 'Tipo de diario contable: ventas, compras, caja, banco, general';
COMMENT ON TYPE financial.entry_status_enum IS 'Estado del asiento contable: borrador, publicado, cancelado';
COMMENT ON TYPE financial.period_status_enum IS 'Estado del periodo fiscal: abierto, cerrado';
COMMENT ON TYPE financial.invoice_type_enum IS 'Tipo de factura financiera: cliente (venta), proveedor (compra)';
COMMENT ON TYPE financial.invoice_status_enum IS 'Estado de factura: borrador, abierta, pagada, cancelada';
COMMENT ON TYPE financial.payment_type_enum IS 'Direccion del pago: inbound (cobro), outbound (pago)';
COMMENT ON TYPE financial.payment_method_enum IS 'Metodo de pago: efectivo, transferencia, cheque, tarjeta, otro';
COMMENT ON TYPE financial.payment_status_enum IS 'Estado del pago: borrador, contabilizado, conciliado, cancelado';
COMMENT ON TYPE financial.tax_type_enum IS 'Aplicacion del impuesto: ventas, compras, ambos';
