feat: paso 3 pre-servicios RCXC/SC y limpieza de código copago

- Agrega paso 3 en automatización: envía RDA desde PRESSERV_DIAN (prefijos RCXC/SC) para pacientes EPS con PS_NUM IS NOT NULL
- Filtra paso 2 con PS_NUM IS NULL para separar particulares/empresas de EPS
- Elimina parámetro copago y función _calcular_descuento_pct (código muerto)
- Limpia referencia a d.copago en automation.html (UI paso 3)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-10 20:43:02 -05:00
co-authored by Claude Sonnet 4.6
parent c20e1a7476
commit c2a092c0e7
3 changed files with 155 additions and 17 deletions
+33 -3
View File
@@ -48,7 +48,7 @@
<span id="preview-fecha" class="text-sm text-gray-500"></span>
</div>
<div class="p-6 space-y-4">
<div class="grid grid-cols-3 gap-4">
<div class="grid grid-cols-4 gap-4">
<div class="bg-blue-50 rounded-lg p-4 text-center">
<div id="cnt-pacientes" class="text-3xl font-bold text-blue-600">0</div>
<div class="text-sm text-blue-700 mt-1">Pacientes</div>
@@ -61,6 +61,11 @@
<div id="cnt-examenes" class="text-3xl font-bold text-green-600">0</div>
<div class="text-sm text-green-700 mt-1">Exámenes</div>
</div>
<div class="bg-orange-50 rounded-lg p-4 text-center">
<div id="cnt-preservicios" class="text-3xl font-bold text-orange-600">0</div>
<div class="text-sm text-orange-700 mt-1">Pre-servicios</div>
<div class="text-xs text-orange-400">RCXC / SC</div>
</div>
</div>
<div>
<p class="text-xs font-medium text-gray-600 mb-2">Pacientes — clic para ver sus recepciones:</p>
@@ -91,6 +96,16 @@
</div>
<div id="p2-detalle" class="divide-y divide-gray-100 hidden"></div>
</div>
<div class="bg-white rounded-xl shadow-sm border border-gray-200">
<div class="px-6 py-4 border-b border-gray-200 flex items-center justify-between">
<div class="flex items-center gap-3">
<div class="w-8 h-8 bg-orange-500 rounded-full flex items-center justify-center text-white text-sm font-bold">3</div>
<span class="font-semibold text-gray-800">Pre-servicios RDA (RCXC / SC)</span>
</div>
<span id="p3-badge" class="text-sm text-gray-400">Esperando...</span>
</div>
<div id="p3-detalle" class="divide-y divide-gray-100 hidden"></div>
</div>
</div>
</div>
@@ -114,7 +129,7 @@
<strong id="modal-fecha" class="text-blue-600"></strong>:
</p>
<div class="grid grid-cols-3 gap-3">
<div class="grid grid-cols-4 gap-3">
<div class="bg-blue-50 rounded-lg p-3 text-center">
<div id="modal-cnt-pac" class="text-2xl font-bold text-blue-600">0</div>
<div class="text-xs text-blue-700">Terceros</div>
@@ -130,6 +145,11 @@
<div class="text-xs text-green-700">Exámenes</div>
<div class="text-xs text-green-400">detallePedido</div>
</div>
<div class="bg-orange-50 rounded-lg p-3 text-center">
<div id="modal-cnt-ps" class="text-2xl font-bold text-orange-600">0</div>
<div class="text-xs text-orange-700">Pre-servicios</div>
<div class="text-xs text-orange-400">RCXC / SC</div>
</div>
</div>
<div class="bg-amber-50 border border-amber-200 rounded-lg px-4 py-3 text-xs text-amber-700 flex items-start gap-2">
@@ -183,6 +203,7 @@ async function previewAutomation() {
document.getElementById('cnt-pacientes').textContent = data.pacientes;
document.getElementById('cnt-recepciones').textContent = data.recepciones;
document.getElementById('cnt-examenes').textContent = data.examenes;
document.getElementById('cnt-preservicios').textContent = data.preservicios || 0;
document.getElementById('preview-fecha').textContent = data.fecha;
const table = document.getElementById('preview-table');
@@ -232,6 +253,7 @@ function abrirModalConfirmar() {
document.getElementById('modal-cnt-pac').textContent = d.pacientes;
document.getElementById('modal-cnt-rec').textContent = d.recepciones;
document.getElementById('modal-cnt-exa').textContent = d.examenes;
document.getElementById('modal-cnt-ps').textContent = d.preservicios || 0;
document.getElementById('modal-lista-pac').innerHTML = d.pacientes_preview.map(p => `
<div class="flex items-center gap-3 px-3 py-1.5 border-b border-gray-50 text-xs last:border-0">
@@ -260,6 +282,8 @@ async function confirmarEnvio() {
document.getElementById('p1-badge').className = 'text-sm text-blue-500';
document.getElementById('p2-badge').textContent = 'Esperando...';
document.getElementById('p2-badge').className = 'text-sm text-gray-400';
document.getElementById('p3-badge').textContent = 'Esperando...';
document.getElementById('p3-badge').className = 'text-sm text-gray-400';
const contrato = document.getElementById('contrato-input').value.trim();
const form = new FormData();
@@ -291,8 +315,14 @@ async function confirmarEnvio() {
col2: `Pac. ${d.paciente}${d.examenes} examen(es)`,
col3: `${d.ok ? '✅' : '❌'} ${d.msg || ''}`, ok: d.ok,
})));
renderBadge('p3-badge', r.paso3_preserv.enviados, r.paso3_preserv.errores);
renderDetalle('p3-detalle', r.paso3_preserv.detalle.map(d => ({
col1: `${d.factura}`,
col2: `Pac. ${d.paciente}${d.examenes} examen(es)`,
col3: `${d.ok ? '✅' : '❌'} ${d.msg || ''}`, ok: d.ok,
})));
const totalErr = r.paso1_terceros.errores + r.paso2_rda.errores;
const totalErr = r.paso1_terceros.errores + r.paso2_rda.errores + r.paso3_preserv.errores;
showToast(totalErr === 0 ? 'Envío completado sin errores' : `Completado con ${totalErr} error(es)`,
totalErr === 0 ? 'success' : 'warning');
} catch (e) {