[PROP-CORE-004] feat: Adapt AI roles for medical clinic domain
- Roles: ADMIN, DOCTOR, RECEPCIONISTA, PACIENTE - Clinical data restricted to DOCTOR only - Compliance: NOM-024-SSA3-2012, LFPDPPP - Medical terminology and privacy restrictions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
297720cdf2
commit
07877410d3
@ -1,17 +1,20 @@
|
||||
/**
|
||||
* ERP Roles Configuration
|
||||
* ERP Clínicas - Roles Configuration
|
||||
*
|
||||
* Define roles, tools permitidos, y system prompts para cada rol en el ERP.
|
||||
* Basado en: michangarrito MCH-012/MCH-013 (role-based chatbot)
|
||||
* Roles específicos para operaciones de clínicas médicas.
|
||||
* Adaptado desde erp-core v1.5.0 (PROP-CORE-004)
|
||||
*
|
||||
* Roles disponibles:
|
||||
* - ADMIN: Acceso completo a todas las operaciones
|
||||
* - SUPERVISOR: Gestión de equipos y reportes de sucursal
|
||||
* - OPERATOR: Operaciones de punto de venta
|
||||
* - CUSTOMER: Acceso limitado para clientes (si se expone chatbot)
|
||||
* IMPORTANTE: Datos clínicos restringidos solo a DOCTOR.
|
||||
* Cumplimiento: NOM-024-SSA3-2012, LFPDPPP
|
||||
*
|
||||
* Roles:
|
||||
* - ADMIN: Director de clínica - acceso administrativo completo
|
||||
* - DOCTOR: Médico - acceso a expedientes de sus pacientes
|
||||
* - RECEPCIONISTA: Citas, pagos, agenda (sin acceso a expedientes)
|
||||
* - PACIENTE: Solo sus citas y expediente propio
|
||||
*/
|
||||
|
||||
export type ERPRole = 'ADMIN' | 'SUPERVISOR' | 'OPERATOR' | 'CUSTOMER';
|
||||
export type ERPRole = 'ADMIN' | 'DOCTOR' | 'RECEPCIONISTA' | 'PACIENTE';
|
||||
|
||||
export interface ERPRoleConfig {
|
||||
name: string;
|
||||
@ -19,234 +22,126 @@ export interface ERPRoleConfig {
|
||||
tools: string[];
|
||||
systemPromptFile: string;
|
||||
maxConversationHistory: number;
|
||||
allowedModels?: string[]; // Si vacío, usa el default del tenant
|
||||
allowedModels?: string[];
|
||||
rateLimit: {
|
||||
requestsPerMinute: number;
|
||||
tokensPerMinute: number;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuración de roles ERP
|
||||
*/
|
||||
export const ERP_ROLES: Record<ERPRole, ERPRoleConfig> = {
|
||||
ADMIN: {
|
||||
name: 'Administrador',
|
||||
description: 'Acceso completo a todas las operaciones del sistema ERP',
|
||||
name: 'Director de Clínica',
|
||||
description: 'Director o administrador con acceso completo excepto expedientes clínicos',
|
||||
tools: [
|
||||
// Ventas
|
||||
'get_sales_summary',
|
||||
'get_sales_report',
|
||||
'get_top_products',
|
||||
'get_top_customers',
|
||||
'get_sales_by_branch',
|
||||
'create_sale',
|
||||
'void_sale',
|
||||
|
||||
// Inventario
|
||||
'get_inventory_status',
|
||||
'get_low_stock_products',
|
||||
'get_inventory_value',
|
||||
'adjust_inventory',
|
||||
'transfer_inventory',
|
||||
|
||||
// Compras
|
||||
'get_pending_orders',
|
||||
'get_supplier_info',
|
||||
'create_purchase_order',
|
||||
'approve_purchase',
|
||||
|
||||
// Finanzas
|
||||
'get_financial_report',
|
||||
'get_accounts_receivable',
|
||||
'get_accounts_payable',
|
||||
'get_cash_flow',
|
||||
|
||||
// Usuarios y configuración
|
||||
'manage_users',
|
||||
'view_audit_logs',
|
||||
'update_settings',
|
||||
'get_branch_info',
|
||||
'manage_branches',
|
||||
|
||||
// Reportes avanzados
|
||||
'generate_report',
|
||||
'export_data',
|
||||
'get_kpis',
|
||||
'get_financial_report', 'get_accounts_receivable', 'get_kpis', 'get_cash_flow',
|
||||
// Configuración
|
||||
'manage_users', 'view_audit_logs', 'update_settings',
|
||||
'get_branch_info', 'manage_branches',
|
||||
// Agenda (sin datos clínicos)
|
||||
'get_appointments_summary', 'get_doctor_schedules', 'manage_schedules',
|
||||
// Reportes administrativos
|
||||
'generate_report', 'export_data',
|
||||
// Inventario (insumos)
|
||||
'get_inventory_status', 'get_low_stock_products', 'create_purchase_order',
|
||||
// TPV
|
||||
'configure_terminal', 'get_payment_history', 'process_refund',
|
||||
],
|
||||
systemPromptFile: 'admin-system-prompt',
|
||||
maxConversationHistory: 50,
|
||||
rateLimit: {
|
||||
requestsPerMinute: 100,
|
||||
tokensPerMinute: 50000,
|
||||
},
|
||||
rateLimit: { requestsPerMinute: 100, tokensPerMinute: 50000 },
|
||||
},
|
||||
|
||||
SUPERVISOR: {
|
||||
name: 'Supervisor',
|
||||
description: 'Gestión de equipos, reportes de sucursal y aprobaciones',
|
||||
DOCTOR: {
|
||||
name: 'Médico',
|
||||
description: 'Médico con acceso a expedientes de sus pacientes asignados',
|
||||
tools: [
|
||||
// Ventas (lectura + acciones limitadas)
|
||||
'get_sales_summary',
|
||||
'get_sales_report',
|
||||
'get_top_products',
|
||||
'get_sales_by_branch',
|
||||
'create_sale',
|
||||
|
||||
// Inventario (lectura + ajustes)
|
||||
'get_inventory_status',
|
||||
'get_low_stock_products',
|
||||
'adjust_inventory',
|
||||
|
||||
// Equipo
|
||||
'get_team_performance',
|
||||
'get_employee_schedule',
|
||||
'manage_schedules',
|
||||
|
||||
// Aprobaciones
|
||||
'approve_discounts',
|
||||
'approve_voids',
|
||||
'approve_refunds',
|
||||
|
||||
// Expedientes (SOLO sus pacientes)
|
||||
'get_patient_history', 'get_patient_vitals', 'add_consultation_note',
|
||||
'get_patient_prescriptions', 'create_prescription',
|
||||
'get_patient_labs', 'order_lab_test',
|
||||
// Diagnósticos
|
||||
'search_cie10', 'get_drug_interactions', 'get_treatment_guidelines',
|
||||
// Agenda
|
||||
'get_my_appointments', 'get_my_schedule', 'complete_appointment',
|
||||
// Sucursal
|
||||
'get_branch_info',
|
||||
'get_branch_report',
|
||||
|
||||
// Clientes
|
||||
'get_customer_info',
|
||||
'get_customer_balance',
|
||||
'get_branch_info', 'get_branch_hours',
|
||||
],
|
||||
systemPromptFile: 'supervisor-system-prompt',
|
||||
maxConversationHistory: 30,
|
||||
rateLimit: {
|
||||
requestsPerMinute: 60,
|
||||
tokensPerMinute: 30000,
|
||||
},
|
||||
rateLimit: { requestsPerMinute: 60, tokensPerMinute: 30000 },
|
||||
},
|
||||
|
||||
OPERATOR: {
|
||||
name: 'Operador',
|
||||
description: 'Operaciones de punto de venta y consultas básicas',
|
||||
RECEPCIONISTA: {
|
||||
name: 'Recepcionista',
|
||||
description: 'Recepción con gestión de citas, pagos y agenda (sin acceso a expedientes)',
|
||||
tools: [
|
||||
// Productos
|
||||
'search_products',
|
||||
'get_product_price',
|
||||
'check_product_availability',
|
||||
|
||||
// Ventas
|
||||
'create_sale',
|
||||
'get_my_sales',
|
||||
'apply_discount', // Con límite
|
||||
|
||||
// Clientes
|
||||
'search_customers',
|
||||
'get_customer_balance',
|
||||
'register_payment',
|
||||
|
||||
// Inventario (solo lectura)
|
||||
'check_stock',
|
||||
|
||||
// Agenda
|
||||
'search_patients', 'create_appointment', 'reschedule_appointment',
|
||||
'cancel_appointment', 'get_available_slots', 'confirm_appointment',
|
||||
// Pagos
|
||||
'register_payment', 'get_patient_balance', 'create_invoice',
|
||||
'process_card_payment', 'process_cash_payment', 'print_receipt',
|
||||
// Información
|
||||
'get_branch_hours',
|
||||
'get_promotions',
|
||||
'get_branch_hours', 'get_doctor_schedules', 'get_services_catalog',
|
||||
// Comunicación
|
||||
'send_appointment_reminder',
|
||||
],
|
||||
systemPromptFile: 'operator-system-prompt',
|
||||
maxConversationHistory: 20,
|
||||
rateLimit: {
|
||||
requestsPerMinute: 30,
|
||||
tokensPerMinute: 15000,
|
||||
},
|
||||
rateLimit: { requestsPerMinute: 30, tokensPerMinute: 15000 },
|
||||
},
|
||||
|
||||
CUSTOMER: {
|
||||
name: 'Cliente',
|
||||
description: 'Acceso limitado para clientes externos',
|
||||
PACIENTE: {
|
||||
name: 'Paciente',
|
||||
description: 'Paciente con acceso solo a sus citas y expediente propio',
|
||||
tools: [
|
||||
// Catálogo
|
||||
'view_catalog',
|
||||
'search_products',
|
||||
'check_availability',
|
||||
|
||||
// Pedidos
|
||||
'get_my_orders',
|
||||
'track_order',
|
||||
|
||||
// Sus citas
|
||||
'get_my_appointments', 'request_appointment', 'cancel_my_appointment',
|
||||
// Su expediente (solo lectura)
|
||||
'get_my_history', 'get_my_prescriptions', 'get_my_results',
|
||||
// Cuenta
|
||||
'get_my_balance',
|
||||
'get_my_history',
|
||||
|
||||
'get_my_balance', 'get_my_invoices',
|
||||
// Soporte
|
||||
'contact_support',
|
||||
'get_store_info',
|
||||
'get_promotions',
|
||||
'contact_support', 'get_clinic_info', 'get_doctor_info',
|
||||
],
|
||||
systemPromptFile: 'customer-system-prompt',
|
||||
maxConversationHistory: 10,
|
||||
rateLimit: {
|
||||
requestsPerMinute: 10,
|
||||
tokensPerMinute: 5000,
|
||||
},
|
||||
rateLimit: { requestsPerMinute: 10, tokensPerMinute: 5000 },
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Mapeo de rol de base de datos a ERPRole
|
||||
*/
|
||||
export const DB_ROLE_MAPPING: Record<string, ERPRole> = {
|
||||
// Roles típicos de sistema
|
||||
admin: 'ADMIN',
|
||||
administrator: 'ADMIN',
|
||||
superadmin: 'ADMIN',
|
||||
owner: 'ADMIN',
|
||||
|
||||
// Supervisores
|
||||
supervisor: 'SUPERVISOR',
|
||||
manager: 'SUPERVISOR',
|
||||
branch_manager: 'SUPERVISOR',
|
||||
store_manager: 'SUPERVISOR',
|
||||
|
||||
// Operadores
|
||||
operator: 'OPERATOR',
|
||||
cashier: 'OPERATOR',
|
||||
sales: 'OPERATOR',
|
||||
employee: 'OPERATOR',
|
||||
staff: 'OPERATOR',
|
||||
|
||||
// Clientes
|
||||
customer: 'CUSTOMER',
|
||||
client: 'CUSTOMER',
|
||||
guest: 'CUSTOMER',
|
||||
// Administradores
|
||||
admin: 'ADMIN', administrator: 'ADMIN', director: 'ADMIN', owner: 'ADMIN',
|
||||
// Doctores
|
||||
doctor: 'DOCTOR', medico: 'DOCTOR', physician: 'DOCTOR',
|
||||
especialista: 'DOCTOR', dentista: 'DOCTOR', veterinario: 'DOCTOR',
|
||||
// Recepcionistas
|
||||
recepcionista: 'RECEPCIONISTA', receptionist: 'RECEPCIONISTA',
|
||||
asistente: 'RECEPCIONISTA', secretary: 'RECEPCIONISTA', operator: 'RECEPCIONISTA',
|
||||
// Pacientes
|
||||
paciente: 'PACIENTE', patient: 'PACIENTE', customer: 'PACIENTE', client: 'PACIENTE',
|
||||
};
|
||||
|
||||
/**
|
||||
* Obtener rol ERP desde rol de base de datos
|
||||
*/
|
||||
export function getERPRole(dbRole: string | undefined): ERPRole {
|
||||
if (!dbRole) return 'CUSTOMER'; // Default para roles no mapeados
|
||||
if (!dbRole) return 'PACIENTE';
|
||||
const normalized = dbRole.toLowerCase().trim();
|
||||
return DB_ROLE_MAPPING[normalized] || 'CUSTOMER';
|
||||
return DB_ROLE_MAPPING[normalized] || 'PACIENTE';
|
||||
}
|
||||
|
||||
/**
|
||||
* Verificar si un rol tiene acceso a un tool
|
||||
*/
|
||||
export function hasToolAccess(role: ERPRole, toolName: string): boolean {
|
||||
const roleConfig = ERP_ROLES[role];
|
||||
if (!roleConfig) return false;
|
||||
return roleConfig.tools.includes(toolName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener todos los tools para un rol
|
||||
*/
|
||||
export function getToolsForRole(role: ERPRole): string[] {
|
||||
const roleConfig = ERP_ROLES[role];
|
||||
return roleConfig?.tools || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener configuración completa de un rol
|
||||
*/
|
||||
export function getRoleConfig(role: ERPRole): ERPRoleConfig | null {
|
||||
return ERP_ROLES[role] || null;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user