File "devolucion.php"
Full Path: C:/wamp64/www/loteo/devolucion.php
File size: 16.68 KB
MIME-type: text/x-php
Charset: utf-8
<?php
require_once 'connection.php';
// Crear tabla si no existe con TODOS los campos necesarios
$conn = connection();
// Primero verificar si la tabla existe y tiene todas las columnas
$check_table = "SHOW COLUMNS FROM entregas";
$result = $conn->query($check_table);
$existing_columns = [];
if ($result) {
while ($row = $result->fetch_assoc()) {
$existing_columns[] = $row['Field'];
}
}
// Si la tabla no existe, crearla
if (empty($existing_columns)) {
$sql = "CREATE TABLE entregas (
id INT AUTO_INCREMENT PRIMARY KEY,
fecha DATETIME NOT NULL,
proceso VARCHAR(20) NOT NULL,
item VARCHAR(50) NOT NULL,
descripcion TEXT NOT NULL,
cantidad INT NOT NULL,
area VARCHAR(50) NOT NULL,
observacion TEXT NOT NULL,
firma_entrega LONGTEXT NOT NULL,
firma_recibe LONGTEXT NOT NULL,
tipoMV VARCHAR(20) DEFAULT 'Devolucion',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";
$conn->query($sql);
} else {
// Si la tabla existe, agregar columnas faltantes
$required_columns = [
'item' => "ALTER TABLE entregas ADD COLUMN item VARCHAR(50) NOT NULL DEFAULT ''",
'descripcion' => "ALTER TABLE entregas ADD COLUMN descripcion TEXT NOT NULL",
'cantidad' => "ALTER TABLE entregas ADD COLUMN cantidad INT NOT NULL DEFAULT 0",
'area' => "ALTER TABLE entregas ADD COLUMN area VARCHAR(50) NOT NULL DEFAULT ''",
'observacion' => "ALTER TABLE entregas ADD COLUMN observacion TEXT NOT NULL",
'firma_entrega' => "ALTER TABLE entregas ADD COLUMN firma_entrega LONGTEXT NOT NULL",
'firma_recibe' => "ALTER TABLE entregas ADD COLUMN firma_recibe LONGTEXT NOT NULL",
'tipoMV' => "ALTER TABLE entregas ADD COLUMN tipoMV VARCHAR(20) DEFAULT 'Devolucion'"
];
foreach ($required_columns as $column => $alter_sql) {
if (!in_array($column, $existing_columns)) {
$conn->query($alter_sql);
}
}
// Si existe la columna 'items' (campo JSON), eliminarla porque ya no la necesitamos
if (in_array('items', $existing_columns)) {
$conn->query("ALTER TABLE entregas DROP COLUMN items");
}
}
// Obtener los ítems iniciales (Pollo) para pasarlos a JavaScript
$items_iniciales = [];
$result_items = $conn->query("SELECT item, descripcion FROM items ORDER BY item");
if ($result_items) {
while ($row = $result_items->fetch_assoc()) {
$items_iniciales[] = $row;
}
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registrar Devolución</title>
<link rel="icon" type="image/png" href="img/icono.png">
<link rel="stylesheet" href="css/styles.css">
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/select2-bootstrap-5-theme@1.3.0/dist/select2-bootstrap-5-theme.min.css" />
<script src="js/firmas.js"></script>
<style>
:root {
--primary-color: #2c3e50;
--secondary-color: #3498db;
--accent-color: #e74c3c;
--success-color: #27ae60;
--light-color: #ecf0f1;
--dark-color: #2c3e50;
--border-color: #bdc3c7;
}
.logo {
display: block;
margin: 0 auto 1.5rem;
max-width: 250px;
height: auto;
}
.copyright {
display: block;
margin: 0 auto;
padding: 10px 25px;
color: black;
border-radius: 4px;
font-size: 14px;
font-weight: bold;
text-align: center;
width: fit-content;
}
/* Contenedor de items */
.items-container {
margin-bottom: 20px;
padding: 15px;
background-color: #f8f9fa;
border-radius: 5px;
border: 1px solid var(--border-color);
}
/* Fila de item */
.item-row {
display: flex;
margin-bottom: 10px;
align-items: center;
gap: 8px;
padding: 8px;
background-color: white;
border-radius: 4px;
border: 1px solid var(--border-color);
}
/* Select de items */
.item-select {
flex: 1;
min-width: 150px;
max-width: 200px;
padding: 8px 12px;
border: 1px solid var(--border-color);
border-radius: 4px;
background-color: white;
}
/* Campo de cantidad */
.item-cantidad {
flex: 0.3;
min-width: 80px;
max-width: 100px;
padding: 8px 12px;
border: 1px solid var(--border-color);
border-radius: 4px;
}
/* Ajustes para Select2 */
.select2-container--default .select2-selection--single {
height: 38px !important;
border: 1px solid var(--border-color) !important;
}
.select2-container--default .select2-selection--single .select2-selection__rendered {
line-height: 36px !important;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 36px !important;
}
/* Botones */
.btn-remove-item {
flex: 0.1;
min-width: 80px;
padding: 8px 12px;
background-color: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
.btn-remove-item:hover {
background-color: #c0392b;
}
.btn-add-item {
padding: 8px 16px;
background-color: var(--success-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
margin-bottom: 15px;
font-weight: bold;
transition: background-color 0.3s;
}
.btn-add-item:hover {
background-color: #219653;
}
/* Ajustes generales para select2 dropdown */
.select2-dropdown {
border: 1px solid var(--border-color) !important;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.select2-results__option--highlighted {
background-color: var(--secondary-color) !important;
}
@media (max-width: 900px) and (min-width: 400px) {
.item-row {
flex-direction: column;
align-items: stretch;
}
.item-select, .item-cantidad, .btn-remove-item {
max-width: 100%;
margin-bottom: 5px;
}
}
</style>
</head>
<body>
<div class="container">
<img src="img/LOGO.png" alt="" width="37" height="37" class="logo" style="width: 250px; height: auto;" />
<h1>Registrar Nueva Devolución</h1>
<!-- Mensaje de éxito -->
<?php if(isset($_GET['success']) && $_GET['success'] == 1): ?>
<div class="alert success">
<strong>¡Registro exitoso!</strong> Se han guardado <?= $_GET['registros'] ?? 'los' ?> registros correctamente.
</div>
<?php endif; ?>
<!-- Mensaje de error -->
<?php if(isset($_GET['error'])): ?>
<div class="alert error">
<strong>Error al registrar la devolución.</strong> Intente nuevamente.
<?php if(isset($_GET['message'])): ?>
<br><small>Detalle: <?= htmlspecialchars($_GET['message']) ?></small>
<?php endif; ?>
</div>
<?php endif; ?>
<form action="guardarDevolucion.php" method="POST" id="formDevolucion">
<div class="form-group">
<label for="fecha">Fecha:</label>
<input type="datetime-local" id="fecha" name="fecha" required value="<?= date('Y-m-d\TH:i') ?>">
</div>
<div class="form-group">
<label for="beneficio">Tipo De Beneficio:</label>
<select id="beneficio" name="beneficio" required>
<option value="">Seleccione...</option>
<option value="Beneficio Pollo" selected>Beneficio Pollo</option>
<option value="Beneficio Pavo">Beneficio Pavo</option>
</select>
</div>
<div class="form-group" id="grupoProceso">
<label for="proceso">Tipo De Proceso:</label>
<select id="proceso" name="proceso">
<option value="">Seleccione...</option>
<option value="Pro Pollo" selected>Pro Pollo</option>
<option value="Pro Pavo">Pro Pavo</option>
</select>
</div>
<div>
<label>Ítems:</label>
<button type="button" id="btnAddItem" class="btn-add-item">+ Agregar Ítem</button>
<div class="items-container" id="itemsContainer">
<div class="item-row">
<select class="item-select form-control" name="items[]" required>
<option value="" selected hidden>Seleccione el Item</option>
</select>
<input type="number" class="item-cantidad" name="cantidades[]" required min="1" placeholder="Cantidad">
<button type="button" class="btn-remove-item" onclick="removeItem(this)">Eliminar</button>
</div>
</div>
</div>
<!-- Área dinámica según beneficio -->
<div class="form-group" id="grupoArea">
<label for="area">Área:</label>
<select id="area" name="area" required>
<option value="">Seleccione...</option>
</select>
</div>
<div class="form-group">
<label for="observacion">Observación:</label>
<textarea id="observacion" name="observacion" required></textarea>
</div>
<div class="form-group">
<label>Firma Quien Entrega:</label>
<div class="signature-container">
<canvas id="firmaEntregaCanvas"
data-input="firmaEntrega"
class="signature-pad"></canvas>
<button type="button" id="limpiarFirmaEntrega" class="btn-clear">Limpiar</button>
</div>
<input type="hidden" id="firmaEntrega" name="firma_entrega" required>
</div>
<div class="form-group">
<label>Firma Quien Recibe:</label>
<div class="signature-container">
<canvas id="firmaRecibeCanvas"
data-input="firmaRecibe"
class="signature-pad"></canvas>
<button type="button" id="limpiarFirmaRecibe" class="btn-clear">Limpiar</button>
</div>
<input type="hidden" id="firmaRecibe" name="firma_recibe" required>
</div>
<div class="form-actions">
<button type="submit" class="btn">Guardar Devolución</button>
<a href="index.php" class="btn btn-cancelar">Cancelar</a>
</div>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
// Items iniciales (cargados desde PHP para Pollo)
let currentItems = <?php echo json_encode($items_iniciales); ?>;
// Áreas por beneficio
const areasPorBeneficio = {
'Beneficio Pollo': [
'Producción', 'Marinado', 'Emp Viscera', 'Emp Pollo',
'Postproceso', 'Pasta', 'Fileteo', 'Evisceracion',
'Calidad', 'Logística', 'Almacén'
],
'Beneficio Pavo': [
'Prod Pavo', 'Fileteo Pavo', 'Carnes Especiales Pavo',
'Posproceso Pavo', 'Reproceso Pavo', 'Marinado Pavo'
]
};
function actualizarAreas(beneficio) {
const $area = $('#area');
$area.empty().append('<option value="">Seleccione...</option>');
const areas = areasPorBeneficio[beneficio] || [];
areas.forEach(function(a) {
$area.append($('<option>', { value: a, text: a }));
});
}
function actualizarProceso(beneficio) {
if (beneficio === 'Beneficio Pollo') {
$('#grupoProceso').show();
$('#proceso').prop('required', true);
} else {
$('#grupoProceso').hide();
$('#proceso').prop('required', false).val('');
}
}
function fillSelect(selectElement, items) {
const currentVal = $(selectElement).val();
$(selectElement).empty().append('<option value="" selected hidden>Seleccione el Item</option>');
items.forEach(item => {
const option = $('<option>', {
value: item.item,
text: item.item + ' - ' + item.descripcion,
'data-descripcion': item.descripcion
});
$(selectElement).append(option);
});
if (currentVal && $(selectElement).find(`option[value="${currentVal}"]`).length) {
$(selectElement).val(currentVal);
}
}
function updateAllSelects(items) {
$('.item-select').each(function() {
fillSelect(this, items);
if ($(this).data('select2')) {
$(this).select2('destroy');
}
$(this).select2({
theme: 'bootstrap-5',
width: '100%',
dropdownAutoWidth: true
});
});
}
$(document).ready(function() {
// Estado inicial con Beneficio Pollo seleccionado
const beneficioInicial = $('#beneficio').val();
actualizarProceso(beneficioInicial);
actualizarAreas(beneficioInicial);
updateAllSelects(currentItems);
// Evento cambio de beneficio
$('#beneficio').change(function() {
const beneficio = $(this).val();
if (!beneficio) return;
actualizarProceso(beneficio);
actualizarAreas(beneficio);
fetch('get_items.php?beneficio=' + encodeURIComponent(beneficio))
.then(response => response.json())
.then(data => {
if (data.error) {
alert(data.error);
return;
}
currentItems = data;
updateAllSelects(currentItems);
})
.catch(error => {
console.error('Error:', error);
alert('Error al cargar los items');
});
});
// Agregar nuevo ítem
$('#btnAddItem').click(function() {
const newRow = `
<div class="item-row">
<select class="item-select form-control" name="items[]" required>
<option value="" selected hidden>Seleccione el Item</option>
</select>
<input type="number" class="item-cantidad" name="cantidades[]" required min="1" placeholder="Cantidad">
<button type="button" class="btn-remove-item" onclick="removeItem(this)">Eliminar</button>
</div>
`;
$('#itemsContainer').append(newRow);
const newSelect = $('#itemsContainer .item-select').last();
fillSelect(newSelect, currentItems);
newSelect.select2({
theme: 'bootstrap-5',
width: '100%',
dropdownAutoWidth: true
});
});
});
function removeItem(button) {
if ($('#itemsContainer .item-row').length > 1) {
$(button).closest('.item-row').remove();
} else {
alert('Debe haber al menos un ítem en la devolución.');
}
}
</script>
<div class="copyright">
© Avicampo <?php echo date('Y'); ?>
</div>
</body>
</html>