Free Cancer Group
Apertura de HistoriaRegistro clínico inicial del paciente
← Volver al Panel Médico

Apertura de Historia

Datos permanentes del paciente separados de cada sesión de tratamiento para evitar repetir información y acelerar el registro.

FREE CANCER GROUP
Gestión Oncológica
⚕

Profesional responsable de la apertura

Identificado automáticamente mediante Firebase Authentication.

AUTOMÁTICO
Identidad de la sesiónNo seleccionadoRegistra los médicos desde Certificados.
Selecciona el médico de turno antes de abrir o guardar una ficha.
Identificación de la fichaDatos automáticos · no se escriben manualmente
N.º DE FICHANueva · pendiente de guardar
CREADAAl guardar
ESTADORegistrada al guardar
ÚLTIMA ACTUALIZACIÓNAún no guardada
🔎

Seleccionar paciente

Busca por nombre, cédula o teléfono. Los datos registrados se completan automáticamente.

DATOS MAESTROS
——
👤

1. Datos completos del paciente

Se completan desde PACIENTES · toca para ver los detalles.

AUTOMÁTICO
🩺 Signos vitales de Enfermería (solo lectura, no se copian en Apertura)
🩺

Signos vitales de Enfermería

Estos datos solo se consultan. No forman parte de Apertura.

SOLO LECTURA

No se ha confirmado la conexión con los registros de Enfermería. Consulte el módulo de Enfermería para verificar los controles.

Resumen oncológico
Paciente—
Edad—
Diagnóstico—
Estadio—
Ciclo actual—
Consulta inicial: selecciona el paciente y completa únicamente la información clínica disponible. Los campos clínicos pueden dejarse vacíos y guardar la Apertura para continuar después, dentro del plazo de edición permitido. Se requiere seleccionar al paciente y tener una sesión médica autorizada. No se deben inventar datos para completar campos. Para consultas posteriores utiliza Seguimiento.
📋

Antecedentes relevantes

Registrar únicamente los antecedentes pertinentes.

Un solo cuadro de escritura. No se registran tratamientos propuestos como si ya se hubieran administrado.
🩺

2. Motivo de consulta

Razón principal de la atención.

📝

3. Enfermedad actual

Descripción y evolución del problema actual.

🩺

4. Examen físico

Hallazgos de exploración de la consulta inicial.

🔬

5. Estudios realizados

Escriba aquí directamente los estudios previos y sus resultados. Sin formularios adicionales.

🎗️

6. Diagnóstico oncológico

Registra el diagnóstico una vez; las siguientes consultas van en Consultas y evolución.

DATOS PERMANENTES
No encuentro mi diagnóstico → Escribir manualmente

Puedes registrar el diagnóstico aunque no aparezca en el buscador. Si conoces su código, escríbelo; quedará pendiente de verificar.

¿Para qué sirve el código? / Otras clasificacionesEl CIE-10 identifica el diagnóstico en la historia médica y documentos. Escribe, por ejemplo, «mama» y elige la localización correcta. Para registros especiales, en «Clasificación» puedes cambiar a CIE-O-3.2 (tipos de tumor) o CIE-11. No tienes que usar las tres. El CIE-10 es el código principal; las otras clasificaciones son opcionales. Los catálogos se muestran con las descripciones en español disponibles y verificadas por coincidencia de código; algunos códigos no están incluidos en esta edición.
ECOG · selección rápida

ECOG sin valorar. Selecciona un valor según la evaluación médica.

Estadificación oncológica (TNM y estadio)

Estadificación

Documenta TNM y estadio según los estudios disponibles. Si no está determinado, déjalo pendiente; no se inventa.

Solo si se conoce. No repetir la fecha en cada consulta.
Estado funcional — Karnofsky

Karnofsky

Se registra cuando el médico evalúa el estado funcional. La fecha se indica solo si corresponde a una evaluación anterior.

Seleccione un valor para ver su significado.
¿La valoración Karnofsky fue en otra fecha? (opcional)Si se evalúa hoy, no completes este campo: se usa la fecha de atención.
💉

7. Plan terapéutico inicial

Decisiones y plan clínico de la primera consulta. Las prescripciones se gestionan en Órdenes Médicas.

