document.addEventListener('DOMContentLoaded', function() { // Variables de estado let parkingSlots = []; let totalSlots = 20; let availableSlots = 20; // Elementos del DOM const parkingSlotsInput = document.getElementById('parking-slots'); const updateLayoutBtn = document.getElementById('update-layout'); const monthlyFixedBtn = document.getElementById('monthly-fixed-btn'); const monthlyRotatingBtn = document.getElementById('monthly-rotating-btn'); const hourlyBtn = document.getElementById('hourly-btn'); const exitPlateInput = document.getElementById('exit-plate'); const processExitBtn = document.getElementById('process-exit'); const modal = document.getElementById('modal'); const modalTitle = document.getElementById('modal-title'); const modalContent = document.getElementById('modal-content'); const modalCancel = document.getElementById('modal-cancel'); const modalConfirm = document.getElementById('modal-confirm'); const availableSlotsSpan = document.getElementById('available-slots'); const totalSlotsSpan = document.getElementById('total-slots'); const parkingGrid = document.querySelector('parking-grid'); // Inicializar la cuadrícula de estacionamiento function initializeParking() { totalSlots = parseInt(parkingSlotsInput.value); availableSlots = totalSlots; parkingSlots = Array(totalSlots).fill(null); updateCounters(); parkingGrid.setAttribute('slots', totalSlots); } // Actualizar contadores function updateCounters() { availableSlotsSpan.textContent = availableSlots; totalSlotsSpan.textContent = totalSlots; } // Mostrar modal function showModal(title, content, confirmCallback) { modalTitle.textContent = title; modalContent.innerHTML = content; modal.classList.remove('hidden'); modal.classList.add('flex'); // Configurar el botón de confirmación modalConfirm.onclick = function() { if (confirmCallback) confirmCallback(); hideModal(); }; } // Ocultar modal function hideModal() { modal.classList.add('hidden'); modal.classList.remove('flex'); } // Procesar ingreso de vehículo function processVehicleEntry(type) { if (availableSlots <= 0) { showModal('Estacionamiento lleno', '

No hay plazas disponibles en este momento.

'); return; } let title, content; switch(type) { case 'monthly-fixed': title = 'Ingreso mensual fijo'; content = `
`; break; case 'monthly-rotating': title = 'Ingreso mensual rotativo'; content = `
`; break; case 'hourly': title = 'Ingreso por hora'; content = `
`; break; } showModal(title, content, function() { const plateNumber = document.getElementById('plate-number').value.trim(); if (!plateNumber) { alert('Por favor ingrese el número de placa'); return; } let assignedSlot; if (type === 'monthly-fixed') { assignedSlot = parseInt(document.getElementById('assigned-slot').value) - 1; if (isNaN(assignedSlot) || assignedSlot < 0 || assignedSlot >= totalSlots) { alert('Por favor ingrese un número de plaza válido'); return; } if (parkingSlots[assignedSlot] !== null) { alert('Esta plaza ya está ocupada'); return; } } else { // Encontrar la primera plaza disponible assignedSlot = parkingSlots.findIndex(slot => slot === null); if (assignedSlot === -1) { alert('No hay plazas disponibles'); return; } } const keyDeposit = type !== 'monthly-fixed' ? document.getElementById('key-deposit').checked : false; parkingSlots[assignedSlot] = { type: type, plateNumber: plateNumber, entryTime: new Date(), keyDeposit: keyDeposit, assignedSlot: type === 'monthly-fixed' ? assignedSlot : null }; availableSlots--; updateCounters(); parkingGrid.setAttribute('slots-data', JSON.stringify(parkingSlots)); let message = `Vehículo registrado exitosamente en plaza ${assignedSlot + 1}`; if (type === 'hourly') { message += '

Ticket generado: ' + generateTicketNumber(); } showModal('Registro exitoso', `

${message}

`); }); } // Generar número de ticket function generateTicketNumber() { return 'T-' + Date.now().toString().slice(-6); } // Procesar salida de vehículo function processExit() { const plateNumber = exitPlateInput.value.trim(); if (!plateNumber) { alert('Por favor ingrese el número de placa'); return; } const slotIndex = parkingSlots.findIndex(slot => slot && slot.plateNumber === plateNumber); if (slotIndex === -1) { showModal('Vehículo no encontrado', '

No se encontró un vehículo con esa placa en el estacionamiento.

'); return; } const vehicle = parkingSlots[slotIndex]; let content = `

Tipo: ${getVehicleTypeName(vehicle.type)}

Placa: ${vehicle.plateNumber}

Plaza: ${slotIndex + 1}

Hora de entrada: ${vehicle.entryTime.toLocaleTimeString()}

`; if (vehicle.type === 'hourly') { const exitTime = new Date(); const duration = Math.ceil((exitTime - vehicle.entryTime) / (1000 * 60 * 60)); // Horas const rate = 5; // $5 por hora const total = duration * rate; content += `

Tiempo estacionado: ~${duration} hora(s)

Tarifa: $${rate} por hora

Total a pagar: $${total}

`; } if (vehicle.keyDeposit) { content += `
`; } content += `
`; showModal('Procesar salida', content, function() { if (vehicle.type === 'hourly') { const paymentMethod = document.getElementById('payment-method').value; // Aquí podrías registrar el pago en tu sistema } if (vehicle.keyDeposit) { const keyReturned = document.getElementById('return-key').checked; if (!keyReturned) { alert('¡Atención! Las llaves no fueron devueltas al cliente'); // Podrías registrar esto como una alerta } } // Liberar la plaza parkingSlots[slotIndex] = null; availableSlots++; updateCounters(); parkingGrid.setAttribute('slots-data', JSON.stringify(parkingSlots)); exitPlateInput.value = ''; showModal('Salida registrada', '

La salida del vehículo ha sido registrada exitosamente.

'); }); } // Obtener nombre del tipo de vehículo function getVehicleTypeName(type) { switch(type) { case 'monthly-fixed': return 'Mensual con plaza fija'; case 'monthly-rotating': return 'Mensual rotativo'; case 'hourly': return 'Por hora'; default: return type; } } // Event listeners updateLayoutBtn.addEventListener('click', initializeParking); monthlyFixedBtn.addEventListener('click', () => processVehicleEntry('monthly-fixed')); monthlyRotatingBtn.addEventListener('click', () => processVehicleEntry('monthly-rotating')); hourlyBtn.addEventListener('click', () => processVehicleEntry('hourly')); processExitBtn.addEventListener('click', processExit); modalCancel.addEventListener('click', hideModal); // Permitir procesar salida con Enter exitPlateInput.addEventListener('keypress', function(e) { if (e.key === 'Enter') { processExit(); } }); // Inicializar la aplicación initializeParking(); });