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']); $agencia = trim($_POST['agencia'] ?? 'SHALOM'); $sede_envio = trim($_POST['sede_envio']); $codigo_rastreo = trim($_POST['codigo_rastreo'] ?? ''); $codigo_tracking = trim($_POST['codigo_tracking'] ?? ''); $clave = trim($_POST['clave'] ?? ''); $pendientes = trim($_POST['pendientes'] ?? ''); // --- 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']); $banco = trim($_POST['banco'] ?? ''); $estado = $_POST['estado']; $notas = trim($_POST['notas']); $observacion = trim($_POST['observacion'] ?? ''); 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; } // Check for minimum length of operation number if (!empty($numero_operacion) && strlen($numero_operacion) < 6) { $error_message = urlencode("El número de operación debe tener al menos 6 dígitos."); $redirect_url = 'pedido_form.php?error=' . $error_message; if ($id) { $redirect_url .= '&id=' . $id; } header('Location: ' . $redirect_url); exit; } // Check for duplicate operation number if (!empty($numero_operacion)) { $check_sql = "SELECT id FROM pedidos WHERE numero_operacion = ? AND id != ?"; $check_stmt = $pdo->prepare($check_sql); $check_stmt->execute([$numero_operacion, $id ?? 0]); $duplicate = $check_stmt->fetch(); if ($duplicate) { $error_message = urlencode("El número de operación ya existe en el pedido #" . $duplicate['id']); $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, 'agencia' => $agencia, 'sede_envio' => $sede_envio, 'codigo_rastreo' => $codigo_rastreo, 'codigo_tracking' => $codigo_tracking, 'clave' => $clave, 'pendientes' => $pendientes, 'producto' => $producto, 'cantidad' => $cantidad, 'monto_total' => $monto_total, 'monto_adelantado' => $monto_adelantado, 'numero_operacion' => $numero_operacion, 'banco' => $banco, 'monto_debe' => $monto_debe, 'estado' => $estado, 'notas' => $notas, 'observacion' => $observacion, '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", "agencia = :agencia", "sede_envio = :sede_envio", "codigo_rastreo = :codigo_rastreo", "codigo_tracking = :codigo_tracking", "clave = :clave", "pendientes = :pendientes", "producto = :producto", "cantidad = :cantidad", "monto_total = :monto_total", "monto_adelantado = :monto_adelantado", "numero_operacion = :numero_operacion", "banco = :banco", "monto_debe = :monto_debe", "estado = :estado", "notas = :notas", "observacion = :observacion", "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()"; // --- NEW: Insert into operaciones_provincia --- $stmt_p = $pdo->prepare("SELECT p.*, u.nombre_asesor FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.id = ?"); $stmt_p->execute([$id]); $p_data = $stmt_p->fetch(PDO::FETCH_ASSOC); if ($p_data) { $stmt_op = $pdo->prepare("INSERT INTO operaciones_provincia (pedido_id, cliente, celular, producto, monto_total, monto_debe, nro_operacion, banco, fecha_completado, asesor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)"); $stmt_op->execute([ $id, $p_data['nombre_completo'], $p_data['celular'], $p_data['producto'], $p_data['monto_total'], $p_data['monto_debe'], $numero_operacion, $banco, $p_data['nombre_asesor'] ]); } // --- End of NEW --- } } // Conditionally add asesor_id if (($user_role === 'Administrador' || $user_role === 'Logistica') && !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, agencia, sede_envio, codigo_rastreo, codigo_tracking, clave, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, observacion, voucher_adelanto_path, voucher_restante_path"; $values_sql = ":dni_cliente, :nombre_completo, :celular, :agencia, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :observacion, :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); $new_id = $pdo->lastInsertId(); // --- NEW: Insert into operaciones_provincia if completed --- if (in_array($estado, $completed_states)) { $stmt_u = $pdo->prepare("SELECT nombre_asesor FROM users WHERE id = ?"); $stmt_u->execute([$_SESSION['user_id']]); $nombre_asesor = $stmt_u->fetchColumn(); $stmt_op = $pdo->prepare("INSERT INTO operaciones_provincia (pedido_id, cliente, celular, producto, monto_total, monto_debe, nro_operacion, banco, fecha_completado, asesor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?)"); $stmt_op->execute([ $new_id, $nombre_completo, $celular, $producto, $monto_total, $monto_debe, $numero_operacion, $banco, $nombre_asesor ]); } // --- End of NEW --- } 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; }