erp-core-database-v2/ddl/07a-permissions-seed.sql
Adrian Flores Cortes b682fdaaf3 [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 <noreply@anthropic.com>
2026-01-31 00:12:13 -06:00

397 lines
27 KiB
SQL

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