SESIÓN
Consulta inicial: registra el plan propuesto y las indicaciones. Los datos de tratamiento se consignan solo cuando correspondan; este apartado no emite órdenes ni certifica administración de medicamentos.
Fórmula Mosteller · ingresa peso (kg) y talla (cm).
AUC · Carboplatino · Cálculo de Calvert

Elija cómo incorporar la función renal. La doctora debe confirmar los datos utilizados.

Seleccione el método e introduzca los parámetros. Cálculo orientativo · Requiere validación médica antes de su uso clínico.

Plan, conducta y control médico recomendado

Datos del plan histórico (fichas anteriores)

Evolución / plan

Fecha histórica de control del plan original (opcional)Para una consulta nueva utiliza solo «Próximo control» al final de la sesión. Este campo se conserva para consultar planes anteriores.
📋 Ver resumen oncológico Se genera con los datos que has registrado
`; const w=window.open('','_blank'); if(!w){notify('El navegador bloqueó la ventana del PDF. Permite ventanas emergentes para esta página.',true);return;} w.document.open();w.document.write(html);w.document.close(); w.focus(); // Captura de firma manuscrita, únicamente en la ventana de impresión; no se guarda en Firebase. const doc=w.document,canvas=doc.getElementById('medSignaturePad'),img=doc.getElementById('medSignatureImage'); const ctx=canvas.getContext('2d');ctx.lineWidth=2.5;ctx.lineCap='round';ctx.lineJoin='round';ctx.strokeStyle='#142b3e'; let drawing=false,hasSignature=false; function position(e){const r=canvas.getBoundingClientRect();return {x:(e.clientX-r.left)*canvas.width/r.width,y:(e.clientY-r.top)*canvas.height/r.height};} canvas.addEventListener('pointerdown',e=>{drawing=true;canvas.setPointerCapture(e.pointerId);const p=position(e);ctx.beginPath();ctx.moveTo(p.x,p.y);ctx.lineTo(p.x+0.1,p.y+0.1);ctx.stroke();hasSignature=true;}); canvas.addEventListener('pointermove',e=>{if(!drawing)return;const p=position(e);ctx.lineTo(p.x,p.y);ctx.stroke();}); ['pointerup','pointercancel','lostpointercapture'].forEach(type=>canvas.addEventListener(type,()=>{drawing=false;})); doc.getElementById('medClearSignature').addEventListener('click',()=>{ctx.clearRect(0,0,canvas.width,canvas.height);hasSignature=false;img.removeAttribute('src');img.classList.remove('signed');doc.getElementById('medUnsigned').classList.remove('signed');}); doc.getElementById('medPrintButton').addEventListener('click',()=>{if(hasSignature){img.src=canvas.toDataURL('image/png');img.classList.add('signed');doc.getElementById('medUnsigned').classList.add('signed');}else{img.classList.remove('signed');doc.getElementById('medUnsigned').classList.remove('signed');}w.focus();w.print();}); } $('fcg47PrintMeds')?.addEventListener('click',fcg47PrintMedications); function addMedication(){ if(!fcg45EditingMedId && String(patientId)==='FCG-PRUEBA-ONCOLOGICA-LOCAL-2026' && !editingId && ($('medNombre')?.value||'').includes('MEDICAMENTO FICTICIO A')){notify('El medicamento ficticio ya está en la tabla como PENDIENTE. No lo dupliques.');return;} if(!patientId){alert('Selecciona un paciente en la ficha antes de guardar el medicamento.');return;} const nombre=$('medNombre').value.trim(),dosis=$('medDosis').value.trim();if(!nombre||!dosis)return notify('Ingresa medicamento y dosis.',true); const arr=allMeds();const old=fcg45EditingMedId?arr.find(m=>String(m.id)===String(fcg45EditingMedId)):null;const updated={ id:old?.id||'MED-'+Date.now(),patientId,recordId:old?.recordId||editingId||'', nombre,dosis,via:$('medVia').value,dilucion:$('medDilucion').value, inicio:$('medInicio').value,fin:$('medFin').value,estado:$('medEstado').value, observacion:$('medObs').value.trim(), presentacion:$('medPresentacion').value.trim(),diluyente:$('medDiluyente').value.trim(), volumen:$('medVolumen').value.trim(),velocidad:$('medVelocidad').value.trim(), responsable:$('medResponsable').value.trim(),reaccion:$('medReaccion').value, fecha:$('medFecha').value,reaccionDetalle:$('medReaccionDetalle').value.trim(), motivoSuspension:$('medMotivoSuspension').value.trim(), createdAt:old?.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString() };if(old){const i=arr.indexOf(old);arr[i]=updated;}else arr.push(updated);save(MED_KEY,arr);fcg45ClearMedEdit(); ['medNombre','medDosis','medDilucion','medInicio','medFin','medObs','medPresentacion','medDiluyente','medVolumen','medVelocidad','medResponsable','medReaccionDetalle','medMotivoSuspension'].forEach(id=>$(id).value=''); $('medEstado').value='Pendiente';$('medReaccion').value='No';$('medFecha').value=today(); $('medReaccionDetalleWrap').style.display='none';$('medSuspensionWrap').style.display='none'; updateMedSummary();notify(old?'Medicamento actualizado sin duplicar.':'Medicamento agregado a esta sesión.'); } function goExpediente(){ if(!patientId)return notify('Selecciona un paciente primero.',true); // Keep this entire live form in memory: no navigation, no data loss. let overlay=document.getElementById('fcg33-expediente-overlay'); if(overlay){overlay.style.display='flex';return;} overlay=document.createElement('section');overlay.id='fcg33-expediente-overlay'; overlay.setAttribute('role','dialog');overlay.setAttribute('aria-modal','true');overlay.setAttribute('aria-label','Expediente clínico completo'); const header=document.createElement('header');header.className='fcg33-exp-header'; const name=document.createElement('strong');name.textContent='📁 Expediente completo · '+($('selNombre')?.textContent||'Paciente'); const back=document.createElement('button');back.type='button';back.className='fcg33-exp-back';back.textContent='← Volver a la ficha sin perder datos'; const frame=document.createElement('iframe');frame.className='fcg33-exp-frame';frame.title='Expediente clínico';frame.setAttribute('sandbox','allow-scripts allow-same-origin allow-forms allow-downloads'); frame.src='./expediente.html?embedded=1&pacienteId='+encodeURIComponent(patientId); const exit=()=>{overlay.remove();document.body.classList.remove('fcg33-exp-open');window.removeEventListener('keydown',escExit)}; const escExit=e=>{if(e.key==='Escape')exit()};back.addEventListener('click',exit); const closeMsg=e=>{if(e.origin===location.origin && e.source===frame.contentWindow && e.data?.type==='FCG_CLOSE_EXPEDIENTE')exit()}; window.addEventListener('message',closeMsg,{once:true}); header.append(name,back);overlay.append(header,frame);document.body.append(overlay); document.body.classList.add('fcg33-exp-open');window.addEventListener('keydown',escExit); frame.focus(); } function goSeguimiento(){if(!patientId)return notify('Selecciona un paciente primero.',true);location.href='seguimiento.html?pacienteId='+encodeURIComponent(patientId)} function notify(msg,error=false){ const n=$('notice');n.textContent=msg;n.style.background=error?'#FFF4F6':'#EFF9F4';n.style.color=error?'#A94158':'#256B51';n.style.borderColor=error?'#F2CCD5':'#CCE8DA';n.classList.add('show');setTimeout(()=>n.classList.remove('show'),3500); } function fieldVal(id){ const el=$(id);if(!el)return ''; return String(el.value||'').trim(); } function pdfCell(label,value,cls=''){ if(!value)return ''; return `
${esc(label)}${esc(value)}
`; } function buildPrintReport(){ const p=patients().find(x=>String(x.id)===String(patientId)); const r=currentRecord(); const name=p?patientName(p):fieldVal('nombreCompleto')||'Paciente'; const number=r?.numero ? String(r.numero).padStart(3,'0') : (fieldVal('numeroFicha')||'Borrador'); const created=r?.createdAt ? r.createdAt.slice(0,16).replace('T',' ') : (fieldVal('fechaCreacion')||new Date().toLocaleString()); const status=r?.estado || fieldVal('estadoFicha') || 'Registrada'; const alerts=[]; if(fieldVal('alergias')) alerts.push('ALERGIAS: '+fieldVal('alergias')); if(fieldVal('metastasis')==='Sí') alerts.push('METÁSTASIS REGISTRADA'); if(fieldVal('ecog')) alerts.push('ECOG '+fieldVal('ecog')); if(fieldVal('cateter') && fieldVal('cateter')!=='No') alerts.push('ACCESO: '+fieldVal('cateter')); if(fieldVal('eventoAdverso')==='Sí') alerts.push('EVENTO ADVERSO'); const html=`
Free Cancer Group

