Initial commit: Proyecto portal-requisicion-vacantes
This commit is contained in:
@@ -0,0 +1,720 @@
|
||||
// Mock Data for GLM Portal - This simulates backend data
|
||||
import type {
|
||||
User,
|
||||
Country,
|
||||
City,
|
||||
Department,
|
||||
Position,
|
||||
Requisition,
|
||||
RecruiterCapacity,
|
||||
Notification,
|
||||
AuditLog
|
||||
} from './types'
|
||||
|
||||
// Current logged-in user (simulated)
|
||||
export const currentUser: User = {
|
||||
id: 'usr_001',
|
||||
email: 'maria.gonzalez@gomezleemarketing.com',
|
||||
name: 'María González',
|
||||
role: 'director_rrhh',
|
||||
countryId: 'all',
|
||||
avatar: undefined,
|
||||
active: true
|
||||
}
|
||||
|
||||
// Countries
|
||||
export const countries: Country[] = [
|
||||
{ id: 'mx', name: 'México', code: 'MX', timezone: 'America/Mexico_City', active: true },
|
||||
{ id: 'co', name: 'Colombia', code: 'CO', timezone: 'America/Bogota', active: true },
|
||||
{ id: 'pe', name: 'Perú', code: 'PE', timezone: 'America/Lima', active: true },
|
||||
{ id: 'cl', name: 'Chile', code: 'CL', timezone: 'America/Santiago', active: true },
|
||||
{ id: 'ar', name: 'Argentina', code: 'AR', timezone: 'America/Buenos_Aires', active: true },
|
||||
{ id: 'do', name: 'República Dominicana', code: 'DO', timezone: 'America/Santo_Domingo', active: true },
|
||||
{ id: 'gt', name: 'Guatemala', code: 'GT', timezone: 'America/Guatemala', active: true },
|
||||
{ id: 'pa', name: 'Panamá', code: 'PA', timezone: 'America/Panama', active: true },
|
||||
]
|
||||
|
||||
// Cities
|
||||
export const cities: City[] = [
|
||||
// México
|
||||
{ id: 'mx_cdmx', countryId: 'mx', name: 'Ciudad de México' },
|
||||
{ id: 'mx_gdl', countryId: 'mx', name: 'Guadalajara' },
|
||||
{ id: 'mx_mty', countryId: 'mx', name: 'Monterrey' },
|
||||
{ id: 'mx_pue', countryId: 'mx', name: 'Puebla' },
|
||||
// Colombia
|
||||
{ id: 'co_bog', countryId: 'co', name: 'Bogotá' },
|
||||
{ id: 'co_med', countryId: 'co', name: 'Medellín' },
|
||||
{ id: 'co_cal', countryId: 'co', name: 'Cali' },
|
||||
{ id: 'co_bar', countryId: 'co', name: 'Barranquilla' },
|
||||
// Perú
|
||||
{ id: 'pe_lim', countryId: 'pe', name: 'Lima' },
|
||||
{ id: 'pe_are', countryId: 'pe', name: 'Arequipa' },
|
||||
{ id: 'pe_tru', countryId: 'pe', name: 'Trujillo' },
|
||||
// Chile
|
||||
{ id: 'cl_stg', countryId: 'cl', name: 'Santiago' },
|
||||
{ id: 'cl_val', countryId: 'cl', name: 'Valparaíso' },
|
||||
{ id: 'cl_con', countryId: 'cl', name: 'Concepción' },
|
||||
// Argentina
|
||||
{ id: 'ar_bue', countryId: 'ar', name: 'Buenos Aires' },
|
||||
{ id: 'ar_cor', countryId: 'ar', name: 'Córdoba' },
|
||||
{ id: 'ar_ros', countryId: 'ar', name: 'Rosario' },
|
||||
// República Dominicana
|
||||
{ id: 'do_sdo', countryId: 'do', name: 'Santo Domingo' },
|
||||
{ id: 'do_stg', countryId: 'do', name: 'Santiago de los Caballeros' },
|
||||
// Guatemala
|
||||
{ id: 'gt_gua', countryId: 'gt', name: 'Ciudad de Guatemala' },
|
||||
// Panamá
|
||||
{ id: 'pa_pan', countryId: 'pa', name: 'Ciudad de Panamá' },
|
||||
]
|
||||
|
||||
// Departments
|
||||
export const departments: Department[] = [
|
||||
{ id: 'dept_sales', name: 'Ventas', countryId: 'all' },
|
||||
{ id: 'dept_mkt', name: 'Marketing', countryId: 'all' },
|
||||
{ id: 'dept_ops', name: 'Operaciones', countryId: 'all' },
|
||||
{ id: 'dept_trade', name: 'Trade Marketing', countryId: 'all' },
|
||||
{ id: 'dept_fin', name: 'Finanzas', countryId: 'all' },
|
||||
{ id: 'dept_hr', name: 'Recursos Humanos', countryId: 'all' },
|
||||
{ id: 'dept_it', name: 'Tecnología', countryId: 'all' },
|
||||
{ id: 'dept_admin', name: 'Administración', countryId: 'all' },
|
||||
]
|
||||
|
||||
// Positions
|
||||
export const positions: Position[] = [
|
||||
{ id: 'pos_merch', name: 'Merchandiser', complexityTier: 1 },
|
||||
{ id: 'pos_prom', name: 'Promotor/a', complexityTier: 1 },
|
||||
{ id: 'pos_imp', name: 'Impulsador/a', complexityTier: 1 },
|
||||
{ id: 'pos_dem', name: 'Demostrador/a', complexityTier: 1 },
|
||||
{ id: 'pos_sales_jr', name: 'Ejecutivo de Ventas Jr', complexityTier: 2 },
|
||||
{ id: 'pos_sales_sr', name: 'Ejecutivo de Ventas Sr', complexityTier: 2 },
|
||||
{ id: 'pos_analyst', name: 'Analista', complexityTier: 2 },
|
||||
{ id: 'pos_trade', name: 'Trade Marketing Specialist', complexityTier: 2 },
|
||||
{ id: 'pos_coord', name: 'Coordinador', complexityTier: 3 },
|
||||
{ id: 'pos_super', name: 'Supervisor', complexityTier: 3 },
|
||||
{ id: 'pos_manager', name: 'Gerente', complexityTier: 3 },
|
||||
{ id: 'pos_director', name: 'Director', complexityTier: 3 },
|
||||
]
|
||||
|
||||
// Users
|
||||
export const users: User[] = [
|
||||
currentUser,
|
||||
{ id: 'usr_002', email: 'carlos.mendez@gomezleemarketing.com', name: 'Carlos Méndez', role: 'reclutador', countryId: 'mx', active: true },
|
||||
{ id: 'usr_003', email: 'ana.rodriguez@gomezleemarketing.com', name: 'Ana Rodríguez', role: 'reclutador', countryId: 'co', active: true },
|
||||
{ id: 'usr_004', email: 'luis.torres@gomezleemarketing.com', name: 'Luis Torres', role: 'reclutador', countryId: 'pe', active: true },
|
||||
{ id: 'usr_005', email: 'sofia.vargas@gomezleemarketing.com', name: 'Sofía Vargas', role: 'rrhh_regional', countryId: 'mx', active: true },
|
||||
{ id: 'usr_006', email: 'pedro.silva@gomezleemarketing.com', name: 'Pedro Silva', role: 'administracion', countryId: 'all', active: true },
|
||||
{ id: 'usr_007', email: 'elena.castro@gomezleemarketing.com', name: 'Elena Castro', role: 'solicitante', countryId: 'mx', active: true },
|
||||
{ id: 'usr_008', email: 'roberto.diaz@gomezleemarketing.com', name: 'Roberto Díaz', role: 'country_lead', countryId: 'co', active: true },
|
||||
{ id: 'usr_009', email: 'laura.martinez@gomezleemarketing.com', name: 'Laura Martínez', role: 'reclutador', countryId: 'cl', active: true },
|
||||
{ id: 'usr_010', email: 'diego.hernandez@gomezleemarketing.com', name: 'Diego Hernández', role: 'solicitante', countryId: 'co', active: true },
|
||||
{ id: 'usr_011', email: 'miguel.admin@gomezleemarketing.com', name: 'Miguel Admin', role: 'admin_sistema', countryId: 'all', active: true },
|
||||
{ id: 'usr_012', email: 'carmen.inactive@gomezleemarketing.com', name: 'Carmen Inactiva', role: 'reclutador', countryId: 'mx', active: false },
|
||||
{ id: 'usr_013', email: 'jorge.inactive@gomezleemarketing.com', name: 'Jorge Inactivo', role: 'solicitante', countryId: 'co', active: false },
|
||||
]
|
||||
|
||||
// Mock Requisitions
|
||||
export const requisitions: Requisition[] = [
|
||||
{
|
||||
id: 'REQ-2024-001',
|
||||
requesterId: 'usr_007',
|
||||
requesterName: 'Elena Castro',
|
||||
countryId: 'mx',
|
||||
countryName: 'México',
|
||||
cityId: 'mx_cdmx',
|
||||
cityName: 'Ciudad de México',
|
||||
departmentId: 'dept_trade',
|
||||
departmentName: 'Trade Marketing',
|
||||
positionId: 'pos_merch',
|
||||
positionName: 'Merchandiser',
|
||||
quantity: 5,
|
||||
vacanciesFilled: 3,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Expansión de cobertura en autoservicios zona norte CDMX para campaña Q1 2024',
|
||||
urgency: 'alta',
|
||||
status: 'reclutando',
|
||||
recruiterId: 'usr_002',
|
||||
recruiterName: 'Carlos Méndez',
|
||||
createdAt: '2024-01-15T10:30:00Z',
|
||||
hardDeadline: '2024-02-15T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-16T14:22:00Z',
|
||||
approvedByHrUserId: 'usr_005',
|
||||
approvedByAdminAt: '2024-01-17T09:15:00Z',
|
||||
approvedByAdminUserId: 'usr_006',
|
||||
currentStage: 'segunda_entrevista',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-002',
|
||||
requesterId: 'usr_010',
|
||||
requesterName: 'Diego Hernández',
|
||||
countryId: 'co',
|
||||
countryName: 'Colombia',
|
||||
cityId: 'co_bog',
|
||||
cityName: 'Bogotá',
|
||||
departmentId: 'dept_sales',
|
||||
departmentName: 'Ventas',
|
||||
positionId: 'pos_sales_sr',
|
||||
positionName: 'Ejecutivo de Ventas Sr',
|
||||
quantity: 2,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'hibrido',
|
||||
tipoContratacion: 'reemplazo',
|
||||
justification: 'Reemplazo por renuncia de personal. Cuentas clave en riesgo.',
|
||||
urgency: 'critica',
|
||||
status: 'pendiente_admin',
|
||||
createdAt: '2024-01-20T08:45:00Z',
|
||||
hardDeadline: '2024-02-20T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-20T16:30:00Z',
|
||||
approvedByHrUserId: 'usr_001',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-003',
|
||||
requesterId: 'usr_007',
|
||||
requesterName: 'Elena Castro',
|
||||
countryId: 'mx',
|
||||
countryName: 'México',
|
||||
cityId: 'mx_gdl',
|
||||
cityName: 'Guadalajara',
|
||||
departmentId: 'dept_ops',
|
||||
departmentName: 'Operaciones',
|
||||
positionId: 'pos_coord',
|
||||
positionName: 'Coordinador',
|
||||
quantity: 1,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Nueva estructura operativa región occidente para soportar crecimiento 2024',
|
||||
urgency: 'normal',
|
||||
salaryPackage: '$45,000 - $55,000 MXN mensual',
|
||||
budget: 55000,
|
||||
currency: 'MXN',
|
||||
status: 'pendiente_rrhh',
|
||||
createdAt: '2024-01-22T11:20:00Z',
|
||||
hardDeadline: '2024-03-01T23:59:59Z',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-004',
|
||||
requesterId: 'usr_008',
|
||||
requesterName: 'Roberto Díaz',
|
||||
countryId: 'co',
|
||||
countryName: 'Colombia',
|
||||
cityId: 'co_med',
|
||||
cityName: 'Medellín',
|
||||
departmentId: 'dept_trade',
|
||||
departmentName: 'Trade Marketing',
|
||||
positionId: 'pos_prom',
|
||||
positionName: 'Promotor/a',
|
||||
quantity: 10,
|
||||
vacanciesFilled: 7,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'temporal',
|
||||
justification: 'Campaña especial Semana Santa 2024 en centros comerciales principales',
|
||||
urgency: 'alta',
|
||||
status: 'reclutando',
|
||||
recruiterId: 'usr_003',
|
||||
recruiterName: 'Ana Rodríguez',
|
||||
createdAt: '2024-01-10T09:00:00Z',
|
||||
hardDeadline: '2024-02-28T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-10T15:45:00Z',
|
||||
approvedByHrUserId: 'usr_001',
|
||||
approvedByAdminAt: '2024-01-11T10:30:00Z',
|
||||
approvedByAdminUserId: 'usr_006',
|
||||
currentStage: 'examenes_medicos',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-005',
|
||||
requesterId: 'usr_010',
|
||||
requesterName: 'Diego Hernández',
|
||||
countryId: 'pe',
|
||||
countryName: 'Perú',
|
||||
cityId: 'pe_lim',
|
||||
cityName: 'Lima',
|
||||
departmentId: 'dept_mkt',
|
||||
departmentName: 'Marketing',
|
||||
positionId: 'pos_analyst',
|
||||
positionName: 'Analista',
|
||||
quantity: 1,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'remoto',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Soporte analítico para equipo regional de marketing digital',
|
||||
urgency: 'normal',
|
||||
status: 'correccion_requerida',
|
||||
createdAt: '2024-01-18T14:30:00Z',
|
||||
hardDeadline: '2024-03-15T23:59:59Z',
|
||||
rejectionComment: 'Favor especificar el presupuesto aprobado y nivel de experiencia requerido.',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-006',
|
||||
requesterId: 'usr_007',
|
||||
requesterName: 'Elena Castro',
|
||||
countryId: 'cl',
|
||||
countryName: 'Chile',
|
||||
cityId: 'cl_stg',
|
||||
cityName: 'Santiago',
|
||||
departmentId: 'dept_sales',
|
||||
departmentName: 'Ventas',
|
||||
positionId: 'pos_manager',
|
||||
positionName: 'Gerente',
|
||||
quantity: 1,
|
||||
vacanciesFilled: 1,
|
||||
modalidad: 'hibrido',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Creación de gerencia comercial para mercado chileno',
|
||||
urgency: 'critica',
|
||||
status: 'cerrado',
|
||||
recruiterId: 'usr_009',
|
||||
recruiterName: 'Laura Martínez',
|
||||
createdAt: '2023-12-01T08:00:00Z',
|
||||
hardDeadline: '2024-01-31T23:59:59Z',
|
||||
approvedByHrAt: '2023-12-01T16:00:00Z',
|
||||
approvedByHrUserId: 'usr_001',
|
||||
approvedByAdminAt: '2023-12-02T11:00:00Z',
|
||||
approvedByAdminUserId: 'usr_006',
|
||||
closedAt: '2024-01-25T10:00:00Z',
|
||||
closedReason: 'Vacante cubierta exitosamente',
|
||||
currentStage: 'cerrado',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-007',
|
||||
requesterId: 'usr_008',
|
||||
requesterName: 'Roberto Díaz',
|
||||
countryId: 'do',
|
||||
countryName: 'República Dominicana',
|
||||
cityId: 'do_sdo',
|
||||
cityName: 'Santo Domingo',
|
||||
departmentId: 'dept_trade',
|
||||
departmentName: 'Trade Marketing',
|
||||
positionId: 'pos_imp',
|
||||
positionName: 'Impulsador/a',
|
||||
quantity: 8,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'temporal',
|
||||
justification: 'Lanzamiento nuevo producto cliente principal en supermercados',
|
||||
urgency: 'alta',
|
||||
status: 'reclutando',
|
||||
recruiterId: 'usr_002',
|
||||
recruiterName: 'Carlos Méndez',
|
||||
createdAt: '2024-01-19T13:00:00Z',
|
||||
hardDeadline: '2024-02-10T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-19T17:30:00Z',
|
||||
approvedByHrUserId: 'usr_005',
|
||||
approvedByAdminAt: '2024-01-20T08:00:00Z',
|
||||
approvedByAdminUserId: 'usr_006',
|
||||
currentStage: 'primera_entrevista',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-008',
|
||||
requesterId: 'usr_007',
|
||||
requesterName: 'Elena Castro',
|
||||
countryId: 'ar',
|
||||
countryName: 'Argentina',
|
||||
cityId: 'ar_bue',
|
||||
cityName: 'Buenos Aires',
|
||||
departmentId: 'dept_ops',
|
||||
departmentName: 'Operaciones',
|
||||
positionId: 'pos_super',
|
||||
positionName: 'Supervisor',
|
||||
quantity: 2,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'reemplazo',
|
||||
justification: 'Reestructuración equipo operativo zona sur',
|
||||
urgency: 'normal',
|
||||
status: 'borrador',
|
||||
createdAt: '2024-01-23T16:45:00Z',
|
||||
hardDeadline: '2024-03-20T23:59:59Z',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-009',
|
||||
requesterId: 'usr_010',
|
||||
requesterName: 'Diego Hernández',
|
||||
countryId: 'mx',
|
||||
countryName: 'México',
|
||||
cityId: 'mx_mty',
|
||||
cityName: 'Monterrey',
|
||||
departmentId: 'dept_trade',
|
||||
departmentName: 'Trade Marketing',
|
||||
positionId: 'pos_merch',
|
||||
positionName: 'Merchandiser',
|
||||
quantity: 15,
|
||||
vacanciesFilled: 10,
|
||||
modalidad: 'presencial',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Ampliación cobertura tiendas de conveniencia región noreste',
|
||||
urgency: 'alta',
|
||||
status: 'reclutando',
|
||||
recruiterId: 'usr_002',
|
||||
recruiterName: 'Carlos Méndez',
|
||||
createdAt: '2024-01-05T10:00:00Z',
|
||||
hardDeadline: '2024-02-05T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-05T14:00:00Z',
|
||||
approvedByHrUserId: 'usr_005',
|
||||
approvedByAdminAt: '2024-01-06T09:00:00Z',
|
||||
approvedByAdminUserId: 'usr_006',
|
||||
currentStage: 'referencias',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-010',
|
||||
requesterId: 'usr_008',
|
||||
requesterName: 'Roberto Díaz',
|
||||
countryId: 'gt',
|
||||
countryName: 'Guatemala',
|
||||
cityId: 'gt_gua',
|
||||
cityName: 'Ciudad de Guatemala',
|
||||
departmentId: 'dept_sales',
|
||||
departmentName: 'Ventas',
|
||||
positionId: 'pos_sales_jr',
|
||||
positionName: 'Ejecutivo de Ventas Jr',
|
||||
quantity: 3,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'hibrido',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Equipo comercial inicial para apertura de operación Guatemala',
|
||||
urgency: 'critica',
|
||||
status: 'cancelado',
|
||||
createdAt: '2024-01-08T11:30:00Z',
|
||||
hardDeadline: '2024-02-28T23:59:59Z',
|
||||
approvedByHrAt: '2024-01-08T15:00:00Z',
|
||||
approvedByHrUserId: 'usr_001',
|
||||
closedAt: '2024-01-15T09:00:00Z',
|
||||
closedReason: 'Proyecto de apertura Guatemala pospuesto hasta Q3 2024',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-011',
|
||||
requesterId: 'usr_007',
|
||||
requesterName: 'Elena Castro',
|
||||
countryId: 'mx',
|
||||
countryName: 'México',
|
||||
cityId: 'mx_cdmx',
|
||||
cityName: 'Ciudad de México',
|
||||
departmentId: 'dept_mkt',
|
||||
departmentName: 'Marketing',
|
||||
positionId: 'pos_analyst',
|
||||
positionName: 'Analista de Marketing',
|
||||
quantity: 1,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'hibrido',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Apoyo para campaña de verano 2024',
|
||||
urgency: 'alta',
|
||||
status: 'pendiente_rrhh',
|
||||
createdAt: new Date(Date.now() - 3 * 86400000).toISOString(),
|
||||
hardDeadline: new Date(Date.now() + 15 * 86400000).toISOString(),
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-012',
|
||||
requesterId: 'usr_010',
|
||||
requesterName: 'Diego Hernández',
|
||||
countryId: 'co',
|
||||
countryName: 'Colombia',
|
||||
cityId: 'co_bog',
|
||||
cityName: 'Bogotá',
|
||||
departmentId: 'dept_it',
|
||||
departmentName: 'Tecnología',
|
||||
positionId: 'pos_analyst',
|
||||
positionName: 'Soporte Técnico',
|
||||
quantity: 2,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'remoto',
|
||||
tipoContratacion: 'reemplazo',
|
||||
justification: 'Baja por renuncias en el equipo de soporte de Nivel 1',
|
||||
urgency: 'normal',
|
||||
status: 'pendiente_admin',
|
||||
createdAt: new Date(Date.now() - 5 * 86400000).toISOString(),
|
||||
hardDeadline: new Date(Date.now() + 30 * 86400000).toISOString(),
|
||||
approvedByHrAt: new Date(Date.now() - 4 * 86400000).toISOString(),
|
||||
approvedByHrUserId: 'usr_001',
|
||||
},
|
||||
{
|
||||
id: 'REQ-2024-013',
|
||||
requesterId: 'usr_008',
|
||||
requesterName: 'Roberto Díaz',
|
||||
countryId: 'pe',
|
||||
countryName: 'Perú',
|
||||
cityId: 'pe_lim',
|
||||
cityName: 'Lima',
|
||||
departmentId: 'dept_fin',
|
||||
departmentName: 'Finanzas',
|
||||
positionId: 'pos_analyst',
|
||||
positionName: 'Analista Financiero',
|
||||
quantity: 1,
|
||||
vacanciesFilled: 0,
|
||||
modalidad: 'hibrido',
|
||||
tipoContratacion: 'nuevo',
|
||||
justification: 'Control de presupuestos de las nuevas cuentas clave en Perú',
|
||||
urgency: 'critica',
|
||||
status: 'pendiente_rrhh',
|
||||
createdAt: new Date(Date.now() - 1 * 86400000).toISOString(),
|
||||
hardDeadline: new Date(Date.now() + 20 * 86400000).toISOString(),
|
||||
},
|
||||
]
|
||||
|
||||
// Recruiter Capacity
|
||||
export const recruiterCapacity: RecruiterCapacity[] = [
|
||||
{
|
||||
recruiterId: 'usr_002',
|
||||
recruiterName: 'Carlos Méndez',
|
||||
countryFocus: ['México', 'Rep. Dominicana'],
|
||||
currentScore: 22,
|
||||
maxThreshold: 25,
|
||||
openCases: 3,
|
||||
tier1Count: 28,
|
||||
tier2Count: 0,
|
||||
tier3Count: 0,
|
||||
},
|
||||
{
|
||||
recruiterId: 'usr_003',
|
||||
recruiterName: 'Ana Rodríguez',
|
||||
countryFocus: ['Colombia'],
|
||||
currentScore: 12,
|
||||
maxThreshold: 25,
|
||||
openCases: 1,
|
||||
tier1Count: 10,
|
||||
tier2Count: 0,
|
||||
tier3Count: 0,
|
||||
},
|
||||
{
|
||||
recruiterId: 'usr_004',
|
||||
recruiterName: 'Luis Torres',
|
||||
countryFocus: ['Perú'],
|
||||
currentScore: 5,
|
||||
maxThreshold: 25,
|
||||
openCases: 0,
|
||||
tier1Count: 0,
|
||||
tier2Count: 0,
|
||||
tier3Count: 0,
|
||||
},
|
||||
{
|
||||
recruiterId: 'usr_009',
|
||||
recruiterName: 'Laura Martínez',
|
||||
countryFocus: ['Chile', 'Argentina'],
|
||||
currentScore: 8,
|
||||
maxThreshold: 25,
|
||||
openCases: 0,
|
||||
tier1Count: 0,
|
||||
tier2Count: 0,
|
||||
tier3Count: 0,
|
||||
},
|
||||
]
|
||||
|
||||
// Notifications
|
||||
export const notifications: Notification[] = [
|
||||
{
|
||||
id: 'notif_001',
|
||||
userId: 'usr_001',
|
||||
type: 'aprobacion',
|
||||
title: 'Nueva requisición pendiente',
|
||||
message: 'REQ-2024-003 requiere aprobación de RR.HH.',
|
||||
requisitionId: 'REQ-2024-003',
|
||||
read: false,
|
||||
createdAt: '2024-01-22T11:25:00Z',
|
||||
},
|
||||
{
|
||||
id: 'notif_002',
|
||||
userId: 'usr_001',
|
||||
type: 'sla_riesgo',
|
||||
title: 'SLA en riesgo',
|
||||
message: 'REQ-2024-007 tiene 2 días para fecha límite y 0 vacantes cubiertas.',
|
||||
requisitionId: 'REQ-2024-007',
|
||||
read: false,
|
||||
createdAt: '2024-01-23T08:00:00Z',
|
||||
},
|
||||
{
|
||||
id: 'notif_003',
|
||||
userId: 'usr_001',
|
||||
type: 'nueva_requisicion',
|
||||
title: 'Requisición enviada',
|
||||
message: 'Diego Hernández envió REQ-2024-002 para aprobación.',
|
||||
requisitionId: 'REQ-2024-002',
|
||||
read: true,
|
||||
createdAt: '2024-01-20T08:50:00Z',
|
||||
},
|
||||
{
|
||||
id: 'notif_004',
|
||||
userId: 'usr_001',
|
||||
type: 'transferencia',
|
||||
title: 'Caso transferido',
|
||||
message: 'REQ-2024-001 fue transferido a Carlos Méndez.',
|
||||
requisitionId: 'REQ-2024-001',
|
||||
read: true,
|
||||
createdAt: '2024-01-18T14:00:00Z',
|
||||
},
|
||||
]
|
||||
|
||||
// Audit Log
|
||||
export const auditLog: AuditLog[] = [
|
||||
{
|
||||
id: 'audit_001',
|
||||
entityType: 'requisition',
|
||||
entityId: 'REQ-2024-001',
|
||||
userId: 'usr_007',
|
||||
userName: 'Elena Castro',
|
||||
action: 'Creación de requisición',
|
||||
createdAt: '2024-01-15T10:30:00Z',
|
||||
},
|
||||
{
|
||||
id: 'audit_002',
|
||||
entityType: 'requisition',
|
||||
entityId: 'REQ-2024-001',
|
||||
userId: 'usr_007',
|
||||
userName: 'Elena Castro',
|
||||
action: 'Envío a aprobación',
|
||||
oldValue: 'borrador',
|
||||
newValue: 'pendiente_rrhh',
|
||||
createdAt: '2024-01-15T10:35:00Z',
|
||||
},
|
||||
{
|
||||
id: 'audit_003',
|
||||
entityType: 'requisition',
|
||||
entityId: 'REQ-2024-001',
|
||||
userId: 'usr_005',
|
||||
userName: 'Sofía Vargas',
|
||||
action: 'Aprobación RR.HH.',
|
||||
oldValue: 'pendiente_rrhh',
|
||||
newValue: 'pendiente_admin',
|
||||
createdAt: '2024-01-16T14:22:00Z',
|
||||
},
|
||||
{
|
||||
id: 'audit_004',
|
||||
entityType: 'requisition',
|
||||
entityId: 'REQ-2024-001',
|
||||
userId: 'usr_006',
|
||||
userName: 'Pedro Silva',
|
||||
action: 'Aprobación Administración',
|
||||
oldValue: 'pendiente_admin',
|
||||
newValue: 'reclutando',
|
||||
createdAt: '2024-01-17T09:15:00Z',
|
||||
},
|
||||
{
|
||||
id: 'audit_005',
|
||||
entityType: 'requisition',
|
||||
entityId: 'REQ-2024-001',
|
||||
userId: 'usr_001',
|
||||
userName: 'María González',
|
||||
action: 'Asignación de reclutador',
|
||||
newValue: 'Carlos Méndez',
|
||||
createdAt: '2024-01-17T09:20:00Z',
|
||||
},
|
||||
]
|
||||
|
||||
// Helper functions
|
||||
export function getRequisitionsByStatus(status: Requisition['status']) {
|
||||
return requisitions.filter(r => r.status === status)
|
||||
}
|
||||
|
||||
export function getRequisitionsByCountry(countryId: string) {
|
||||
return requisitions.filter(r => r.countryId === countryId)
|
||||
}
|
||||
|
||||
export function getCitiesByCountry(countryId: string) {
|
||||
return cities.filter(c => c.countryId === countryId)
|
||||
}
|
||||
|
||||
export function getCountryById(countryId: string) {
|
||||
return countries.find(c => c.id === countryId)
|
||||
}
|
||||
|
||||
export function getUserById(userId: string) {
|
||||
return users.find(u => u.id === userId)
|
||||
}
|
||||
|
||||
export function getRecruitersByCountry(countryId: string) {
|
||||
return users.filter(u => u.role === 'reclutador' && (u.countryId === countryId || u.countryId === 'all'))
|
||||
}
|
||||
|
||||
// Dashboard calculations
|
||||
export function getDashboardStats() {
|
||||
const now = new Date()
|
||||
const open = requisitions.filter(r => !['cerrado', 'cancelado'].includes(r.status))
|
||||
const pendingApproval = requisitions.filter(r => ['pendiente_rrhh', 'pendiente_admin'].includes(r.status))
|
||||
const recruiting = requisitions.filter(r => r.status === 'reclutando')
|
||||
const overdue = open.filter(r => new Date(r.hardDeadline) < now)
|
||||
const atRisk = open.filter(r => {
|
||||
const deadline = new Date(r.hardDeadline)
|
||||
const daysLeft = Math.ceil((deadline.getTime() - now.getTime()) / (1000 * 60 * 60 * 24))
|
||||
return daysLeft <= 7 && daysLeft > 0
|
||||
})
|
||||
|
||||
const closedThisMonth = requisitions.filter(r => {
|
||||
if (!r.closedAt) return false
|
||||
const closedDate = new Date(r.closedAt)
|
||||
return closedDate.getMonth() === now.getMonth() && closedDate.getFullYear() === now.getFullYear()
|
||||
})
|
||||
|
||||
const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1)
|
||||
const closedLastMonth = requisitions.filter(r => {
|
||||
if (!r.closedAt) return false
|
||||
const closedDate = new Date(r.closedAt)
|
||||
return closedDate.getMonth() === lastMonth.getMonth() && closedDate.getFullYear() === lastMonth.getFullYear()
|
||||
})
|
||||
|
||||
// Calculate average TTF for closed requisitions
|
||||
const closedWithTTF = requisitions.filter(r => r.status === 'cerrado' && r.closedAt)
|
||||
const avgTTF = closedWithTTF.length > 0
|
||||
? closedWithTTF.reduce((acc, r) => {
|
||||
const created = new Date(r.createdAt)
|
||||
const closed = new Date(r.closedAt!)
|
||||
return acc + Math.ceil((closed.getTime() - created.getTime()) / (1000 * 60 * 60 * 24))
|
||||
}, 0) / closedWithTTF.length
|
||||
: 0
|
||||
|
||||
return {
|
||||
totalOpen: open.length,
|
||||
pendingApproval: pendingApproval.length,
|
||||
recruiting: recruiting.length,
|
||||
overdueCount: overdue.length,
|
||||
atRiskCount: atRisk.length,
|
||||
avgTTF: Math.round(avgTTF),
|
||||
closedThisMonth: closedThisMonth.length,
|
||||
closedLastMonth: closedLastMonth.length,
|
||||
}
|
||||
}
|
||||
|
||||
export const mockUsers = users
|
||||
export const mockDepartments = departments
|
||||
export const mockRequisitions = requisitions
|
||||
export const mockNotifications = notifications
|
||||
|
||||
export const pipelineStages: import('./types').PipelineStage[] = [
|
||||
{ id: 'applied', name: 'Aplicado' },
|
||||
{ id: 'screening', name: 'Screening' },
|
||||
{ id: 'interview_rrhh', name: 'Entrevista RRHH' },
|
||||
{ id: 'interview_technical', name: 'Entrevista Técnica' },
|
||||
{ id: 'interview_manager', name: 'Entrevista Manager' },
|
||||
{ id: 'offer', name: 'Oferta' },
|
||||
{ id: 'hired', name: 'Contratado' },
|
||||
{ id: 'rejected', name: 'Rechazado' }
|
||||
]
|
||||
|
||||
export const mockCandidates: import('./types').Candidate[] = [
|
||||
{
|
||||
id: 'cand_001',
|
||||
name: 'Juan Perez',
|
||||
email: 'juan@example.com',
|
||||
phone: '555-0101',
|
||||
requisitionId: 'REQ-2024-001',
|
||||
currentStage: 'interview_rrhh',
|
||||
currentPosition: 'Software Engineer',
|
||||
currentCompany: 'Tech Corp',
|
||||
rating: 4,
|
||||
source: 'linkedin',
|
||||
appliedDate: '2024-01-10T00:00:00Z'
|
||||
}
|
||||
]
|
||||
|
||||
export const mockInterviews: import('./types').Interview[] = [
|
||||
{
|
||||
id: 'int_001',
|
||||
candidateId: 'cand_001',
|
||||
requisitionId: 'REQ-2024-001',
|
||||
scheduledDate: new Date(Date.now() + 86400000).toISOString(),
|
||||
duration: 60,
|
||||
type: 'technical',
|
||||
location: 'video',
|
||||
meetingLink: 'https://zoom.us/j/123',
|
||||
interviewers: ['usr_001'],
|
||||
status: 'scheduled'
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user