Files
whatsapp/modules/turnero/api/chat_start_conversation.php
T
Lizandro GuarnizoandClaude Sonnet 4.6 ab72750410 feat(chat): botón Nuevo mensaje con búsqueda de paciente y picker de plantilla
- chat_buscar_paciente.php: GET ?q= busca en lab_pacientes por nombre,
  documento o teléfono (mín. 2 chars, máx. 20 resultados)
- chat_start_conversation.php: POST {phone, template_name, lang, params}
  — normaliza teléfono, busca/crea usuario en users, envía plantilla
  vía WhatsAppService('turnero'), devuelve {ok, user_id}
- chat.php: botón "+ Nuevo" en sidebar header; modal 3 pasos:
  1) buscar paciente (debounce 350ms) o ingresar número libre
  2) lista de plantillas habilitadas
  3) variables de la plantilla + Enviar
  Al enviar recarga el sidebar y abre la conversación automáticamente

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 17:19:18 -05:00

82 lines
3.1 KiB
PHP

<?php
/**
* POST — Inicia una conversación nueva desde el chat turnero.
* Body: { phone, template_name, lang, params }
* Busca o crea el usuario en `users`, envía la plantilla y devuelve user_id.
*/
require_once __DIR__ . '/../../../config/config.php';
require_once __DIR__ . '/../../../services/WhatsAppService.php';
requireAuthentication();
header('Content-Type: application/json; charset=utf-8');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405); echo json_encode(['ok' => false, 'error' => 'Método no permitido']); exit;
}
try {
$input = json_decode(file_get_contents('php://input'), true) ?: [];
$phone = trim($input['phone'] ?? '');
$templateName = trim($input['template_name'] ?? '');
$lang = trim($input['lang'] ?? 'es_CO');
$params = $input['params'] ?? [];
if (!$phone || !$templateName) {
http_response_code(400);
echo json_encode(['ok' => false, 'error' => 'phone y template_name son requeridos']); exit;
}
// Normalizar teléfono: solo dígitos, agregar 57 si es colombiano de 10 dígitos
$phoneClean = preg_replace('/\D/', '', $phone);
if (strlen($phoneClean) === 10 && $phoneClean[0] === '3') {
$phoneClean = '57' . $phoneClean;
}
if (strlen($phoneClean) < 10) {
http_response_code(400);
echo json_encode(['ok' => false, 'error' => 'Número de teléfono inválido']); exit;
}
$db = Database::getInstance();
$pdo = $db->getConnection();
// Buscar usuario existente (puede estar guardado con o sin prefijo 57)
$user = $pdo->prepare(
"SELECT id, name FROM users WHERE phone_number = ? OR phone_number = ? LIMIT 1"
);
$user->execute([$phoneClean, ltrim($phoneClean, '57')]);
$userRow = $user->fetch(PDO::FETCH_ASSOC);
if (!$userRow) {
// Buscar nombre en lab_pacientes por teléfono
$pac = $pdo->prepare(
"SELECT nombre_completo FROM lab_pacientes WHERE telefono LIKE ? AND is_active=1 LIMIT 1"
);
$pac->execute(['%' . substr($phoneClean, -10) . '%']);
$pacRow = $pac->fetch(PDO::FETCH_ASSOC);
$nombre = $pacRow['nombre_completo'] ?? $phoneClean;
// Crear usuario mínimo
$ins = $pdo->prepare(
"INSERT INTO users (name, phone_number, created_at) VALUES (?, ?, NOW())"
);
$ins->execute([$nombre, $phoneClean]);
$userId = (int)$pdo->lastInsertId();
} else {
$userId = (int)$userRow['id'];
}
// Enviar plantilla
$operatorId = $_SESSION['admin_id'] ?? $_SESSION['user_id'] ?? null;
$meta = ['canal' => 'turnero'];
if ($operatorId) $meta['operator_id'] = $operatorId;
$wa = new WhatsAppService('turnero');
$wa->sendTemplateMessage($phoneClean, $templateName, $lang, $params, [], null, $meta);
echo json_encode(['ok' => true, 'user_id' => $userId]);
} catch (Throwable $e) {
error_log('chat_start_conversation: ' . $e->getMessage());
http_response_code(500);
echo json_encode(['ok' => false, 'error' => $e->getMessage()]);
}