const { useState, useEffect, useRef, useMemo } = React; window.AdminContratos = function({ globalUsers = [], settings = {}, currentUser, isMaster = false, isReadOnly = false, refreshData, showToast }) { const [subTab, setSubTab] = useState('emit'); // 'emit', 'templates', 'modalities', 'history', 'employer_data' const [contracts, setContracts] = useState([]); const [dbTemplates, setDbTemplates] = useState([]); const [modalities, setModalities] = useState([]); const [selectedUser, setSelectedUser] = useState(null); const [selectedTemplateId, setSelectedTemplateId] = useState(''); const [selectedModalityCode, setSelectedModalityCode] = useState('indeterminado'); const [previewContract, setPreviewContract] = useState(null); // Modal de Emisión / Edición WYSIWYG const [showEditorModal, setShowEditorModal] = useState(false); const [editingContractId, setEditingContractId] = useState(null); const [isSavingContract, setIsSavingContract] = useState(false); // Modal de Gestión de Plantillas const [showTemplateModal, setShowTemplateModal] = useState(false); const [editingTemplate, setEditingTemplate] = useState(null); const [templateTitle, setTemplateTitle] = useState(''); const [templateType, setTemplateType] = useState('indeterminado'); const [isEditingMasterGlobal, setIsEditingMasterGlobal] = useState(false); const [previewTemplateItem, setPreviewTemplateItem] = useState(null); // Modal de Eliminación Segura de Expediente con PIN/Clave const [deleteTargetContract, setDeleteTargetContract] = useState(null); const [securityPass, setSecurityPass] = useState(''); const [isDeletingContract, setIsDeletingContract] = useState(false); // Modal de Modalidades Personalizables const [showModalityModal, setShowModalityModal] = useState(false); const [editingModality, setEditingModality] = useState(null); // Datos del Empleador const [companyName, setCompanyName] = useState(settings?.companyName || window.SHIFT_CONFIG?.companyName || ''); const [rucNumber, setRucNumber] = useState(settings?.rucNumber || settings?.ruc_number || ''); const [ownerName, setOwnerName] = useState(settings?.ownerName || settings?.owner_name || ''); const [legalRepId, setLegalRepId] = useState(settings?.legalRepId || settings?.legal_rep_id || ''); const [ownerCivilStatus, setOwnerCivilStatus] = useState(settings?.ownerCivilStatus || 'Casado(a)'); const [businessAddress, setBusinessAddress] = useState(settings?.businessAddress || settings?.business_address || ''); const [municipality, setMunicipality] = useState(settings?.municipality || 'Managua'); const isFormLoadedRef = useRef(false); const editorRef = useRef(null); const templateEditorRef = useRef(null); const companyRegime = settings?.taxRegime || settings?.tax_regime || 'cuota_fija'; const isCuotaFija = companyRegime === 'cuota_fija'; useEffect(() => { if (!isFormLoadedRef.current && settings && Object.keys(settings).length > 0) { setCompanyName(settings?.companyName || window.SHIFT_CONFIG?.companyName || ''); setRucNumber(settings?.rucNumber || settings?.ruc_number || ''); setOwnerName(settings?.ownerName || settings?.owner_name || ''); setLegalRepId(settings?.legalRepId || settings?.legal_rep_id || ''); setOwnerCivilStatus(settings?.ownerCivilStatus || 'Casado(a)'); setBusinessAddress(settings?.businessAddress || settings?.business_address || ''); setMunicipality(settings?.municipality || 'Managua'); isFormLoadedRef.current = true; } }, [settings]); const loadAllData = async () => { try { const [resCont, resTpl, resMod] = await Promise.all([ window.apiCall('get_contracts', {}), window.apiCall('get_contract_templates', {}), window.apiCall('get_contract_modalities', {}) ]); if (resCont && resCont.success) { setContracts(resCont.contracts || []); } if (resTpl && resTpl.success) { const list = resTpl.templates || []; setDbTemplates(list); } if (resMod && resMod.success) { const modOpts = resMod.modalities || []; setModalities(modOpts); if (modOpts.length > 0 && !selectedModalityCode) { setSelectedModalityCode(modOpts[0].code || 'indeterminado'); } } } catch (err) { console.error("Error al cargar datos de contratos:", err); } }; useEffect(() => { loadAllData(); }, []); // 1. Plantillas filtradas para esta empresa por régimen const availableTemplates = useMemo(() => { return dbTemplates.filter(t => t.tax_regime === companyRegime || isMaster); }, [dbTemplates, companyRegime, isMaster]); // 2. Plantillas filtradas ESTRICTAMENTE por la Modalidad Activa seleccionada const templatesBySelectedModality = useMemo(() => { return availableTemplates.filter(t => { const tCode = (t.contract_type || 'indeterminado').toLowerCase().trim(); const mCode = (selectedModalityCode || 'indeterminado').toLowerCase().trim(); return tCode === mCode; }); }, [availableTemplates, selectedModalityCode]); // Sincronizar selectedTemplateId cuando cambia la modalidad useEffect(() => { if (templatesBySelectedModality.length > 0) { const exists = templatesBySelectedModality.some(t => String(t.id) === String(selectedTemplateId)); if (!exists) { setSelectedTemplateId(String(templatesBySelectedModality[0].id)); } } else { setSelectedTemplateId(''); } }, [templatesBySelectedModality, selectedModalityCode]); const numeroALetrasCordobas = (num) => { const valor = parseFloat(num) || 0; return `${valor.toLocaleString('es-NI', { minimumFractionDigits: 2 })} CÓRDOBAS NETOS`; }; // Obtener la plantilla activa const getActiveTemplateHtml = (tplId = null) => { const targetId = tplId || selectedTemplateId; const found = dbTemplates.find(t => String(t.id) === String(targetId)); if (found && found.template_html) return found.template_html; if (templatesBySelectedModality.length > 0) return templatesBySelectedModality[0].template_html; return `

CONTRATO INDIVIDUAL DE TRABAJO

Contrato entre {{EMPRESA_NOMBRE}} y {{EMPLEADO_NOMBRE}}.

`; }; // Compilar e inyectar variables de forma limpia const compileContractHtml = (user, customTplId = null, customModalityCode = null) => { let tpl = getActiveTemplateHtml(customTplId); const salary = parseFloat(user?.baseSalary || 0).toFixed(2); const days = Array.isArray(user?.scheduleDays) ? user.scheduleDays.join(', ').toUpperCase() : 'LUNES A VIERNES'; const sabadoSchedule = user?.saturdaySchedule ? `${user?.saturdayScheduleStart || '08:00'} a ${user?.saturdayScheduleEnd || '12:00'}` : ''; const empName = ownerName || window.SHIFT_CONFIG?.contactName || 'REPRESENTANTE LEGAL'; const empRuc = rucNumber || 'J0000000000000'; const empBizName = companyName || window.SHIFT_CONFIG?.companyName || 'EMPRESA CONTRATANTE'; const empCedula = legalRepId || '000-000000-0000A'; const empDir = businessAddress || 'Sede Comercial de la Empresa'; const empMuni = municipality || 'Managua'; const modCode = customModalityCode || selectedModalityCode || 'indeterminado'; const modObj = modalities.find(m => m.code === modCode); const modalityLabel = modObj ? modObj.name : 'Tiempo Indeterminado'; const variables = { '{{EMPRESA_NOMBRE}}': empBizName, '{{EMPRESA_RUC}}': empRuc, '{{EMPRESA_DIRECCION}}': empDir, '{{REPRESENTANTE_NOMBRE}}': empName, '{{REPRESENTANTE_CEDULA}}': empCedula, '{{REPRESENTANTE_ESTADO_CIVIL}}': ownerCivilStatus, '{{LUGAR_TRABAJO}}': empDir, '{{MUNICIPIO}}': empMuni, '{{FECHA_HOY}}': window.formatDateToNIC(window.getNICDate()), '{{EMPLEADO_NOMBRE}}': user?.name || 'NOMBRE DEL COLABORADOR', '{{EMPLEADO_CEDULA}}': user?.idCard || user?.id_card || '000-000000-0000X', '{{EMPLEADO_ESTADO_CIVIL}}': user?.civilStatus || user?.civil_status || 'Soltero(a)', '{{EMPLEADO_PROFESION}}': user?.profession || 'Trabajador(a)', '{{EMPLEADO_DIRECCION}}': user?.homeAddress || user?.home_address || 'Managua, Nicaragua', '{{EMPLEADO_CARGO}}': (user?.positionTitle || user?.position_title || user?.role || 'Colaborador').toUpperCase(), '{{SALARIO_NUMEROS}}': salary, '{{SALARIO_LETRAS}}': numeroALetrasCordobas(salary), '{{FORMA_PAGO}}': (user?.paymentFrequency || user?.payment_frequency || 'Quincenal').toUpperCase(), '{{DIAS_TRABAJO}}': days, '{{HORARIO_TRABAJO}}': `${user?.scheduleStart || '08:00'} a ${user?.scheduleEnd || '17:00'}`, '{{HORARIO_SABADO}}': sabadoSchedule, '{{FECHA_INGRESO}}': window.formatDateToNIC(user?.hiringDate || user?.hiring_date || window.getNICDate()), '{{MODALIDAD_CONTRATO}}': modalityLabel }; Object.keys(variables).forEach(k => { tpl = tpl.split(k).join(variables[k]); }); return tpl; }; const handleGenerateContract = (u) => { if (templatesBySelectedModality.length === 0) { const modObj = modalities.find(m => m.code === selectedModalityCode); alert(`⚠️ No hay ninguna plantilla registrada para la modalidad "${modObj?.name || selectedModalityCode}".\n\nPor favor ve a la pestaña "Plantillas", crea o duplica una plantilla y asígnala a esta modalidad.`); return; } setSelectedUser(u); setEditingContractId(null); const compiled = compileContractHtml(u, selectedTemplateId, selectedModalityCode); setShowEditorModal(true); setTimeout(() => { if (editorRef.current) editorRef.current.innerHTML = compiled; }, 100); }; const handleOpenEditExistingContract = (cnt) => { const linkedUser = globalUsers.find(u => Number(u.id) === Number(cnt.user_id)) || { name: cnt.employee_name, positionTitle: cnt.position_title }; setSelectedUser(linkedUser); setEditingContractId(cnt.id); setShowEditorModal(true); setTimeout(() => { if (editorRef.current) editorRef.current.innerHTML = cnt.contract_html; }, 100); }; const handleLiveTemplateChange = (tplId, modCode) => { setSelectedTemplateId(tplId); setSelectedModalityCode(modCode); if (selectedUser && editorRef.current) { const compiled = compileContractHtml(selectedUser, tplId, modCode); editorRef.current.innerHTML = compiled; } }; const handleInsertVariable = (variableTag, isTemplate = false) => { const targetRef = isTemplate ? templateEditorRef : editorRef; if (!targetRef.current) return; if (isTemplate) { document.execCommand('insertText', false, variableTag); } else { const tempUser = selectedUser || {}; const salary = parseFloat(tempUser.baseSalary || 0).toFixed(2); const modObj = modalities.find(m => m.code === selectedModalityCode); const modalityLabel = modObj ? modObj.name : 'Tiempo Indeterminado'; const map = { '{{EMPRESA_NOMBRE}}': companyName || 'EMPRESA CONTRATANTE', '{{EMPRESA_RUC}}': rucNumber || 'J0000000000000', '{{REPRESENTANTE_NOMBRE}}': ownerName || 'REPRESENTANTE LEGAL', '{{REPRESENTANTE_CEDULA}}': legalRepId || '000-000000-0000A', '{{REPRESENTANTE_ESTADO_CIVIL}}': ownerCivilStatus, '{{EMPRESA_DIRECCION}}': businessAddress || 'Sede Central', '{{MUNICIPIO}}': municipality || 'Managua', '{{EMPLEADO_NOMBRE}}': tempUser.name || 'NOMBRE DEL COLABORADOR', '{{EMPLEADO_CEDULA}}': tempUser.idCard || tempUser.id_card || '000-000000-0000X', '{{EMPLEADO_ESTADO_CIVIL}}': tempUser.civilStatus || 'Soltero(a)', '{{EMPLEADO_PROFESION}}': tempUser.profession || 'Trabajador(a)', '{{EMPLEADO_DIRECCION}}': tempUser.homeAddress || 'Managua, Nicaragua', '{{EMPLEADO_CARGO}}': (tempUser.positionTitle || tempUser.role || 'Colaborador').toUpperCase(), '{{SALARIO_NUMEROS}}': salary, '{{SALARIO_LETRAS}}': numeroALetrasCordobas(salary), '{{FORMA_PAGO}}': (tempUser.paymentFrequency || 'Quincenal').toUpperCase(), '{{FECHA_INGRESO}}': window.formatDateToNIC(tempUser.hiringDate || window.getNICDate()), '{{FECHA_HOY}}': window.formatDateToNIC(window.getNICDate()), '{{MODALIDAD_CONTRATO}}': modalityLabel }; document.execCommand('insertText', false, map[variableTag] || variableTag); } }; const handleSaveAndPrintContract = async () => { const htmlContent = editorRef.current ? editorRef.current.innerHTML : ''; if (!htmlContent.trim()) return showToast("El contrato no puede estar vacío."); setIsSavingContract(true); const payload = { id: editingContractId, userId: selectedUser ? selectedUser.id : null, employeeName: selectedUser ? selectedUser.name : 'Contrato Emitido', positionTitle: selectedUser ? (selectedUser.positionTitle || selectedUser.role || 'General') : 'General', taxRegime: companyRegime, contractHtml: htmlContent }; const res = await window.apiCall('save_contract_document', payload); setIsSavingContract(false); if (res && res.success) { showToast("Contrato guardado en el expediente exitosamente."); setShowEditorModal(false); loadAllData(); if (refreshData) await refreshData(); handlePrintClean(htmlContent, selectedUser?.name); } else { showToast("Error al guardar contrato."); } }; // ELIMINACIÓN SEGURA CON PIN O CLAVE const handleExecuteSecureDelete = async () => { if (!securityPass.trim()) { return alert("Debes ingresar tu contraseña o PIN para autorizar la eliminación."); } setIsDeletingContract(true); try { const res = await window.apiCall('delete_contract_secure', { id: deleteTargetContract.id, password: securityPass, userId: currentUser?.id }); if (res && res.success) { showToast("Expediente eliminado con éxito."); setDeleteTargetContract(null); setSecurityPass(''); loadAllData(); } else { alert(res?.error || "Contraseña o PIN incorrecto."); } } catch (e) { alert("Error al eliminar expediente: " + e.message); } finally { setIsDeletingContract(false); } }; // CRUD PLANTILLAS const handleOpenCreateTemplate = () => { setEditingTemplate(null); setTemplateTitle('Nueva Plantilla de Contrato'); setTemplateType(selectedModalityCode || 'indeterminado'); setIsEditingMasterGlobal(false); setShowTemplateModal(true); setTimeout(() => { if (templateEditorRef.current) { templateEditorRef.current.innerHTML = getActiveTemplateHtml(); } }, 100); }; const handleOpenEditTemplate = (tpl) => { setEditingTemplate(tpl); setTemplateTitle(tpl.title); setTemplateType(tpl.contract_type || 'indeterminado'); setIsEditingMasterGlobal(Number(tpl.client_id) === 0); setShowTemplateModal(true); setTimeout(() => { if (templateEditorRef.current) { templateEditorRef.current.innerHTML = tpl.template_html; } }, 100); }; const handleDuplicateTemplate = (tpl) => { setEditingTemplate(null); setTemplateTitle(`${tpl.title} (Copia Personalizada)`); setTemplateType(tpl.contract_type || 'indeterminado'); setIsEditingMasterGlobal(false); setShowTemplateModal(true); setTimeout(() => { if (templateEditorRef.current) { templateEditorRef.current.innerHTML = tpl.template_html; } }, 100); }; const handleSaveTemplateToDB = async () => { const htmlContent = templateEditorRef.current ? templateEditorRef.current.innerHTML : ''; if (!htmlContent.trim()) return showToast("La plantilla no puede estar vacía."); const payload = { id: editingTemplate ? editingTemplate.id : null, templateKey: `${companyRegime}_${templateType}_${Date.now()}`, title: templateTitle, taxRegime: companyRegime, contractType: templateType, templateHtml: htmlContent, isMasterGlobal: isEditingMasterGlobal && isMaster }; const res = await window.apiCall('save_contract_template', payload); if (res && res.success) { showToast("Plantilla guardada en base de datos."); setShowTemplateModal(false); loadAllData(); } else { showToast("Error al guardar plantilla."); } }; const handleDeleteTemplate = async (tplId) => { if (!confirm("¿Deseas eliminar esta plantilla personalizada?")) return; const res = await window.apiCall('delete_contract_template', { id: tplId }); if (res && res.success) { showToast("Plantilla eliminada."); loadAllData(); } }; // CRUD MODALIDADES const handleSaveModality = async (e) => { e.preventDefault(); const fd = new FormData(e.target); const name = fd.get('name'); const code = fd.get('code'); try { const res = await window.apiCall('save_contract_modality', { id: editingModality?.id, name, code, isMasterGlobal: isMaster }); if (res && res.success) { showToast("Modalidad guardada."); setShowModalityModal(false); setEditingModality(null); loadAllData(); } } catch (err) { alert("Error: " + err.message); } }; const handleDeleteModality = async (id) => { if (!confirm("¿Deseas eliminar esta modalidad?")) return; try { const res = await window.apiCall('delete_contract_modality', { id }); if (res && res.success) { showToast("Modalidad eliminada."); loadAllData(); } } catch (e) { alert("Error: " + e.message); } }; // DATOS FISCALES DEL EMPLEADOR const handleSaveEmployerData = async (e) => { e.preventDefault(); const payload = { company_name: companyName, tax_regime: companyRegime, ruc_number: rucNumber, owner_name: ownerName, legal_rep_id: legalRepId, business_address: businessAddress, municipality: municipality }; const res = await window.apiCall('save_employer_tax_data', payload); if (res && res.success) { if (window.SHIFT_CONFIG) { window.SHIFT_CONFIG.companyName = companyName; } showToast("Datos fiscales actualizados y sincronizados con éxito."); if (refreshData) await refreshData(); } else { showToast("Error: " + (res?.error || "No se pudo sincronizar")); } }; // IMPRESIÓN LIMPIA MEDIANTE IFRAME const handlePrintClean = (htmlContent, docTitle = 'Contrato') => { const iframe = document.createElement('iframe'); iframe.style.position = 'fixed'; iframe.style.right = '0'; iframe.style.bottom = '0'; iframe.style.width = '0'; iframe.style.height = '0'; iframe.style.border = '0'; document.body.appendChild(iframe); const doc = iframe.contentWindow.document; doc.open(); doc.write(` ${docTitle} ${htmlContent} `); doc.close(); iframe.contentWindow.focus(); setTimeout(() => { iframe.contentWindow.print(); setTimeout(() => document.body.removeChild(iframe), 1000); }, 300); }; return (
{/* BARRA SUPERIOR DE SUB-PESTAÑAS */}

Contratos Individuales de Trabajo

Régimen Asignado: {isCuotaFija ? 'Cuota Fija (Persona Natural)' : 'Régimen General'}

{!isReadOnly && ( )}
{/* SUB-PESTAÑA 1: EMITIR CONTRATOS A COLABORADORES */} {subTab === 'emit' && (

Colaboradores en Nómina

Selecciona la modalidad para filtrar las plantillas disponibles y emitir el contrato

{/* SELECTOR DE MODALIDAD (FILTRO PRINCIPAL) */}
Modalidad:
{/* SELECTOR DE PLANTILLA (FILTRADA POR LA MODALIDAD) */}
Plantilla:
{globalUsers.map(u => (

{u.name}

@{u.alias} • {u.positionTitle || u.role}

C$ {parseFloat(u.baseSalary || 0).toLocaleString('en-US', { minimumFractionDigits: 2 })}

))}
)} {/* SUB-PESTAÑA 2: GESTOR DE PLANTILLAS */} {subTab === 'templates' && (

Plantillas Guardadas en Base de Datos

Cada plantilla está vinculada a una modalidad de contrato y al régimen de la empresa.

{availableTemplates.map(t => { const isMasterTpl = Number(t.client_id) === 0; const modObj = modalities.find(m => m.code === t.contract_type); const modLabel = modObj ? modObj.name : (t.contract_type || 'Indeterminado'); return (
{isMasterTpl ? 'Plantilla Máster Global' : 'Personalizada de Empresa'} {modLabel}

{t.title}

Régimen: {t.tax_regime.toUpperCase()}

{!isReadOnly && ( )} {!isReadOnly && (isMaster || !isMasterTpl) && ( )} {!isReadOnly && !isMasterTpl && ( )}
); })}
)} {/* SUB-PESTAÑA 3: MODALIDADES PERSONALIZABLES */} {subTab === 'modalidades' && (

Modalidades de Contratación

Configura las modalidades disponibles para los contratos de tu empresa.

{!isReadOnly && ( )}
{modalities.map(m => (

{m.name}

Código: {m.code}

{!isReadOnly && (
{m.code !== 'indeterminado' && ( )}
)}
))}
)} {/* SUB-PESTAÑA 4: EXPEDIENTES / HISTORIAL */} {subTab === 'history' && (

Expedientes Guardados en Servidor

{contracts.length === 0 ? (

No hay contratos guardados aún.

) : (
{contracts.map(c => (

{c.employee_name}

{c.position_title} • Régimen: {c.tax_regime ? c.tax_regime.toUpperCase() : 'GENERAL'}

Guardado: {window.formatNICTimeFull ? window.formatNICTimeFull(c.created_at) : new Date(Number(c.created_at)).toLocaleString()}

{!isReadOnly && ( )} {!isReadOnly && ( )}
))}
)}
)} {/* SUB-PESTAÑA 5: DATOS DEL NEGOCIO / EMPLEADOR */} {subTab === 'employer_data' && (

Datos Fiscales del Empleador (Negocio)

Estos datos alimentan automáticamente las cláusulas legales de todos los contratos.

setCompanyName(e.target.value)} disabled={isReadOnly} className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
setRucNumber(e.target.value)} disabled={isReadOnly} placeholder="J0310000000001" className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
setOwnerName(e.target.value)} disabled={isReadOnly} placeholder="Nombre del representante" className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
setLegalRepId(e.target.value)} disabled={isReadOnly} placeholder="001-000000-0000A" className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
setMunicipality(e.target.value)} disabled={isReadOnly} placeholder="Managua" className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
setBusinessAddress(e.target.value)} disabled={isReadOnly} placeholder="Dirección exacta del negocio..." className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none disabled:opacity-60" required />
{!isReadOnly && ( )}
)} {/* MODAL EDITOR VISUAL WYSIWYG AUTORRELLENADO CON SELECTORES EN VIVO */} {showEditorModal && (

Emisión de Contrato: {selectedUser?.name}

Todos los datos han sido autocompletados. Cambia la modalidad o plantilla para ver los cambios.

Modalidad:
Plantilla:

Datos del Empleador

{[ { label: 'Nombre Negocio', tag: '{{EMPRESA_NOMBRE}}' }, { label: 'RUC', tag: '{{EMPRESA_RUC}}' }, { label: 'Representante', tag: '{{REPRESENTANTE_NOMBRE}}' }, { label: 'Cédula Rep.', tag: '{{REPRESENTANTE_CEDULA}}' }, { label: 'Dirección Comercial', tag: '{{EMPRESA_DIRECCION}}' }, { label: 'Municipio', tag: '{{MUNICIPIO}}' } ].map(v => ( ))}

Datos del Colaborador

{[ { label: 'Nombre Completo', tag: '{{EMPLEADO_NOMBRE}}' }, { label: 'Cédula', tag: '{{EMPLEADO_CEDULA}}' }, { label: 'Estado Civil', tag: '{{EMPLEADO_ESTADO_CIVIL}}' }, { label: 'Profesión', tag: '{{EMPLEADO_PROFESION}}' }, { label: 'Domicilio', tag: '{{EMPLEADO_DIRECCION}}' }, { label: 'Cargo', tag: '{{EMPLEADO_CARGO}}' }, { label: 'Salario (Números)', tag: '{{SALARIO_NUMEROS}}' }, { label: 'Salario (Letras)', tag: '{{SALARIO_LETRAS}}' }, { label: 'Frecuencia Pago', tag: '{{FORMA_PAGO}}' }, { label: 'Fecha Ingreso', tag: '{{FECHA_INGRESO}}' }, { label: 'Fecha Hoy', tag: '{{FECHA_HOY}}' }, { label: 'Modalidad', tag: '{{MODALIDAD_CONTRATO}}' } ].map(v => ( ))}
)} {/* MODAL GESTIÓN DE PLANTILLAS */} {showTemplateModal && (

{editingTemplate ? `Editar: ${templateTitle}` : 'Nueva Plantilla de Contrato'}

{isEditingMasterGlobal ? 'Guardará la Plantilla Máster Global (client_id = 0)' : 'Guardará una Plantilla Personalizada para tu Empresa'}

setTemplateTitle(e.target.value)} className="w-full p-3 bg-white border rounded-xl font-bold text-xs outline-none" required />

Variables Dinámicas

{[ '{{EMPRESA_NOMBRE}}', '{{EMPRESA_RUC}}', '{{REPRESENTANTE_NOMBRE}}', '{{REPRESENTANTE_CEDULA}}', '{{REPRESENTANTE_ESTADO_CIVIL}}', '{{EMPRESA_DIRECCION}}', '{{MUNICIPIO}}', '{{EMPLEADO_NOMBRE}}', '{{EMPLEADO_CEDULA}}', '{{EMPLEADO_ESTADO_CIVIL}}', '{{EMPLEADO_PROFESION}}', '{{EMPLEADO_DIRECCION}}', '{{EMPLEADO_CARGO}}', '{{SALARIO_NUMEROS}}', '{{SALARIO_LETRAS}}', '{{FORMA_PAGO}}', '{{DIAS_TRABAJO}}', '{{HORARIO_TRABAJO}}', '{{HORARIO_SABADO}}', '{{FECHA_INGRESO}}', '{{FECHA_HOY}}', '{{MODALIDAD_CONTRATO}}' ].map(tag => ( ))}
)} {/* MODAL VISTA PREVIA DE PLANTILLA */} {previewTemplateItem && (
setPreviewTemplateItem(null)}>
e.stopPropagation()}>

Vista Previa: {previewTemplateItem.title}

Muestra cómo se verá el documento con datos de ejemplo

)} {/* MODAL VISTA PREVIA DE EXPEDIENTE */} {previewContract && (
setPreviewContract(null)}>
e.stopPropagation()}>

{previewContract.employee_name}

)} {/* MODAL DE ELIMINACIÓN SEGURA CON PIN O CLAVE */} {deleteTargetContract && (
setDeleteTargetContract(null)}>
e.stopPropagation()}>

Autorizar Eliminación de Expediente

¿Estás seguro de eliminar el contrato de {deleteTargetContract.employee_name}?

setSecurityPass(e.target.value)} placeholder="••••••••" className="w-full p-3.5 bg-slate-50 border rounded-2xl font-bold text-xs outline-none focus:border-red-500" autoFocus />
)} {/* MODAL CREAR/EDITAR MODALIDAD */} {showModalityModal && (
setShowModalityModal(false)}>
e.stopPropagation()}>

{editingModality ? "Editar Modalidad" : "Nueva Modalidad de Contrato"}

)}
); };