From b682fdaaf3e4becfe41932bc48d7c1156f871524 Mon Sep 17 00:00:00 2001 From: Adrian Flores Cortes Date: Sat, 31 Jan 2026 00:12:13 -0600 Subject: [PATCH] [RBAC-001] feat: Add permissions seed for complete RBAC system - Add 07a-permissions-seed.sql with ~150 permissions covering all ERP modules - Permissions for: auth, billing, inventory, sales, purchases, partners, products, financial, hr, crm, projects, reports, system - Add new roles: accountant, sales, warehouse - Map ERP profiles to roles Co-Authored-By: Claude Opus 4.5 --- ddl/07a-permissions-seed.sql | 396 +++++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 ddl/07a-permissions-seed.sql diff --git a/ddl/07a-permissions-seed.sql b/ddl/07a-permissions-seed.sql new file mode 100644 index 0000000..6aaf563 --- /dev/null +++ b/ddl/07a-permissions-seed.sql @@ -0,0 +1,396 @@ +-- ============================================================= +-- ARCHIVO: 07a-permissions-seed.sql +-- DESCRIPCION: Seed de permisos para sistema RBAC completo +-- VERSION: 1.0.0 +-- PROYECTO: ERP-Core V2 +-- FECHA: 2026-01-30 +-- EPIC: SAAS-CORE-AUTH (EPIC-SAAS-001) +-- TAREA: Propagacion RBAC template-saas a erp-core +-- ============================================================= + +-- ===================== +-- PERMISOS ADICIONALES ERP +-- ===================== + +-- Nota: El archivo 07-users-rbac.sql ya contiene permisos base de auth. +-- Este archivo extiende con permisos especificos de ERP. + +-- ===================== +-- MODULO: AUTH (adicionales) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('users', 'activate', 'tenant', 'Activar usuarios', 'Activar usuarios suspendidos', 'auth'), +('users', 'deactivate', 'tenant', 'Desactivar usuarios', 'Suspender usuarios', 'auth'), +('users', 'export', 'tenant', 'Exportar usuarios', 'Exportar lista de usuarios', 'auth'), +('permissions', 'read', 'tenant', 'Ver permisos', 'Ver catalogo de permisos', 'auth'), +('permissions', 'update', 'tenant', 'Modificar permisos', 'Modificar asignacion de permisos a roles', 'auth'), +('api_keys', 'create', 'tenant', 'Crear API keys', 'Crear claves de API', 'auth'), +('api_keys', 'read', 'tenant', 'Ver API keys', 'Ver claves de API', 'auth'), +('api_keys', 'delete', 'tenant', 'Eliminar API keys', 'Revocar claves de API', 'auth'), +('sessions', 'read', 'tenant', 'Ver sesiones', 'Ver sesiones activas de usuarios', 'auth'), +('sessions', 'delete', 'tenant', 'Cerrar sesiones', 'Forzar cierre de sesiones', 'auth') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: BILLING (facturacion) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('invoices', 'create', 'tenant', 'Crear facturas', 'Crear nuevas facturas', 'billing'), +('invoices', 'update', 'tenant', 'Editar facturas', 'Modificar facturas en borrador', 'billing'), +('invoices', 'delete', 'tenant', 'Eliminar facturas', 'Eliminar facturas en borrador', 'billing'), +('invoices', 'validate', 'tenant', 'Validar facturas', 'Timbrar facturas CFDI', 'billing'), +('invoices', 'cancel', 'tenant', 'Cancelar facturas', 'Cancelar facturas timbradas', 'billing'), +('payments', 'create', 'tenant', 'Registrar pagos', 'Registrar pagos recibidos', 'billing'), +('payments', 'read', 'tenant', 'Ver pagos', 'Ver historial de pagos', 'billing'), +('payments', 'update', 'tenant', 'Editar pagos', 'Modificar pagos no aplicados', 'billing'), +('payments', 'delete', 'tenant', 'Eliminar pagos', 'Eliminar pagos no aplicados', 'billing'), +('payments', 'apply', 'tenant', 'Aplicar pagos', 'Aplicar pagos a facturas', 'billing'), +('credit_notes', 'create', 'tenant', 'Crear notas de credito', 'Crear notas de credito', 'billing'), +('credit_notes', 'read', 'tenant', 'Ver notas de credito', 'Ver notas de credito', 'billing'), +('credit_notes', 'validate', 'tenant', 'Validar notas de credito', 'Timbrar notas de credito', 'billing'), +('credit_notes', 'cancel', 'tenant', 'Cancelar notas de credito', 'Cancelar notas de credito', 'billing') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: INVENTORY (inventario) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('inventory', 'read', 'tenant', 'Ver inventario', 'Ver stock de productos', 'inventory'), +('inventory', 'update', 'tenant', 'Actualizar inventario', 'Modificar cantidades', 'inventory'), +('inventory', 'adjust', 'tenant', 'Ajustar inventario', 'Realizar ajustes de inventario', 'inventory'), +('inventory', 'transfer', 'tenant', 'Transferir inventario', 'Transferir entre almacenes', 'inventory'), +('inventory', 'export', 'tenant', 'Exportar inventario', 'Exportar reporte de inventario', 'inventory'), +('warehouses', 'create', 'tenant', 'Crear almacenes', 'Crear nuevos almacenes', 'inventory'), +('warehouses', 'read', 'tenant', 'Ver almacenes', 'Ver lista de almacenes', 'inventory'), +('warehouses', 'update', 'tenant', 'Editar almacenes', 'Modificar configuracion de almacenes', 'inventory'), +('warehouses', 'delete', 'tenant', 'Eliminar almacenes', 'Eliminar almacenes vacios', 'inventory'), +('stock_moves', 'create', 'tenant', 'Crear movimientos', 'Registrar entradas/salidas', 'inventory'), +('stock_moves', 'read', 'tenant', 'Ver movimientos', 'Ver historial de movimientos', 'inventory'), +('stock_moves', 'validate', 'tenant', 'Validar movimientos', 'Aprobar movimientos pendientes', 'inventory'), +('stock_moves', 'cancel', 'tenant', 'Cancelar movimientos', 'Cancelar movimientos no aplicados', 'inventory'), +('stock_count', 'create', 'tenant', 'Crear conteos', 'Iniciar conteo de inventario', 'inventory'), +('stock_count', 'read', 'tenant', 'Ver conteos', 'Ver conteos de inventario', 'inventory'), +('stock_count', 'update', 'tenant', 'Editar conteos', 'Registrar cantidades contadas', 'inventory'), +('stock_count', 'validate', 'tenant', 'Validar conteos', 'Aprobar conteos y aplicar ajustes', 'inventory') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: SALES (ventas) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('sales', 'create', 'tenant', 'Crear ventas', 'Crear ordenes de venta', 'sales'), +('sales', 'read', 'tenant', 'Ver ventas', 'Ver ordenes de venta', 'sales'), +('sales', 'read', 'own', 'Ver mis ventas', 'Ver solo ventas propias', 'sales'), +('sales', 'update', 'tenant', 'Editar ventas', 'Modificar ordenes de venta', 'sales'), +('sales', 'delete', 'tenant', 'Eliminar ventas', 'Eliminar ventas en borrador', 'sales'), +('sales', 'approve', 'tenant', 'Aprobar ventas', 'Aprobar ordenes de venta', 'sales'), +('sales', 'cancel', 'tenant', 'Cancelar ventas', 'Cancelar ordenes de venta', 'sales'), +('sales', 'export', 'tenant', 'Exportar ventas', 'Exportar reportes de ventas', 'sales'), +('quotations', 'create', 'tenant', 'Crear cotizaciones', 'Crear cotizaciones', 'sales'), +('quotations', 'read', 'tenant', 'Ver cotizaciones', 'Ver cotizaciones', 'sales'), +('quotations', 'read', 'own', 'Ver mis cotizaciones', 'Ver solo cotizaciones propias', 'sales'), +('quotations', 'update', 'tenant', 'Editar cotizaciones', 'Modificar cotizaciones', 'sales'), +('quotations', 'delete', 'tenant', 'Eliminar cotizaciones', 'Eliminar cotizaciones', 'sales'), +('quotations', 'convert', 'tenant', 'Convertir cotizaciones', 'Convertir cotizacion a venta', 'sales'), +('pos', 'access', 'tenant', 'Acceder a POS', 'Acceder al punto de venta', 'sales'), +('pos', 'refund', 'tenant', 'Hacer devoluciones POS', 'Procesar devoluciones en POS', 'sales'), +('pos', 'discount', 'tenant', 'Aplicar descuentos POS', 'Aplicar descuentos en POS', 'sales') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: PURCHASES (compras) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('purchases', 'create', 'tenant', 'Crear compras', 'Crear ordenes de compra', 'purchases'), +('purchases', 'read', 'tenant', 'Ver compras', 'Ver ordenes de compra', 'purchases'), +('purchases', 'update', 'tenant', 'Editar compras', 'Modificar ordenes de compra', 'purchases'), +('purchases', 'delete', 'tenant', 'Eliminar compras', 'Eliminar compras en borrador', 'purchases'), +('purchases', 'approve', 'tenant', 'Aprobar compras', 'Aprobar ordenes de compra', 'purchases'), +('purchases', 'cancel', 'tenant', 'Cancelar compras', 'Cancelar ordenes de compra', 'purchases'), +('purchases', 'receive', 'tenant', 'Recibir compras', 'Registrar recepcion de mercancia', 'purchases'), +('purchases', 'export', 'tenant', 'Exportar compras', 'Exportar reportes de compras', 'purchases'), +('purchase_orders', 'create', 'tenant', 'Crear requisiciones', 'Crear ordenes de compra internas', 'purchases'), +('purchase_orders', 'read', 'tenant', 'Ver requisiciones', 'Ver requisiciones', 'purchases'), +('purchase_orders', 'update', 'tenant', 'Editar requisiciones', 'Modificar requisiciones', 'purchases'), +('purchase_orders', 'approve', 'tenant', 'Aprobar requisiciones', 'Aprobar requisiciones', 'purchases'), +('purchase_orders', 'reject', 'tenant', 'Rechazar requisiciones', 'Rechazar requisiciones', 'purchases'), +('supplier_invoices', 'create', 'tenant', 'Registrar facturas proveedor', 'Registrar facturas de proveedor', 'purchases'), +('supplier_invoices', 'read', 'tenant', 'Ver facturas proveedor', 'Ver facturas de proveedor', 'purchases'), +('supplier_invoices', 'validate', 'tenant', 'Validar facturas proveedor', 'Aprobar facturas de proveedor', 'purchases') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: PARTNERS (clientes/proveedores) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('partners', 'create', 'tenant', 'Crear contactos', 'Crear clientes/proveedores', 'partners'), +('partners', 'read', 'tenant', 'Ver contactos', 'Ver clientes/proveedores', 'partners'), +('partners', 'update', 'tenant', 'Editar contactos', 'Modificar clientes/proveedores', 'partners'), +('partners', 'delete', 'tenant', 'Eliminar contactos', 'Eliminar clientes/proveedores', 'partners'), +('partners', 'export', 'tenant', 'Exportar contactos', 'Exportar lista de contactos', 'partners'), +('customers', 'create', 'tenant', 'Crear clientes', 'Crear nuevos clientes', 'partners'), +('customers', 'read', 'tenant', 'Ver clientes', 'Ver lista de clientes', 'partners'), +('customers', 'update', 'tenant', 'Editar clientes', 'Modificar datos de clientes', 'partners'), +('customers', 'delete', 'tenant', 'Eliminar clientes', 'Eliminar clientes', 'partners'), +('suppliers', 'create', 'tenant', 'Crear proveedores', 'Crear nuevos proveedores', 'partners'), +('suppliers', 'read', 'tenant', 'Ver proveedores', 'Ver lista de proveedores', 'partners'), +('suppliers', 'update', 'tenant', 'Editar proveedores', 'Modificar datos de proveedores', 'partners'), +('suppliers', 'delete', 'tenant', 'Eliminar proveedores', 'Eliminar proveedores', 'partners'), +('contacts', 'create', 'tenant', 'Crear contactos adicionales', 'Agregar contactos a partners', 'partners'), +('contacts', 'read', 'tenant', 'Ver contactos adicionales', 'Ver contactos de partners', 'partners'), +('contacts', 'update', 'tenant', 'Editar contactos adicionales', 'Modificar contactos de partners', 'partners'), +('contacts', 'delete', 'tenant', 'Eliminar contactos adicionales', 'Eliminar contactos de partners', 'partners') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: PRODUCTS (productos) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('products', 'create', 'tenant', 'Crear productos', 'Crear nuevos productos', 'products'), +('products', 'read', 'tenant', 'Ver productos', 'Ver catalogo de productos', 'products'), +('products', 'update', 'tenant', 'Editar productos', 'Modificar productos', 'products'), +('products', 'delete', 'tenant', 'Eliminar productos', 'Eliminar productos', 'products'), +('products', 'export', 'tenant', 'Exportar productos', 'Exportar catalogo de productos', 'products'), +('products', 'import', 'tenant', 'Importar productos', 'Importar productos masivamente', 'products'), +('categories', 'create', 'tenant', 'Crear categorias', 'Crear categorias de productos', 'products'), +('categories', 'read', 'tenant', 'Ver categorias', 'Ver categorias de productos', 'products'), +('categories', 'update', 'tenant', 'Editar categorias', 'Modificar categorias', 'products'), +('categories', 'delete', 'tenant', 'Eliminar categorias', 'Eliminar categorias', 'products'), +('price_lists', 'create', 'tenant', 'Crear listas de precios', 'Crear listas de precios', 'products'), +('price_lists', 'read', 'tenant', 'Ver listas de precios', 'Ver listas de precios', 'products'), +('price_lists', 'update', 'tenant', 'Editar listas de precios', 'Modificar listas de precios', 'products'), +('price_lists', 'delete', 'tenant', 'Eliminar listas de precios', 'Eliminar listas de precios', 'products') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: FINANCIAL (contabilidad) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('accounts', 'create', 'tenant', 'Crear cuentas', 'Crear cuentas contables', 'financial'), +('accounts', 'read', 'tenant', 'Ver cuentas', 'Ver catalogo de cuentas', 'financial'), +('accounts', 'update', 'tenant', 'Editar cuentas', 'Modificar cuentas contables', 'financial'), +('accounts', 'delete', 'tenant', 'Eliminar cuentas', 'Eliminar cuentas sin movimientos', 'financial'), +('journal_entries', 'create', 'tenant', 'Crear polizas', 'Crear polizas contables', 'financial'), +('journal_entries', 'read', 'tenant', 'Ver polizas', 'Ver polizas contables', 'financial'), +('journal_entries', 'update', 'tenant', 'Editar polizas', 'Modificar polizas en borrador', 'financial'), +('journal_entries', 'delete', 'tenant', 'Eliminar polizas', 'Eliminar polizas en borrador', 'financial'), +('journal_entries', 'post', 'tenant', 'Contabilizar polizas', 'Contabilizar polizas', 'financial'), +('journal_entries', 'reverse', 'tenant', 'Reversar polizas', 'Crear polizas de reverso', 'financial'), +('fiscal_periods', 'create', 'tenant', 'Crear periodos fiscales', 'Crear periodos contables', 'financial'), +('fiscal_periods', 'read', 'tenant', 'Ver periodos fiscales', 'Ver periodos contables', 'financial'), +('fiscal_periods', 'close', 'tenant', 'Cerrar periodos', 'Cerrar periodos contables', 'financial'), +('fiscal_periods', 'reopen', 'tenant', 'Reabrir periodos', 'Reabrir periodos cerrados', 'financial'), +('bank_reconciliation', 'create', 'tenant', 'Crear conciliaciones', 'Crear conciliaciones bancarias', 'financial'), +('bank_reconciliation', 'read', 'tenant', 'Ver conciliaciones', 'Ver conciliaciones bancarias', 'financial'), +('bank_reconciliation', 'update', 'tenant', 'Editar conciliaciones', 'Modificar conciliaciones', 'financial'), +('bank_reconciliation', 'validate', 'tenant', 'Validar conciliaciones', 'Aprobar conciliaciones', 'financial'), +('cost_centers', 'create', 'tenant', 'Crear centros de costo', 'Crear centros de costo', 'financial'), +('cost_centers', 'read', 'tenant', 'Ver centros de costo', 'Ver centros de costo', 'financial'), +('cost_centers', 'update', 'tenant', 'Editar centros de costo', 'Modificar centros de costo', 'financial'), +('cost_centers', 'delete', 'tenant', 'Eliminar centros de costo', 'Eliminar centros de costo', 'financial'), +('budgets', 'create', 'tenant', 'Crear presupuestos', 'Crear presupuestos', 'financial'), +('budgets', 'read', 'tenant', 'Ver presupuestos', 'Ver presupuestos', 'financial'), +('budgets', 'update', 'tenant', 'Editar presupuestos', 'Modificar presupuestos', 'financial'), +('budgets', 'approve', 'tenant', 'Aprobar presupuestos', 'Aprobar presupuestos', 'financial') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: HR (recursos humanos) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('employees', 'create', 'tenant', 'Crear empleados', 'Crear registros de empleados', 'hr'), +('employees', 'read', 'tenant', 'Ver empleados', 'Ver informacion de empleados', 'hr'), +('employees', 'update', 'tenant', 'Editar empleados', 'Modificar datos de empleados', 'hr'), +('employees', 'delete', 'tenant', 'Eliminar empleados', 'Dar de baja empleados', 'hr'), +('employees', 'export', 'tenant', 'Exportar empleados', 'Exportar lista de empleados', 'hr'), +('payroll', 'create', 'tenant', 'Crear nominas', 'Crear periodos de nomina', 'hr'), +('payroll', 'read', 'tenant', 'Ver nominas', 'Ver nominas', 'hr'), +('payroll', 'update', 'tenant', 'Editar nominas', 'Modificar nominas en borrador', 'hr'), +('payroll', 'approve', 'tenant', 'Aprobar nominas', 'Aprobar nominas para pago', 'hr'), +('payroll', 'export', 'tenant', 'Exportar nominas', 'Exportar reportes de nomina', 'hr'), +('attendance', 'create', 'tenant', 'Registrar asistencia', 'Registrar entradas/salidas', 'hr'), +('attendance', 'read', 'tenant', 'Ver asistencia', 'Ver registros de asistencia', 'hr'), +('attendance', 'read', 'own', 'Ver mi asistencia', 'Ver asistencia propia', 'hr'), +('attendance', 'update', 'tenant', 'Editar asistencia', 'Modificar registros de asistencia', 'hr'), +('attendance', 'approve', 'tenant', 'Aprobar asistencia', 'Aprobar ajustes de asistencia', 'hr'), +('leaves', 'create', 'tenant', 'Crear ausencias', 'Registrar solicitudes de ausencia', 'hr'), +('leaves', 'read', 'tenant', 'Ver ausencias', 'Ver solicitudes de ausencia', 'hr'), +('leaves', 'read', 'own', 'Ver mis ausencias', 'Ver ausencias propias', 'hr'), +('leaves', 'approve', 'tenant', 'Aprobar ausencias', 'Aprobar solicitudes de ausencia', 'hr'), +('contracts', 'create', 'tenant', 'Crear contratos', 'Crear contratos laborales', 'hr'), +('contracts', 'read', 'tenant', 'Ver contratos', 'Ver contratos laborales', 'hr'), +('contracts', 'update', 'tenant', 'Editar contratos', 'Modificar contratos', 'hr'), +('departments', 'create', 'tenant', 'Crear departamentos', 'Crear departamentos', 'hr'), +('departments', 'read', 'tenant', 'Ver departamentos', 'Ver departamentos', 'hr'), +('departments', 'update', 'tenant', 'Editar departamentos', 'Modificar departamentos', 'hr'), +('departments', 'delete', 'tenant', 'Eliminar departamentos', 'Eliminar departamentos', 'hr'), +('positions', 'create', 'tenant', 'Crear puestos', 'Crear puestos de trabajo', 'hr'), +('positions', 'read', 'tenant', 'Ver puestos', 'Ver puestos de trabajo', 'hr'), +('positions', 'update', 'tenant', 'Editar puestos', 'Modificar puestos', 'hr'), +('positions', 'delete', 'tenant', 'Eliminar puestos', 'Eliminar puestos', 'hr') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: CRM +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('leads', 'create', 'tenant', 'Crear leads', 'Crear prospectos', 'crm'), +('leads', 'read', 'tenant', 'Ver leads', 'Ver prospectos', 'crm'), +('leads', 'read', 'own', 'Ver mis leads', 'Ver prospectos propios', 'crm'), +('leads', 'update', 'tenant', 'Editar leads', 'Modificar prospectos', 'crm'), +('leads', 'delete', 'tenant', 'Eliminar leads', 'Eliminar prospectos', 'crm'), +('leads', 'convert', 'tenant', 'Convertir leads', 'Convertir prospecto a cliente', 'crm'), +('leads', 'assign', 'tenant', 'Asignar leads', 'Asignar prospectos a vendedores', 'crm'), +('opportunities', 'create', 'tenant', 'Crear oportunidades', 'Crear oportunidades de venta', 'crm'), +('opportunities', 'read', 'tenant', 'Ver oportunidades', 'Ver oportunidades', 'crm'), +('opportunities', 'read', 'own', 'Ver mis oportunidades', 'Ver oportunidades propias', 'crm'), +('opportunities', 'update', 'tenant', 'Editar oportunidades', 'Modificar oportunidades', 'crm'), +('opportunities', 'delete', 'tenant', 'Eliminar oportunidades', 'Eliminar oportunidades', 'crm'), +('opportunities', 'close', 'tenant', 'Cerrar oportunidades', 'Cerrar oportunidades ganadas/perdidas', 'crm'), +('activities', 'create', 'tenant', 'Crear actividades', 'Crear tareas y actividades CRM', 'crm'), +('activities', 'read', 'tenant', 'Ver actividades', 'Ver actividades', 'crm'), +('activities', 'read', 'own', 'Ver mis actividades', 'Ver actividades propias', 'crm'), +('activities', 'update', 'tenant', 'Editar actividades', 'Modificar actividades', 'crm'), +('activities', 'delete', 'tenant', 'Eliminar actividades', 'Eliminar actividades', 'crm'), +('campaigns', 'create', 'tenant', 'Crear campanas', 'Crear campanas de marketing', 'crm'), +('campaigns', 'read', 'tenant', 'Ver campanas', 'Ver campanas', 'crm'), +('campaigns', 'update', 'tenant', 'Editar campanas', 'Modificar campanas', 'crm'), +('campaigns', 'delete', 'tenant', 'Eliminar campanas', 'Eliminar campanas', 'crm') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: PROJECTS (proyectos) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('projects', 'create', 'tenant', 'Crear proyectos', 'Crear proyectos', 'projects'), +('projects', 'read', 'tenant', 'Ver proyectos', 'Ver proyectos', 'projects'), +('projects', 'read', 'own', 'Ver mis proyectos', 'Ver proyectos asignados', 'projects'), +('projects', 'update', 'tenant', 'Editar proyectos', 'Modificar proyectos', 'projects'), +('projects', 'delete', 'tenant', 'Eliminar proyectos', 'Eliminar proyectos', 'projects'), +('projects', 'close', 'tenant', 'Cerrar proyectos', 'Cerrar proyectos completados', 'projects'), +('tasks', 'create', 'tenant', 'Crear tareas', 'Crear tareas de proyecto', 'projects'), +('tasks', 'read', 'tenant', 'Ver tareas', 'Ver tareas', 'projects'), +('tasks', 'read', 'own', 'Ver mis tareas', 'Ver tareas asignadas', 'projects'), +('tasks', 'update', 'tenant', 'Editar tareas', 'Modificar tareas', 'projects'), +('tasks', 'delete', 'tenant', 'Eliminar tareas', 'Eliminar tareas', 'projects'), +('tasks', 'assign', 'tenant', 'Asignar tareas', 'Asignar tareas a usuarios', 'projects'), +('timesheets', 'create', 'tenant', 'Registrar tiempo', 'Registrar horas trabajadas', 'projects'), +('timesheets', 'read', 'tenant', 'Ver tiempos', 'Ver registros de tiempo', 'projects'), +('timesheets', 'read', 'own', 'Ver mis tiempos', 'Ver tiempo propio', 'projects'), +('timesheets', 'update', 'tenant', 'Editar tiempos', 'Modificar registros de tiempo', 'projects'), +('timesheets', 'approve', 'tenant', 'Aprobar tiempos', 'Aprobar registros de tiempo', 'projects') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: REPORTS (reportes) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('reports', 'read', 'tenant', 'Ver reportes', 'Acceder a reportes', 'reports'), +('reports', 'export', 'tenant', 'Exportar reportes', 'Exportar reportes a Excel/PDF', 'reports'), +('reports_sales', 'read', 'tenant', 'Ver reportes ventas', 'Acceder a reportes de ventas', 'reports'), +('reports_purchases', 'read', 'tenant', 'Ver reportes compras', 'Acceder a reportes de compras', 'reports'), +('reports_inventory', 'read', 'tenant', 'Ver reportes inventario', 'Acceder a reportes de inventario', 'reports'), +('reports_financial', 'read', 'tenant', 'Ver reportes contables', 'Acceder a reportes financieros', 'reports'), +('reports_hr', 'read', 'tenant', 'Ver reportes RRHH', 'Acceder a reportes de RRHH', 'reports'), +('dashboards', 'read', 'tenant', 'Ver dashboards', 'Acceder a dashboards', 'reports'), +('dashboards', 'create', 'tenant', 'Crear dashboards', 'Crear dashboards personalizados', 'reports'), +('dashboards', 'update', 'tenant', 'Editar dashboards', 'Modificar dashboards', 'reports') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MODULO: SYSTEM (sistema) +-- ===================== +INSERT INTO users.permissions (resource, action, scope, display_name, description, category) VALUES +('system', 'manage', 'global', 'Administrar sistema', 'Acceso total al sistema', 'system'), +('settings', 'read', 'tenant', 'Ver configuracion', 'Ver configuracion del sistema', 'system'), +('settings', 'update', 'tenant', 'Editar configuracion', 'Modificar configuracion', 'system'), +('integrations', 'create', 'tenant', 'Crear integraciones', 'Configurar integraciones', 'system'), +('integrations', 'read', 'tenant', 'Ver integraciones', 'Ver integraciones', 'system'), +('integrations', 'update', 'tenant', 'Editar integraciones', 'Modificar integraciones', 'system'), +('integrations', 'delete', 'tenant', 'Eliminar integraciones', 'Eliminar integraciones', 'system'), +('webhooks', 'create', 'tenant', 'Crear webhooks', 'Configurar webhooks', 'system'), +('webhooks', 'read', 'tenant', 'Ver webhooks', 'Ver webhooks', 'system'), +('webhooks', 'update', 'tenant', 'Editar webhooks', 'Modificar webhooks', 'system'), +('webhooks', 'delete', 'tenant', 'Eliminar webhooks', 'Eliminar webhooks', 'system'), +('imports', 'create', 'tenant', 'Ejecutar importaciones', 'Importar datos masivamente', 'system'), +('imports', 'read', 'tenant', 'Ver importaciones', 'Ver historial de importaciones', 'system'), +('exports', 'create', 'tenant', 'Ejecutar exportaciones', 'Exportar datos masivamente', 'system'), +('exports', 'read', 'tenant', 'Ver exportaciones', 'Ver historial de exportaciones', 'system') +ON CONFLICT DO NOTHING; + +-- ===================== +-- ASIGNACION DE PERMISOS A ROLES BASE +-- ===================== + +-- Rol: admin (todo excepto system:manage) +INSERT INTO users.role_permissions (role_id, permission_id) +SELECT '10000000-0000-0000-0000-000000000002', p.id +FROM users.permissions p +WHERE NOT (p.resource = 'system' AND p.action = 'manage') +ON CONFLICT DO NOTHING; + +-- Rol: manager (CRUD en areas operativas) +INSERT INTO users.role_permissions (role_id, permission_id) +SELECT '10000000-0000-0000-0000-000000000003', p.id +FROM users.permissions p +WHERE p.category IN ('sales', 'purchases', 'partners', 'inventory', 'products', 'crm', 'projects') + OR (p.category = 'billing' AND p.action IN ('read', 'create', 'update')) + OR (p.category = 'reports' AND p.action = 'read') + OR (p.category = 'hr' AND p.action = 'read' AND p.scope = 'tenant') +ON CONFLICT DO NOTHING; + +-- Rol: accountant (nuevo rol para contadores) +INSERT INTO users.roles (id, tenant_id, name, display_name, description, is_system, hierarchy_level, icon, color) +VALUES ('10000000-0000-0000-0000-000000000006', NULL, 'accountant', 'Contador', 'Acceso completo a facturacion y contabilidad', TRUE, 2, 'calculator', '#059669') +ON CONFLICT DO NOTHING; + +INSERT INTO users.role_permissions (role_id, permission_id) +SELECT '10000000-0000-0000-0000-000000000006', p.id +FROM users.permissions p +WHERE p.category IN ('billing', 'financial') + OR (p.category = 'invoices') + OR (p.category = 'reports' AND p.resource IN ('reports', 'reports_financial')) +ON CONFLICT DO NOTHING; + +-- Rol: sales (vendedor) +INSERT INTO users.roles (id, tenant_id, name, display_name, description, is_system, hierarchy_level, icon, color) +VALUES ('10000000-0000-0000-0000-000000000007', NULL, 'sales', 'Vendedor', 'Rol de vendedor con acceso a clientes y ventas', TRUE, 3, 'shopping-cart', '#8b5cf6') +ON CONFLICT DO NOTHING; + +INSERT INTO users.role_permissions (role_id, permission_id) +SELECT '10000000-0000-0000-0000-000000000007', p.id +FROM users.permissions p +WHERE (p.resource = 'customers' AND p.action IN ('create', 'read', 'update')) + OR (p.resource IN ('sales', 'quotations') AND p.scope = 'own') + OR (p.resource IN ('sales', 'quotations') AND p.action IN ('create', 'read', 'update')) + OR (p.resource = 'products' AND p.action = 'read') + OR (p.resource = 'pos') + OR (p.resource IN ('leads', 'opportunities', 'activities') AND p.scope = 'own') +ON CONFLICT DO NOTHING; + +-- Rol: warehouse (almacenista) +INSERT INTO users.roles (id, tenant_id, name, display_name, description, is_system, hierarchy_level, icon, color) +VALUES ('10000000-0000-0000-0000-000000000008', NULL, 'warehouse', 'Almacenista', 'Rol de almacen con acceso a inventario', TRUE, 3, 'package', '#f59e0b') +ON CONFLICT DO NOTHING; + +INSERT INTO users.role_permissions (role_id, permission_id) +SELECT '10000000-0000-0000-0000-000000000008', p.id +FROM users.permissions p +WHERE p.category = 'inventory' + OR (p.resource = 'products' AND p.action = 'read') + OR (p.resource = 'warehouses' AND p.action = 'read') +ON CONFLICT DO NOTHING; + +-- ===================== +-- MAPEO DE PERFILES ERP A ROLES (actualizacion) +-- ===================== +INSERT INTO users.profile_role_mapping (profile_code, role_id) VALUES +('CNT', '10000000-0000-0000-0000-000000000006'), -- Contador -> accountant +('VNT', '10000000-0000-0000-0000-000000000007'), -- Ventas -> sales +('ALM', '10000000-0000-0000-0000-000000000008') -- Almacen -> warehouse +ON CONFLICT (profile_code, role_id) DO NOTHING; + +-- ===================== +-- COMENTARIOS +-- ===================== +COMMENT ON TABLE users.permissions IS 'Permisos granulares del sistema RBAC - seed extendido para ERP';