204 lines
7.7 KiB
PHP
204 lines
7.7 KiB
PHP
<?php
|
|
session_start();
|
|
if (!isset($_SESSION['user_id'])) {
|
|
header('Location: login.php');
|
|
exit;
|
|
}
|
|
|
|
require_once 'db/config.php';
|
|
|
|
function handle_upload($file_key, $current_path = null) {
|
|
if (isset($_FILES[$file_key]) && $_FILES[$file_key]['error'] === UPLOAD_ERR_OK) {
|
|
$upload_dir = 'assets/uploads/vouchers/';
|
|
if (!is_dir($upload_dir)) {
|
|
mkdir($upload_dir, 0775, true);
|
|
}
|
|
|
|
if ($current_path && file_exists($current_path)) {
|
|
unlink($current_path);
|
|
}
|
|
|
|
$filename = uniqid() . '-' . basename($_FILES[$file_key]['name']);
|
|
$path = $upload_dir . $filename;
|
|
|
|
if (move_uploaded_file($_FILES[$file_key]['tmp_name'], $path)) {
|
|
return $path;
|
|
}
|
|
return $current_path;
|
|
}
|
|
return $current_path;
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$pdo = db();
|
|
|
|
$id = $_POST['id'] ?? null;
|
|
|
|
$existing_paths = ['voucher_adelanto_path' => 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;
|
|
} |