diff --git a/modules/turnero/api/get_consecutivo.php b/modules/turnero/api/get_consecutivo.php index 55c43f1..d02fc1f 100644 --- a/modules/turnero/api/get_consecutivo.php +++ b/modules/turnero/api/get_consecutivo.php @@ -1,14 +1,15 @@ prepare( - "SELECT MAX(CAST(SUBSTRING_INDEX(numero_orden, '-', -1) AS UNSIGNED)) AS ultimo - FROM lab_domicilios - WHERE numero_orden LIKE ?" - ); -} else { - $stmt = $pdo->prepare( - "SELECT MAX(CAST(SUBSTRING_INDEX(numero_orden, '-', -1) AS UNSIGNED)) AS ultimo - FROM turnero_solicitudes - WHERE numero_orden LIKE ?" - ); -} -$stmt->execute([$prefix . '%']); -$ultimo = (int)($stmt->fetch(PDO::FETCH_ASSOC)['ultimo'] ?? 0); +// Asegurar que exista la fila del día (INSERT IGNORE no toca si ya existe) +$pdo->prepare("INSERT IGNORE INTO turnero_consecutivos (prefijo, ultimo) VALUES (?, 0)") + ->execute([$prefijo]); -$siguiente = $prefix . str_pad($ultimo + 1, 3, '0', STR_PAD_LEFT); -jsonOk(['consecutivo' => $siguiente]); +// Incremento atómico: UPDATE toma lock de fila → dos hilos nunca leen el mismo valor +$pdo->prepare("UPDATE turnero_consecutivos SET ultimo = LAST_INSERT_ID(ultimo + 1) WHERE prefijo = ?") + ->execute([$prefijo]); + +$siguiente = (int)$pdo->query("SELECT LAST_INSERT_ID()")->fetchColumn(); + +jsonOk(['consecutivo' => $prefix . str_pad($siguiente, 3, '0', STR_PAD_LEFT)]);