FICHA ONCOLÓGICA

Registro clínico estructurado · Free Cancer Group

N.º ficha${esc(number)}
Estado${esc(status)}
Fecha atención${esc(fieldVal('fechaAtencion')||'—')}
Creada${esc(created)}
Paciente${esc(name)}
Cédula${esc(fieldVal('cedula')||'—')}
Edad${esc(fieldVal('edad')||'—')}
Teléfono${esc(fieldVal('telefono')||'—')}
${alerts.length?`
${alerts.map(a=>`${esc(a)}`).join('')}
`:''}
1. Diagnóstico oncológico
${pdfCell('Diagnóstico principal',fieldVal('diagnostico'),'w2')} ${pdfCell('Fecha diagnóstico',fieldVal('fechaDiagnostico'))} ${pdfCell('Médico tratante',fieldVal('medicoTratante'))} ${pdfCell('Estadio',fieldVal('estadio'))} ${pdfCell('TNM',fieldVal('tnmGlobal'))} ${pdfCell('T',fieldVal('tnmT'))} ${pdfCell('N',fieldVal('tnmN'))} ${pdfCell('M',fieldVal('tnmM'))} ${pdfCell('Estadio clínico',fieldVal('estadioClinico'))} ${pdfCell('Estadio patológico',fieldVal('estadioPatologico'))} ${pdfCell('Anatomía patológica',fieldVal('apResultado'),'w4')} ${pdfCell('Códigos diagnósticos',cieSeleccionados.map(c=>[c.clasificacion,c.codigo,c.descripcion].filter(Boolean).join(' — ')).join(' | '),'w4')} ${pdfCell('Metástasis',fieldVal('metastasis'))} ${pdfCell('ECOG',fieldVal('ecog'))} ${pdfCell('Seguro',fieldVal('seguro'))} ${pdfCell('Localización / extensión',fieldVal('localizacion'),'w2')} ${pdfCell('Alergias',fieldVal('alergias'),'w2')} ${pdfCell('Patología / biomarcadores',fieldVal('patologia'),'w4')} ${pdfCell('Antecedentes relevantes',fieldVal('antecedentes'),'w4')} ${pdfCell('Antecedentes familiares oncológicos',fieldVal('antecedentesFamiliaresOnco'),'w4')} ${pdfCell('Tratamientos oncológicos previos',fieldVal('tratamientosPreviosTexto'),'w4')} ${pdfCell('Antecedentes gineco-obstétricos',fieldVal('antecedentesGineco'),'w4')} ${pdfCell('Hábitos y exposiciones',fieldVal('habitosExposiciones'),'w4')} ${pdfCell('Motivo de consulta',fieldVal('motivoConsulta'),'w2')} ${pdfCell('Enfermedad actual',fieldVal('enfermedadActual'),'w4')} ${pdfCell('Examen físico',fieldVal('examenFisico'),'w4')} ${pdfCell('5. Estudios realizados',fieldVal('estudiosRealizadosLibre'),'w4')}
2. Plan terapéutico inicial y datos de la atención de apertura
${pdfCell('Ciclo',fieldVal('ciclo'))} ${pdfCell('Tipo de tratamiento',fieldVal('tipoTratamiento'))} ${pdfCell('Estado de sesión',fieldVal('estadoSesion'))} ${pdfCell('Acceso venoso / catéter',fieldVal('cateter'))} ${pdfCell('Esquema / protocolo',fieldVal('esquema'),'w2')} ${pdfCell('Peso',fieldVal('peso') ? fieldVal('peso')+' kg':'')} ${pdfCell('Talla',fieldVal('talla') ? fieldVal('talla')+' cm':'')} ${pdfCell('Superficie corporal',fieldVal('sc') ? fieldVal('sc')+' m²':'')}
3. Valoración clínica
${pdfCell('Medicamentos habituales',fieldVal('medicacionActual'),'w2')} ${pdfCell('Síntomas / observaciones',fieldVal('sintomas'),'w4')}
4. Indicaciones conservadas de la apertura (no constituyen órdenes emitidas)
${pdfCell('Premedicación',fieldVal('premedicacion'),'w4')} ${pdfCell('Tratamiento / indicación principal',fieldVal('indicacionesTratamiento'),'w4')} ${pdfCell('Indicaciones post tratamiento',fieldVal('postTratamiento'),'w4')}
5. Datos históricos de enfermería almacenados en apertura (no son controles nuevos)
${pdfCell('Hora inicio',fieldVal('horaInicio'))} ${pdfCell('Hora fin',fieldVal('horaFin'))} ${pdfCell('Tolerancia',fieldVal('tolerancia'))} ${pdfCell('Evento adverso',fieldVal('eventoAdverso'))} ${pdfCell('Evolución / observaciones',fieldVal('evolucionEnfermeria'),'w4')} ${pdfCell('Responsable de enfermería',fieldVal('responsableEnfermeria'),'w4')}
6. Plan e indicaciones iniciales y control recomendado (no cita)
${pdfCell('Plan / conducta',fieldVal('plan'),'w2')} ${pdfCell('Próximo control',fieldVal('proximoControl'))} ${pdfCell('Hora',fieldVal('horaControl'))} ${pdfCell('Indicaciones para casa',fieldVal('indicacionesCasa'),'w4')} ${pdfCell('Responsable clínico',fieldVal('responsableClinico'),'w4')}
7. Medicamentos históricos de la ficha (legado, no confirma administración de Enfermería)
${pdfCell('Medicamentos registrados',String(sessionMeds().length))} ${pdfCell('Administrados',String(sessionMeds().filter(m=>m.estado==='Administrado').length))} ${pdfCell('Pendientes',String(sessionMeds().filter(m=>m.estado==='Pendiente').length))} ${pdfCell('Suspendidos',String(sessionMeds().filter(m=>m.estado==='Suspendido').length))} ${sessionMeds().length?pdfCell('Detalle',sessionMeds().map(m=>`${m.nombre} · ${m.dosis} · ${m.via} · ${m.estado}${m.inicio?' · '+m.inicio:''}${m.fin?'–'+m.fin:''}${m.observacion?' · '+m.observacion:''}`).join('\n'),'w4'):''}
Firma del médico tratante · ${esc(turnDoctor()?.nombre||fieldVal('medicoTratante')||'Sin identificar')}
Espacio para firma manuscrita
Responsable de enfermería
`; // Capture ALL nonempty clinical fields, including fields added in future releases. // Main report is preserved; appendix ensures no populated form field is silently lost. const ignored=new Set(['buscarPaciente','cieBuscar','medNombre','medDosis','medVia','medDilucion','medInicio','medFin','medObs', 'medPresentacion','medDiluyente','medVolumen','medVelocidad','medResponsable','medReaccion','medFecha', 'medReaccionDetalle','medMotivoSuspension','turnDoctorSelect']); const extra=[]; document.querySelectorAll('input[id],select[id],textarea[id]').forEach(el=>{ if(ignored.has(el.id)||el.type==='hidden'||el.type==='password'||el.type==='file'||el.type==='button'||el.type==='submit')return; if(el.closest('#printReport')||el.closest('#fcg33-expediente-overlay')||el.closest('.modal'))return; if((el.type==='checkbox'||el.type==='radio')&&!el.checked)return; let value=el.value?.trim()||''; if(!value)return; const wrap=el.closest('.field');const label=wrap?.querySelector('label')?.textContent?.trim()||el.getAttribute('aria-label')||el.id; extra.push(`
${esc(label)}${esc(value)}
`); }); const annex=extra.length?`
8. Anexo · Verificación íntegra de campos registrados
${extra.join('')}
`:''; const authorName=r?.createdByName||r?.doctorName||turnDoctor()?.nombre||'Profesional no identificado'; const authorUid=r?.createdByUid||r?.doctorUid||sessionDoctor()?.uid||'No consta'; const sig=`

Responsable del registro clínico

${esc(authorName)}

UID del profesional: ${esc(authorUid)}

Fecha del documento: ${esc(new Date().toLocaleString('es-EC'))}

Firma del profesional responsable: _____________________________________
Espacio para firma manuscrita. La impresión o inclusión del nombre no constituye una firma electrónica validada.
`; // Move signature block to the very end, after every section and every recorded field. const complete=html.replace(/
[\s\S]*?<\/div>\s*