fetch( 'SELECT phone_number, contacto_pedido_at FROM users WHERE id = ?', [$userId] ); if (!$u) return 'usuario_no_encontrado'; if (!esBsuid($u['phone_number'])) return 'no_hace_falta'; // ya tenemos su número if (!empty($u['contacto_pedido_at'])) return 'ya_se_pidio'; try { require_once __DIR__ . '/../../services/WhatsAppService.php'; $wa = new WhatsAppService(); $texto = getConfigFromDB( 'whatsapp_texto_pedir_contacto', 'Para poder registrar su atención necesitamos un número de contacto. ¿Nos comparte el suyo?' ); $r = $wa->pedirContacto($u['phone_number'], $texto); if (!$r) { error_log('[crear_desde_whatsapp] WhatsApp rechazó la solicitud de contacto del usuario ' . $userId); return 'fallo_envio'; } // Se marca solo si Meta aceptó: si falló, hay que poder reintentarlo $db->update('users', ['contacto_pedido_at' => date('Y-m-d H:i:s')], 'id = ?', [$userId]); return 'pedido'; } catch (Exception $e) { error_log('[crear_desde_whatsapp] Error pidiendo el contacto: ' . $e->getMessage()); return 'fallo_envio'; } } // ── GET: solo_paciente ───────────────────────────────────────────────────── if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['solo_paciente'])) { $convId = (int)($_GET['conversation_id'] ?? 0); $userId = (int)($_GET['user_id'] ?? 0); if (!$convId && !$userId) { echo json_encode(['success' => false, 'error' => 'conversation_id o user_id requerido']); exit; } // Obtener user_id y phone_number: por conversation_id o directamente por user_id if ($convId) { $conv = $db->fetch( 'SELECT c.id, c.user_id, u.phone_number, u.name AS whatsapp_name FROM conversations c JOIN users u ON u.id = c.user_id WHERE c.id = ?', [$convId] ); } else { $conv = $db->fetch( 'SELECT u.id AS user_id, u.phone_number, u.name AS whatsapp_name FROM users u WHERE u.id = ?', [$userId] ); } if (!$conv) { echo json_encode(['success' => false, 'error' => 'Conversación / usuario no encontrado']); exit; } $pacienteRepo = new Paciente(); $pacienteId = $pacienteRepo->obtenerOCrearDesdeWhatsapp($conv['user_id']); $paciente = $pacienteRepo->obtener($pacienteId); // Si la persona oculta su teléfono, la ficha queda sin número. Es el momento // de pedírselo: se le manda el botón de WhatsApp una sola vez. $contactoPedido = pedirContactoSiHaceFalta($db, (int) $conv['user_id']); echo json_encode([ 'success' => true, 'paciente' => $paciente, 'contacto_pedido' => $contactoPedido, ]); exit; } // ── POST: crear orden ────────────────────────────────────────────────────── if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'error' => 'Método no permitido']); exit; } $input = json_decode(file_get_contents('php://input'), true); if (!$input) { echo json_encode(['success' => false, 'error' => 'Datos inválidos']); exit; } $pacienteId = (int)($input['paciente_id'] ?? 0); if (!$pacienteId) { echo json_encode(['success' => false, 'error' => 'paciente_id requerido']); exit; } // Construir datos de la orden $datos = [ 'paciente_id' => $pacienteId, 'conversation_id' => !empty($input['conversation_id']) ? (int)$input['conversation_id'] : null, 'local_file' => $input['local_file'] ?? null, 'media_message_id' => $input['media_message_id'] ?? null, 'medico_nombre' => $input['medico_nombre'] ?? null, 'fecha_orden' => !empty($input['fecha_orden']) ? $input['fecha_orden'] : null, 'examenes_solicitados'=> $input['examenes_solicitados']?? null, 'requiere_ayuno' => isset($input['requiere_ayuno']) ? (int)$input['requiere_ayuno'] : 0, 'horas_ayuno' => !empty($input['horas_ayuno']) ? (int)$input['horas_ayuno'] : null, 'notas_admin' => $input['notas_admin'] ?? null, 'estado' => 'pendiente', ]; try { $orden = new OrdenMedica(); $ordenId = $orden->crear($datos, $adminId); echo json_encode([ 'success' => true, 'orden_id' => $ordenId, 'message' => "Orden médica #$ordenId creada correctamente", ]); } catch (Exception $e) { error_log('[lab/crear_desde_whatsapp] ' . $e->getMessage()); echo json_encode(['success' => false, 'error' => 'Error interno: ' . $e->getMessage()]); }