null, 'voucher_restante_path' => null]; if ($id) { $stmt = $pdo->prepare('SELECT voucher_adelanto_path, voucher_restante_path FROM pedidos WHERE id = ?'); $stmt->execute([$id]); $existing_paths = $stmt->fetch(PDO::FETCH_ASSOC) ?: $existing_paths; } $voucher_adelanto_path = handle_upload('voucher_adelanto', $existing_paths['voucher_adelanto_path']); $voucher_restante_path = handle_upload('voucher_restante', $existing_paths['voucher_restante_path']); $dni = trim($_POST['dni']); $nombre_completo = trim($_POST['nombre_completo']); $celular = trim($_POST['celular']); $sede_envio = trim($_POST['sede_envio']); $codigo_rastreo = trim($_POST['codigo_rastreo'] ?? ''); $codigo_tracking = trim($_POST['codigo_tracking'] ?? ''); $clave = trim($_POST['clave'] ?? ''); // --- Manejo de multiples productos --- $productos_post = $_POST['productos'] ?? []; $producto_nombres = []; $cantidad_total = 0; $productos_detalle = []; if (!empty($productos_post)) { foreach ($productos_post as $p) { if (!empty($p['nombre']) && !empty($p['cantidad'])) { $producto_nombres[] = trim($p['nombre']); $cantidad_total += (int)$p['cantidad']; $productos_detalle[] = trim($p['nombre']) . ' (x' . (int)$p['cantidad'] . ')'; } } } $producto = implode(', ', $producto_nombres); $cantidad = $cantidad_total; $notas_adicionales = "Detalle de productos: " . implode(', ', $productos_detalle); // --- Fin del manejo de multiples productos --- $monto_total = filter_var($_POST['monto_total'], FILTER_VALIDATE_FLOAT); $monto_adelantado = filter_var($_POST['monto_adelantado'], FILTER_VALIDATE_FLOAT); $numero_operacion = trim($_POST['numero_operacion']); $estado = $_POST['estado']; $notas = trim($_POST['notas']); if (!empty($productos_detalle)) { $notas .= "\n\n" . $notas_adicionales; } if ($estado === 'COMPLETADO ✅' && empty($numero_operacion)) { $error_message = urlencode("El número de operación es obligatorio cuando el estado es 'COMPLETADO ✅'."); $redirect_url = 'pedido_form.php?error=' . $error_message; if ($id) { $redirect_url .= '&id=' . $id; } header('Location: ' . $redirect_url); exit; } if (empty($dni) || empty($nombre_completo) || empty($celular) || empty($sede_envio) || empty($producto) || $cantidad === false || $monto_total === false) { die('Por favor, complete todos los campos obligatorios.'); } $monto_debe = $monto_total - $monto_adelantado; $params = [ 'dni_cliente' => $dni, 'nombre_completo' => $nombre_completo, 'celular' => $celular, 'sede_envio' => $sede_envio, 'codigo_rastreo' => $codigo_rastreo, 'codigo_tracking' => $codigo_tracking, 'clave' => $clave, 'producto' => $producto, 'cantidad' => $cantidad, 'monto_total' => $monto_total, 'monto_adelantado' => $monto_adelantado, 'numero_operacion' => $numero_operacion, 'monto_debe' => $monto_debe, 'estado' => $estado, 'notas' => $notas, 'voucher_adelanto_path' => $voucher_adelanto_path, 'voucher_restante_path' => $voucher_restante_path ]; if ($id) { // UPDATE: Explicit and safe query $user_role = $_SESSION['user_role'] ?? ''; $sql_parts = [ "dni_cliente = :dni_cliente", "nombre_completo = :nombre_completo", "celular = :celular", "sede_envio = :sede_envio", "codigo_rastreo = :codigo_rastreo", "codigo_tracking = :codigo_tracking", "clave = :clave", "producto = :producto", "cantidad = :cantidad", "monto_total = :monto_total", "monto_adelantado = :monto_adelantado", "numero_operacion = :numero_operacion", "monto_debe = :monto_debe", "estado = :estado", "notas = :notas", "voucher_adelanto_path = :voucher_adelanto_path", "voucher_restante_path = :voucher_restante_path" ]; // Conditionally add fecha_completado $completed_states = ['Completado', 'COMPLETADO ✅']; if (in_array($estado, $completed_states)) { // Only set fecha_completado if it hasn't been set before. $stmt_check = $pdo->prepare("SELECT fecha_completado FROM pedidos WHERE id = ?"); $stmt_check->execute([$id]); $current_fecha_completado = $stmt_check->fetchColumn(); if ($current_fecha_completado === null) { $sql_parts[] = "fecha_completado = NOW()"; } } // Conditionally add asesor_id if ($user_role === 'Administrador' && !empty($_POST['asesor_id'])) { $sql_parts[] = "asesor_id = :asesor_id"; $params['asesor_id'] = $_POST['asesor_id']; } $sql = "UPDATE pedidos SET " . implode(", ", $sql_parts) . " WHERE id = :id"; $params['id'] = $id; $stmt = $pdo->prepare($sql); $stmt->execute($params); } else { // INSERT: The advisor is the user creating the order. $params['asesor_id'] = $_SESSION['user_id']; $columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, estado, asesor_id, notas, voucher_adelanto_path, voucher_restante_path"; $values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :estado, :asesor_id, :notas, :voucher_adelanto_path, :voucher_restante_path"; $completed_states = ['Completado', 'COMPLETADO ✅']; if (in_array($estado, $completed_states)) { $columns_sql .= ", fecha_completado"; $values_sql .= ", :fecha_completado"; $params['fecha_completado'] = date('Y-m-d H:i:s'); } $sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)"; $stmt = $pdo->prepare($sql); $stmt->execute($params); } if (isset($_POST['id']) && !empty($_POST['id'])) { // Si se está editando un pedido, redirigir a la página de referencia o a la lista general. $redirect_url = $_POST['referer'] ?? 'pedidos.php'; } else { // Si se está creando un nuevo pedido, redirigir al formulario con un mensaje de éxito. $redirect_url = 'pedido_form.php?success=1'; } header('Location: ' . $redirect_url); exit; } else { header('Location: pedidos.php'); exit; }