diff --git a/call_center_pro.php b/call_center_pro.php index c6103ed7..0b45ae3a 100644 --- a/call_center_pro.php +++ b/call_center_pro.php @@ -586,26 +586,46 @@ try { throw new RuntimeException('El reparto intercalado solo está disponible en TUANI principal.'); } - $repartoResult = cc_test_apply_daily_reparto($pdo, $storeKey, $orders, $assessors, $repartoSettings); + $repartoResult = cc_test_run_locked_reparto_job( + $pdo, + $storeKey, + $assessors, + static function () use ($pdo, $storeKey): array { + return cc_test_load_reparto_orders($pdo, $storeKey); + }, + $repartoSettings, + static function (array $orders) use ($storeKey, $storeConfig): array { + return cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); + } + ); $assignedCount = (int) ($repartoResult['assigned_count'] ?? 0); $noticeMessage = $assignedCount > 0 ? 'Reparto intercalado: ' . $assignedCount . ' pedido(s) asignado(s).' : (string) ($repartoResult['message'] ?? 'No había pedidos pendientes o no había asesoras disponibles.'); if ($assignedCount > 0) { - $tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key')); - $orders = drive_test_merge_tracking($orders, $tracking); + $orders = cc_test_load_reparto_orders($pdo, $storeKey); } $repartoSettings = $repartoResult['settings'] ?? $repartoSettings; } } - if ($isMainTuaniStore && ($repartoSettings['reparto_mode'] ?? 'manual') === 'automatico') { - $autoRepartoResult = cc_test_apply_daily_reparto($pdo, $storeKey, $orders, $assessors, $repartoSettings); + if ($isMainTuaniStore && cc_test_reparto_mode_is_auto($repartoSettings['reparto_mode'] ?? 'manual')) { + $autoRepartoResult = cc_test_run_locked_reparto_job( + $pdo, + $storeKey, + $assessors, + static function () use ($pdo, $storeKey): array { + return cc_test_load_reparto_orders($pdo, $storeKey); + }, + $repartoSettings, + static function (array $orders) use ($storeKey, $storeConfig): array { + return cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); + } + ); $autoAssignedCount = (int) ($autoRepartoResult['assigned_count'] ?? 0); if ($autoAssignedCount > 0) { $noticeMessage = trim((string) ($noticeMessage !== null ? $noticeMessage . ' ' : '') . 'Reparto automático: ' . $autoAssignedCount . ' pedido(s) asignado(s).'); - $tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key')); - $orders = drive_test_merge_tracking($orders, $tracking); + $orders = cc_test_load_reparto_orders($pdo, $storeKey); } $repartoSettings = $autoRepartoResult['settings'] ?? $repartoSettings; } diff --git a/gestiones_callcenter.php b/gestiones_callcenter.php index ebed91e8..219c6ebd 100644 --- a/gestiones_callcenter.php +++ b/gestiones_callcenter.php @@ -775,7 +775,7 @@ try { $postedStates = []; } - $repartoSettings['reparto_mode'] = 'manual'; + $repartoSettings['reparto_mode'] = $postedMode; $repartoSettings['assessor_states'] = cc_test_reparto_normalize_states($postedStates, $assessors); cc_test_upsert_reparto_settings($pdo, $storeKey, $repartoSettings); $noticeMessage = 'Configuración de reparto guardada.'; @@ -784,42 +784,51 @@ try { throw new RuntimeException('El reparto intercalado solo está disponible en TUANI principal.'); } - $repartoOrders = cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); - if (empty($repartoOrders)) { - $repartoResult = [ - 'assigned_count' => 0, - 'settings' => $repartoSettings, - 'message' => 'No hay pedidos pendientes para repartir.', - ]; - } else { - $repartoResult = cc_test_apply_daily_reparto($pdo, $storeKey, $repartoOrders, $assessors, $repartoSettings); - } + $repartoResult = cc_test_run_locked_reparto_job( + $pdo, + $storeKey, + $assessors, + static function () use ($pdo, $storeKey): array { + return cc_test_load_reparto_orders($pdo, $storeKey); + }, + $repartoSettings, + static function (array $orders) use ($storeKey, $storeConfig): array { + return cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); + } + ); $assignedCount = (int) ($repartoResult['assigned_count'] ?? 0); $noticeMessage = $assignedCount > 0 ? 'Reparto intercalado: ' . $assignedCount . ' pedido(s) asignado(s).' : (string) ($repartoResult['message'] ?? 'No había pedidos pendientes o no había asesoras disponibles.'); if ($assignedCount > 0) { - $tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key')); - $orders = drive_test_merge_tracking($orders, $tracking); + $orders = cc_test_load_reparto_orders($pdo, $storeKey); } $repartoSettings = $repartoResult['settings'] ?? $repartoSettings; } - if ($isMainTuaniStore && ($repartoSettings['reparto_mode'] ?? 'manual') === 'automatico') { - $repartoOrders = cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); - $autoRepartoResult = cc_test_apply_daily_reparto($pdo, $storeKey, $repartoOrders, $assessors, $repartoSettings); + if ($isMainTuaniStore && cc_test_reparto_mode_is_auto($repartoSettings['reparto_mode'] ?? 'manual')) { + $autoRepartoResult = cc_test_run_locked_reparto_job( + $pdo, + $storeKey, + $assessors, + static function () use ($pdo, $storeKey): array { + return cc_test_load_reparto_orders($pdo, $storeKey); + }, + $repartoSettings, + static function (array $orders) use ($storeKey, $storeConfig): array { + return cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); + } + ); $autoAssignedCount = (int) ($autoRepartoResult['assigned_count'] ?? 0); if ($autoAssignedCount > 0) { $noticeMessage = trim((string) ($noticeMessage !== null ? $noticeMessage . ' ' : '') . 'Reparto automático: ' . $autoAssignedCount . ' pedido(s) asignado(s).'); - $tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key')); - $orders = drive_test_merge_tracking($orders, $tracking); + $orders = cc_test_load_reparto_orders($pdo, $storeKey); } $repartoSettings = $autoRepartoResult['settings'] ?? $repartoSettings; } if ($isMainTuaniStore) { $repartoSettings = cc_test_fetch_reparto_settings($pdo, $storeKey, $assessors); - $repartoSettings['reparto_mode'] = 'manual'; } $repartoPreview = cc_test_reparto_preview($assessors, $repartoSettings); $repartoEligibleOrders = cc_test_filter_reparto_orders($orders, $storeKey, $storeConfig); @@ -1672,7 +1681,7 @@ require_once 'layout_header.php'; +