Carpeta controllers
This commit is contained in:
@@ -0,0 +1,554 @@
|
||||
<?php
|
||||
|
||||
// Validacion de token
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { // Recorre todos los caracteres (siempre) y retorna true or false
|
||||
$_SESSION['flash_error'] = 'Acción inválida.';
|
||||
header('Location: index.php?opt=inicio_operador');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Librería domPDF
|
||||
|
||||
require __DIR__ . '/../libs/dompdf/autoload.inc.php';
|
||||
|
||||
use Dompdf\Dompdf;
|
||||
use Dompdf\Options;
|
||||
|
||||
// Validar sesión
|
||||
|
||||
if (!isset($_SESSION['user'])) {
|
||||
header("Location: index.php?opt=login_operador");
|
||||
exit;
|
||||
}
|
||||
|
||||
$opt = $_GET['opt'] ?? null;
|
||||
|
||||
// Manejo de opt
|
||||
|
||||
switch ($opt) {
|
||||
|
||||
// LISTAR PEDIDOS
|
||||
|
||||
case 'listar_pedidos':
|
||||
|
||||
// Requiere el modelo de pedidos
|
||||
|
||||
require_once __DIR__ . '/../models/pedidoModel.php';
|
||||
$pedidomodel = new pedidoModel();
|
||||
|
||||
$anioActual = date('Y');
|
||||
$anioSeleccionado = $_GET['anio'] ?? $anioActual;
|
||||
|
||||
$pedidos = $pedidomodel->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("
|
||||
<style>$css</style>
|
||||
$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();
|
||||
}
|
||||
Reference in New Issue
Block a user