Autosave: 20260713-084251

This commit is contained in:
Flatlogic Bot 2026-07-13 08:41:44 +00:00
parent c1dd787c2d
commit 589f83f35c
5 changed files with 180 additions and 5 deletions

View File

@ -233,6 +233,12 @@ try {
$tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key'));
$orders = drive_test_merge_tracking($orders, $tracking);
$orders = array_values(array_filter($orders, static function (array $order): bool {
return empty($order['eliminado']);
}));
$orders = array_values(array_filter($orders, static function (array $order): bool {
return empty($order['eliminado']);
}));
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'assign_assessor') {
$sourceKey = trim((string) ($_POST['source_key'] ?? ''));
@ -1189,7 +1195,10 @@ require_once 'layout_header.php';
Los cambios se guardan en la base local del módulo de prueba.
<?php endif; ?>
</div>
<div class="d-flex gap-2 ms-auto">
<div class="d-flex gap-2 ms-auto flex-wrap">
<?php if (in_array($_SESSION['user_role'] ?? '', ['Administrador', 'admin'], true)): ?>
<button type="button" class="btn btn-outline-danger" onclick="eliminarPedido('<?php echo htmlspecialchars($order['source_key']); ?>', this)">Eliminar del panel</button>
<?php endif; ?>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
<button type="button" class="btn btn-primary" onclick="guardarGestion('<?php echo htmlspecialchars($order['source_key']); ?>', this)">Guardar gestión</button>
</div>
@ -1593,6 +1602,42 @@ document.addEventListener('DOMContentLoaded', () => {
});
});
function eliminarPedido(sourceKey, trigger) {
const confirmed = window.confirm('¿Seguro que deseas eliminar este pedido del panel? Se ocultará del Call Center y no borrará la fila original de Drive.');
if (!confirmed) {
return;
}
const body = new FormData();
body.append('source_key', sourceKey);
body.append('eliminar_pedido', '1');
if (trigger) {
trigger.disabled = true;
}
fetch('update_callcenter_test_tracking.php', {
method: 'POST',
body: body
})
.then(response => response.json())
.then(data => {
if (!data.success) {
throw new Error(data.message || 'No se pudo eliminar el pedido del panel.');
}
alert(data.message || 'Pedido eliminado del panel correctamente.');
window.location.reload();
})
.catch(error => {
alert(error.message || 'Ocurrió un error al eliminar el pedido del panel.');
})
.finally(() => {
if (trigger) {
trigger.disabled = false;
}
});
}
function guardarGestion(sourceKey, trigger, options = {}) {
const subirLogistica = options.subirLogistica === true || options.subirRuta === true;
const moverPromoFinal = options.moverPromoFinal === true;

View File

@ -261,6 +261,9 @@ try {
$tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key'));
$orders = drive_test_merge_tracking($orders, $tracking);
$orders = array_values(array_filter($orders, static function (array $order): bool {
return empty($order['eliminado']);
}));
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'assign_assessor') {
$sourceKey = trim((string) ($_POST['source_key'] ?? ''));
@ -303,6 +306,9 @@ try {
$tracking = drive_test_fetch_tracking($pdo, array_column($orders, 'source_key'));
$orders = drive_test_merge_tracking($orders, $tracking);
$orders = array_values(array_filter($orders, static function (array $order): bool {
return empty($order['eliminado']);
}));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'auto_assign_cupo') {
@ -1510,7 +1516,10 @@ require_once 'layout_header.php';
Los cambios se guardan en la base local del módulo de prueba.
<?php endif; ?>
</div>
<div class="d-flex gap-2 ms-auto">
<div class="d-flex gap-2 ms-auto flex-wrap">
<?php if (in_array($_SESSION['user_role'] ?? '', ['Administrador', 'admin'], true)): ?>
<button type="button" class="btn btn-outline-danger" onclick="eliminarPedido('<?php echo htmlspecialchars($order['source_key']); ?>', this)">Eliminar del panel</button>
<?php endif; ?>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
<button type="button" class="btn btn-primary" onclick="guardarGestion('<?php echo htmlspecialchars($order['source_key']); ?>', this)">Guardar gestión</button>
</div>
@ -1914,6 +1923,42 @@ document.addEventListener('DOMContentLoaded', () => {
});
});
function eliminarPedido(sourceKey, trigger) {
const confirmed = window.confirm('¿Seguro que deseas eliminar este pedido del panel? Se ocultará del Call Center y no borrará la fila original de Drive.');
if (!confirmed) {
return;
}
const body = new FormData();
body.append('source_key', sourceKey);
body.append('eliminar_pedido', '1');
if (trigger) {
trigger.disabled = true;
}
fetch('update_callcenter_test_tracking.php', {
method: 'POST',
body: body
})
.then(response => response.json())
.then(data => {
if (!data.success) {
throw new Error(data.message || 'No se pudo eliminar el pedido del panel.');
}
alert(data.message || 'Pedido eliminado del panel correctamente.');
window.location.reload();
})
.catch(error => {
alert(error.message || 'Ocurrió un error al eliminar el pedido del panel.');
})
.finally(() => {
if (trigger) {
trigger.disabled = false;
}
});
}
function guardarGestion(sourceKey, trigger, options = {}) {
const subirLogistica = options.subirLogistica === true || options.subirRuta === true;
const moverPromoFinal = options.moverPromoFinal === true;

View File

@ -61,6 +61,8 @@ function cc_test_ensure_tracking_table(PDO $pdo): void
`cancelado_evidencia_path` VARCHAR(255) NULL,
`cancelado_evidencia_subido_at` DATETIME NULL,
`cancelado_evidencia_subido_por` INT NULL,
`eliminado_at` DATETIME NULL,
`eliminado_por` INT NULL,
`ruta_contraentrega_pedido_id` INT NULL,
`ruta_contraentrega_subido_at` DATETIME NULL,
`ruta_contraentrega_subido_por` INT NULL,
@ -107,7 +109,9 @@ function cc_test_ensure_tracking_table(PDO $pdo): void
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'cancelado_evidencia_path', 'VARCHAR(255) NULL AFTER `promo_final_evidencia_subido_por`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'cancelado_evidencia_subido_at', 'DATETIME NULL AFTER `cancelado_evidencia_path`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'cancelado_evidencia_subido_por', 'INT NULL AFTER `cancelado_evidencia_subido_at`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ruta_contraentrega_pedido_id', 'INT NULL AFTER `cancelado_evidencia_subido_por`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'eliminado_at', 'DATETIME NULL AFTER `cancelado_evidencia_subido_por`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'eliminado_por', 'INT NULL AFTER `eliminado_at`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ruta_contraentrega_pedido_id', 'INT NULL AFTER `eliminado_por`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ruta_contraentrega_subido_at', 'DATETIME NULL AFTER `ruta_contraentrega_pedido_id`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'ruta_contraentrega_subido_por', 'INT NULL AFTER `ruta_contraentrega_subido_at`');
cc_test_ensure_column($pdo, 'callcenter_test_tracking', 'pedido_rotulado_pedido_id', 'INT NULL AFTER `ruta_contraentrega_subido_por`');

View File

@ -229,7 +229,7 @@ function drive_test_fetch_tracking(PDO $pdo, array $sourceKeys): array
cc_test_ensure_tracking_table($pdo);
$placeholders = implode(',', array_fill(0, count($sourceKeys), '?'));
$stmt = $pdo->prepare("SELECT source_key, estado, nota_seguimiento, user_id, direccion, referencia, agencia, sede_agencia, sede, ciudad, distrito, dni, numero_cuenta_sede_id, numero_cuenta_dni, observaciones, coordenadas, producto, cantidad, precio, monto_adelantado, confirmacion_producto, confirmacion_cantidad, confirmacion_precio, confirmacion_producto_extra, confirmacion_cantidad_extra, confirmacion_precio_extra, proxima_llamada_at, fecha_entrega_programada, numero_cuenta_enviado_at, promo_final_evidencia_path, promo_final_evidencia_subido_at, promo_final_evidencia_subido_por, cancelado_evidencia_path, cancelado_evidencia_subido_at, cancelado_evidencia_subido_por, ruta_contraentrega_pedido_id, ruta_contraentrega_subido_at, ruta_contraentrega_subido_por, pedido_rotulado_pedido_id, pedido_rotulado_subido_at, pedido_rotulado_subido_por, ultima_gestion_at, updated_at FROM callcenter_test_tracking WHERE source_key IN ($placeholders)");
$stmt = $pdo->prepare("SELECT source_key, estado, nota_seguimiento, user_id, direccion, referencia, agencia, sede_agencia, sede, ciudad, distrito, dni, numero_cuenta_sede_id, numero_cuenta_dni, observaciones, coordenadas, producto, cantidad, precio, monto_adelantado, confirmacion_producto, confirmacion_cantidad, confirmacion_precio, confirmacion_producto_extra, confirmacion_cantidad_extra, confirmacion_precio_extra, proxima_llamada_at, fecha_entrega_programada, numero_cuenta_enviado_at, promo_final_evidencia_path, promo_final_evidencia_subido_at, promo_final_evidencia_subido_por, cancelado_evidencia_path, cancelado_evidencia_subido_at, cancelado_evidencia_subido_por, eliminado_at, eliminado_por, ruta_contraentrega_pedido_id, ruta_contraentrega_subido_at, ruta_contraentrega_subido_por, pedido_rotulado_pedido_id, pedido_rotulado_subido_at, pedido_rotulado_subido_por, ultima_gestion_at, updated_at FROM callcenter_test_tracking WHERE source_key IN ($placeholders)");
$stmt->execute($sourceKeys);
$tracking = [];
@ -260,6 +260,9 @@ function drive_test_merge_tracking(array $orders, array $tracking): array
$order['cancelado_evidencia_path'] = $current['cancelado_evidencia_path'] ?? null;
$order['cancelado_evidencia_subido_at'] = $current['cancelado_evidencia_subido_at'] ?? null;
$order['cancelado_evidencia_subido_por'] = isset($current['cancelado_evidencia_subido_por']) && (int) $current['cancelado_evidencia_subido_por'] > 0 ? (int) $current['cancelado_evidencia_subido_por'] : null;
$order['eliminado_at'] = $current['eliminado_at'] ?? null;
$order['eliminado_por'] = isset($current['eliminado_por']) && (int) $current['eliminado_por'] > 0 ? (int) $current['eliminado_por'] : null;
$order['eliminado'] = trim((string) ($order['eliminado_at'] ?? '')) !== '';
$order['ruta_contraentrega_pedido_id'] = isset($current['ruta_contraentrega_pedido_id']) && (int) $current['ruta_contraentrega_pedido_id'] > 0 ? (int) $current['ruta_contraentrega_pedido_id'] : null;
$order['ruta_contraentrega_subido_at'] = $current['ruta_contraentrega_subido_at'] ?? null;
$order['ruta_contraentrega_subido_por'] = isset($current['ruta_contraentrega_subido_por']) && (int) $current['ruta_contraentrega_subido_por'] > 0 ? (int) $current['ruta_contraentrega_subido_por'] : null;

View File

@ -777,6 +777,7 @@ $estado = cc_test_normalize_state(trim((string) ($_POST['estado'] ?? 'POR LLAMAR
$validStates = cc_test_valid_states();
$subirALogistica = (string) ($_POST['subir_a_logistica'] ?? ($_POST['subir_a_ruta'] ?? '')) === '1';
$moverAPromoFinal = (string) ($_POST['mover_a_promo_final'] ?? '') === '1';
$eliminarPedido = (string) ($_POST['eliminar_pedido'] ?? '') === '1';
if ($sourceKey === '' || !preg_match('/^[a-f0-9]{40}$/', $sourceKey)) {
http_response_code(400);
@ -836,7 +837,7 @@ try {
$pdo = db();
cc_test_ensure_tracking_table($pdo);
$stmtCurrent = $pdo->prepare('SELECT estado, numero_cuenta_enviado_at, numero_cuenta_sede_id, numero_cuenta_dni, user_id, promo_final_evidencia_path, promo_final_evidencia_subido_at, promo_final_evidencia_subido_por, cancelado_evidencia_path, cancelado_evidencia_subido_at, cancelado_evidencia_subido_por, ruta_contraentrega_pedido_id, pedido_rotulado_pedido_id FROM callcenter_test_tracking WHERE source_key = ? LIMIT 1');
$stmtCurrent = $pdo->prepare('SELECT estado, numero_cuenta_enviado_at, numero_cuenta_sede_id, numero_cuenta_dni, user_id, promo_final_evidencia_path, promo_final_evidencia_subido_at, promo_final_evidencia_subido_por, cancelado_evidencia_path, cancelado_evidencia_subido_at, cancelado_evidencia_subido_por, eliminado_at, eliminado_por, ruta_contraentrega_pedido_id, pedido_rotulado_pedido_id FROM callcenter_test_tracking WHERE source_key = ? LIMIT 1');
$stmtCurrent->execute([$sourceKey]);
$currentTracking = $stmtCurrent->fetch(PDO::FETCH_ASSOC) ?: null;
@ -875,6 +876,83 @@ try {
}
}
$deletedAtCurrent = trim((string) ($currentTracking['eliminado_at'] ?? ''));
$isDeleted = $deletedAtCurrent !== '';
if ($eliminarPedido) {
if (!$isAdmin) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Solo un administrador puede eliminar pedidos del panel.']);
exit;
}
if ($isDeleted) {
echo json_encode(['success' => true, 'message' => 'El pedido ya estaba eliminado del panel.']);
exit;
}
$deleteState = cc_test_normalize_state((string) ($currentTracking['estado'] ?? $estado));
if (!in_array($deleteState, $validStates, true)) {
$deleteState = 'POR LLAMAR';
}
$deleteUserId = $currentTracking && (int) ($currentTracking['user_id'] ?? 0) > 0
? (int) $currentTracking['user_id']
: null;
$deletedAt = (new DateTimeImmutable('now'))->format('Y-m-d H:i:s');
$deletedBy = (int) ($_SESSION['user_id'] ?? 0);
$stmtDelete = $pdo->prepare(
'INSERT INTO callcenter_test_tracking (
source_key,
estado,
user_id,
eliminado_at,
eliminado_por,
ultima_gestion_at
) VALUES (
:source_key,
:estado,
:user_id,
:eliminado_at,
:eliminado_por,
CURRENT_TIMESTAMP
)
ON DUPLICATE KEY UPDATE
estado = VALUES(estado),
user_id = VALUES(user_id),
eliminado_at = VALUES(eliminado_at),
eliminado_por = VALUES(eliminado_por),
ultima_gestion_at = CURRENT_TIMESTAMP,
updated_at = CURRENT_TIMESTAMP'
);
$stmtDelete->bindValue(':source_key', $sourceKey, PDO::PARAM_STR);
$stmtDelete->bindValue(':estado', $deleteState, PDO::PARAM_STR);
if ($deleteUserId === null) {
$stmtDelete->bindValue(':user_id', null, PDO::PARAM_NULL);
} else {
$stmtDelete->bindValue(':user_id', $deleteUserId, PDO::PARAM_INT);
}
$stmtDelete->bindValue(':eliminado_at', $deletedAt, PDO::PARAM_STR);
if ($deletedBy > 0) {
$stmtDelete->bindValue(':eliminado_por', $deletedBy, PDO::PARAM_INT);
} else {
$stmtDelete->bindValue(':eliminado_por', null, PDO::PARAM_NULL);
}
$stmtDelete->execute();
echo json_encode([
'success' => true,
'message' => 'Pedido eliminado del panel correctamente.',
'eliminado_at' => $deletedAt,
]);
exit;
}
if ($isDeleted) {
throw new RuntimeException('Este pedido fue eliminado del panel por un administrador.');
}
$userIdToSet = $isAdmin
? ($currentTracking ? ((int) ($currentTracking['user_id'] ?? 0) > 0 ? (int) $currentTracking['user_id'] : null) : null)
: (int) $_SESSION['user_id'];