listarPedidos($anioSeleccionado); // Reordenamiento de fecha (para poder ordenar correctamente con dataTables) foreach ($pedidos as $i => $p) { if (!empty($p['fecha'])) { $dt = new DateTime($p['fecha']); // Para ordenar $pedidos[$i]['fecha'] = $dt->format('Y-m-d'); // Para mostrar $pedidos[$i]['fecha_formateada'] = $dt->format('d/m/Y'); } else { $pedidos[$i]['fecha'] = '-'; $pedidos[$i]['fecha_formateada'] = '-'; } } ob_start(); require __DIR__ . '/../views/pedidos/listaPedidosView.php'; return ob_get_clean(); // MOSTRAR DETALLE DE PRODUCTOS DE UN PEDIDO case 'detalle_pedido': $idPedido = (int) ($_GET['id'] ?? 0); if ($idPedido <= 0) { $_SESSION['flash_error'] = 'Datos inválidos.'; header('Location: index.php?opt=listar_pedidos'); exit; } require_once __DIR__ . '/../models/pedidoModel.php'; $pedidomodel = new pedidoModel(); $pedido_detalle = $pedidomodel->getDetallePedido($idPedido); ob_start(); require __DIR__ . '/../views/pedidos/pedidoDetalleView.php'; return ob_get_clean(); // CREAR PEDIDO case 'crear_pedido': // Se muestra vista de carga de pedidos if ($_SERVER['REQUEST_METHOD'] === 'GET') { $condIVA = $_SESSION['pedido']['cond_iva'] ?? $_SESSION['pedido']['proveedor']['cond_iva'] ?? 'consumidor_final'; $cuit = $_SESSION['pedido']['cuit'] ?? $_SESSION['pedido']['proveedor']['cuit'] ?? '00000000000'; // Se obtienen los productos almacenados en caja (puede estar vacía) require_once __DIR__ . '/../models/cajaModel.php'; $cajamodel = new cajaModel(); $productos = $cajamodel->listarProductosPedido(); if (isset($_SESSION['pedido']['proveedor'])) { $proveedor = $_SESSION['pedido']['proveedor']; } else { $proveedor = ''; } // Cálculo de total $total = $cajamodel->calcularPrecioTotalPedido() ?? 0; ob_start(); require __DIR__ . '/../views/pedidos/crearPedidoView.php'; return ob_get_clean(); } // AGREGAR PRODUCTO AL PEDIDO case 'agregar_producto_pedido': // Guardo datos en $_SESSION para persistencia $_SESSION['pedido']['cond_iva'] = $_POST['cond_iva'] ?? ''; $_SESSION['pedido']['cuit'] = ($_POST['cuit_1'] ?? '') . ($_POST['cuit_2'] ?? '') . ($_POST['cuit_3'] ?? ''); // Requiero el modelo de producto require_once __DIR__ . '/../models/productoModel.php'; $productomodel = new productoModel(); $productos = $productomodel->listarProductosPedido(); foreach ($productos as $i => $p) { if (!isset($p['id'])) { unset($productos[$i]); continue; } if ($p['stock'] === null || $p['stock'] === 0) { $productos[$i]['stock'] = '-'; } } ob_start(); require __DIR__ . '/../views/pedidos/agregarProductoPedidoView.php'; return ob_get_clean(); // SELECCIONAR PROVEEDOR case 'seleccionar_proveedor': // Requiero el modelo de proveedor require_once __DIR__ . '/../models/proveedorModel.php'; $proveedormodel = new proveedorModel(); // Se muestra la vista de selección de cliente if ($_SERVER['REQUEST_METHOD'] === 'GET') { $proveedores = $proveedormodel->listarProveedores(); ob_start(); require __DIR__ . '/../views/pedidos/seleccionarProveedorView.php'; return ob_get_clean(); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $idProveedor = (int) ($_POST['id_proveedor'] ?? 0); if ($idProveedor <= 0) { $_SESSION['flash_error'] = "No se seleccionó ningún proveedor."; header("Location: index.php?opt=seleccionar_proveedor"); exit; } $proveedor = $proveedormodel->obtenerPorId($idProveedor); if (!$proveedor) { $_SESSION['flash_error'] = "Proveedor inválido."; header("Location: index.php?opt=seleccionar_proveedor"); exit; } // Guardo proveedor en $_SESSION $_SESSION['pedido']['proveedor'] = [ 'id' => $proveedor['id'], 'razon_social' => $proveedor['razon_social'], 'telefono' => $proveedor['telefono'], 'email' => $proveedor['email'], 'cuit' => $proveedor['cuit'], 'cond_iva' => $proveedor['cond_iva'] ]; $_SESSION['pedido']['cond_iva'] = $proveedor['cond_iva']; $_SESSION['pedido']['cuit'] = $proveedor['cuit']; $_SESSION['flash_success'] = "Proveedor agregado correctamente."; header("Location: index.php?opt=crear_pedido"); exit; } // ELIMINAR PROVEEDOR case 'eliminar_proveedor': unset($_SESSION['pedido']['cond_iva']); unset($_SESSION['pedido']['cuit']); if (isset($_SESSION['pedido']['proveedor'])) { unset($_SESSION['pedido']['proveedor']); $_SESSION['flash_success'] = "Proveedor eliminado correctamente."; } else { $_SESSION['flash_error'] = "No había proveedor seleccionado."; } header("Location: index.php?opt=crear_pedido"); exit; // GENERACION DE REMITO PDF MEDIANTE USO DE LIBRERIA DOMPDF case 'generar_remito_pdf': // CARGAMOS LA VISTA if ($_SERVER['REQUEST_METHOD'] === 'GET') { $numeroRemito = $_SESSION['ultimo_pedido_id']; ob_start(); require __DIR__ . '/../views/pedidos/descargarRemito.php'; return ob_get_clean(); } // GENERACIÓN DEL PDF if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Requiero datos de empresa y configuración require __DIR__ . '/../models/configuracionModel.php'; $configuracionmodel = new configuracionModel(); $datosEmpresa = $configuracionmodel->obtenerConfiguracion(); $mapCondIVA = [ 'consumidor_final' => 'Consumidor Final', 'responsable_inscripto' => 'Responsable Inscripto', 'monotributo' => 'Monotributo', ]; $datosEmpresa['cond_iva'] = $mapCondIVA[$datosEmpresa['cond_iva']]; // Obtenemos en la variable los datos guardados en $_SESSION durante la confirmación del pedido $datosRemito = $_SESSION['remito_pdf'] ?? null; if (!$datosRemito) { $_SESSION['flash_error'] = 'No hay datos disponibles para generar el remito.'; header('Location: index.php?opt=crear_pedido'); exit; } // Preparamos las variables con los datos $productos = $datosRemito['productos']; $proveedor = $datosRemito['proveedor']; $vendedor = $datosRemito['vendedor']; $total = $datosRemito['total']; $condIVA = $datosRemito['cond_iva']; $cuit = $datosRemito['cuit']; // VALIDACIONES BASE if (!$proveedor || empty($productos)) { $_SESSION['flash_error'] = 'Datos incompletos para generar el remito.'; header('Location: index.php?opt=crear_pedido'); exit; } if (!$vendedor) { $_SESSION['flash_error'] = 'No se pudo identificar el usuario.'; header('Location: index.php?opt=crear_pedido'); exit; } // VALIDACIÓN CONDICIÓN IVA $condIvaPermitidas = [ 'consumidor_final', 'responsable_inscripto', 'monotributo' ]; if (!in_array($condIVA, $condIvaPermitidas, true)) { $_SESSION['flash_error'] = 'Condición de IVA inválida.'; header('Location: index.php?opt=crear_pedido'); exit; } // VALIDACIÓN CUIT $cuit = trim($cuit); if (!preg_match('/^\d{10,11}$/', $cuit)) { $_SESSION['flash_error'] = 'CUIT inválido.'; header('Location: index.php?opt=crear_pedido'); exit; } if ($total <= 0) { $_SESSION['flash_error'] = 'Total inválido.'; header('Location: index.php?opt=crear_pedido'); exit; } // MAPEOS PARA PDF $mapCondIVA = [ 'consumidor_final' => 'Consumidor Final', 'responsable_inscripto' => 'Responsable Inscripto', 'monotributo' => 'Monotributo', ]; $condIVALabel = $mapCondIVA[$condIVA]; // Obtenemos código ID del pedido generado $numero = $_SESSION['ultimo_pedido_id'] ?? null; if (!$numero) { $_SESSION['flash_error'] = 'No se encontró el número de remito.'; header('Location: index.php?opt=crear_pedido'); exit; } // Guardamos en la vatiable para mostrar el código en la vista $numeroRemito = '0001-' . str_pad($numero, 8, '0', STR_PAD_LEFT); // RENDER PDF ob_start(); require __DIR__ . '/../pdf/pedidos/remitoPDF.php'; $html = ob_get_clean(); $cssPath = '/var/www/html/css/stylesRemitoPDF.css'; $css = file_get_contents($cssPath); // Configuración de opciones $options = new Options(); $options->set('isRemoteEnabled', true); // Permite cargar recursos externos (CSS, imágenes, etc.) $options->set('chroot', '/var/www/html'); // Define directorios base para recursos locales $options->set('defaultFont', 'DejaVu Sans'); // Creación de instancia Dompdf con las opciones seteadas $dompdf = new Dompdf($options); // Cargar el HTML que se va a convertir en PDF $dompdf->loadHtml(" $html "); $dompdf->setPaper('A4', 'portrait'); // Define el tamanio de hoja y la orientación $dompdf->render(); // Renderiza el PDF (procesa el HTML) // Enviar el PDF al browser $dompdf->stream( 'Remito N° ' . $numeroRemito . '.pdf', ['Attachment' => true] ); // Liberamos datos del array $_SESSION unset($_SESSION['remito_pdf']); exit; } // CONTINUAR SIN DESCARGAR EL REMITO PDF case 'continuar_sin_remito': // Liberamos $_SESSION unset($_SESSION['remito_pdf']); unset($_SESSION['ultimo_pedido_id']); $_SESSION['flash_success'] = 'Pedido finalizado correctamente.'; header('Location: index.php?opt=crear_pedido'); exit; // CONFIRMAR PEDIDO case 'confirmar_pedido': // Requiero modelos necesarios require_once __DIR__ . '/../models/cajaModel.php'; $cajamodel = new cajaModel(); require_once __DIR__ . '/../models/proveedorModel.php'; $proveedormodel = new proveedorModel(); require_once __DIR__ . '/../models/pedidoModel.php'; $pedidomodel = new pedidoModel(); // Condición IVA $condIvaPermitidas = [ 'consumidor_final', 'responsable_inscripto', 'monotributo' ]; $condIva = $_POST['cond_iva'] ?? 'consumidor_final'; if (!in_array($condIva, $condIvaPermitidas, true)) { $_SESSION['flash_error'] = 'Condición de IVA inválida.'; header('Location: index.php?opt=resumen_venta'); exit; } // CUIT $cuit = ($_POST['cuit_1'] ?? '') . ($_POST['cuit_2'] ?? '') . ($_POST['cuit_3'] ?? ''); $cuit = trim($cuit); if ($cuit === '') { $_SESSION['flash_error'] = 'Debe ingresar un CUIT.'; header('Location: index.php?opt=resumen_venta'); exit; } if (!preg_match('/^\d{11}$/', $cuit)) { $_SESSION['flash_error'] = 'El CUIT debe contener 11 dígitos.'; header('Location: index.php?opt=resumen_venta'); exit; } $idProveedor = $_SESSION['pedido']['proveedor']['id'] ?? null; $vendedor = $_SESSION['user'] ?? null; if ($idProveedor === null) { $_SESSION['flash_error'] = 'No seleccionó un proveedor.'; header('Location: index.php?opt=crear_pedido'); exit; } if (!$vendedor) { $_SESSION['flash_error'] = 'No se pudo identificar el usuario.'; header('Location: index.php?opt=crear_pedido'); exit; } $productosFinales = $cajamodel->listarProductosPedido(); $proveedor = $proveedormodel->obtenerPorId($idProveedor); $total = $cajamodel->calcularPrecioTotalPedido(); if (empty($productosFinales)) { $_SESSION['flash_error'] = 'No hay productos en el pedido.'; header('Location: index.php?opt=crear_pedido'); exit; } foreach ($productosFinales as $p) { if (empty($p['id_producto']) || empty($p['cantidad']) || $p['cantidad'] <= 0) { $_SESSION['flash_error'] = 'Pedido con productos inválidos.'; header('Location: index.php?opt=crear_pedido'); exit; } } if (!$proveedor) { $_SESSION['flash_error'] = 'Proveedor inválido.'; header('Location: index.php?opt=crear_pedido'); exit; } if ($total <= 0) { $_SESSION['flash_error'] = 'El total del pedido es inválido.'; header('Location: index.php?opt=crear_pedido'); exit; } // Guardamos el pedido y obtenemos el ID autoincremental desde la base de datos $idPedido = $pedidomodel->guardarPedido($productosFinales, $proveedor, $vendedor, $total); // Verificamos si se obtuvo el ID o si ocurrió algún error if ($idPedido !== false) { // Guardamos datos para utilizar en la generación del PDF $_SESSION['ultimo_pedido_id'] = $idPedido; $_SESSION['remito_pdf'] = [ 'productos' => $productosFinales, 'proveedor' => $proveedor, 'vendedor' => $vendedor, 'total' => $total, 'cond_iva' => $condIva, 'cuit' => $cuit ]; // Liberamos $cajamodel->vaciarCajaPedido(); unset($_SESSION['pedido']); $_SESSION['flash_success'] = "Pedido guardado correctamente."; } else { $_SESSION['flash_error'] = $pedidomodel->getError() ?? 'No se pudo guardar el pedido.'; } header("Location: index.php?opt=generar_remito_pdf"); exit; // DEFAULT default: ob_start(); header("Location: index.php?opt=404View.php"); return ob_get_clean(); }