// ================================ // INICIALIZACIÓN Y CARGA DE DATOS // ================================ $(document).ready(function () { // Cargar datos principales al inicializar cargarDatosIniciales(); // Configurar event handlers configurarEventHandlers(); // Configurar validación en tiempo real configurarValidacion(); }); // Cargar todos los datos iniciales desde archivos JSON function cargarDatosIniciales() { // Cargar tipos y categorías fetch('tipos_categoria_subcategoria.json') .then(response => response.json()) .then(data => { window.data = data; cargarTipos(); }) .catch(error => console.error('Error al cargar tipos y categorías:', error)); // Cargar usuarios fetch('usuarios.json') .then(response => response.json()) .then(usuariosData => { window.usuarios = usuariosData; cargarUsuarios(); }) .catch(error => console.error('Error al cargar usuarios:', error)); } // ================================ // EVENT HANDLERS // ================================ function configurarEventHandlers() { // Cambiar categorías al seleccionar tipo $('#tipo').change(function () { cargarCategorias(); }); // Manejar envío del formulario $('#transaccion-form').on('submit', function (e) { e.preventDefault(); procesarFormulario(this); }); } // ================================ // PROCESAMIENTO DEL FORMULARIO // ================================ function procesarFormulario(form) { // Validar formulario if (!form.checkValidity()) { mostrarMensaje('Por favor, completa todos los campos requeridos.', 'error'); return; } // Preparar datos const formDataArray = $(form).serializeArray(); const jsonData = prepararDatos(formDataArray); // Mostrar spinner mostrarSpinner(); // Enviar datos enviarTransaccion(jsonData); } function prepararDatos(formDataArray) { const jsonData = {}; // Agregar fecha actual formateada const datetime = new Date().toLocaleString('es-PE', { timeZone: 'America/Lima', hour12: false }); jsonData['fecha'] = formatearFecha(datetime); // Convertir datos del formulario a JSON formDataArray.forEach(item => { jsonData[item.name] = item.value; }); return jsonData; } function formatearFecha(datetime) { return datetime.replace(/(\d+)\/(\d+)\/(\d+), (\d+):(\d+):(\d+)/, '$3-$2-$1 $4:$5:$6'); } function enviarTransaccion(jsonData) { const url = 'https://script.google.com/macros/s/AKfycbyoS_q9j7Hixi1-dxVg6S7LKqb9o_Pma2I0mnBPmZ_vlKKSWyPY8lpw66woTMkyaD04/exec'; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify([jsonData]), mode: 'no-cors' }) .then(() => { mostrarMensaje('¡Transacción registrada exitosamente!', 'exito'); setTimeout(() => location.reload(), 4000); }) .catch(() => { mostrarMensaje('Hubo un problema con la solicitud.', 'error'); }) .finally(() => { ocultarSpinner(); }); } // ================================ // FUNCIONES DE CARGA DE DATOS // ================================ function cargarTipos() { const tipoSelect = document.getElementById('tipo'); tipoSelect.innerHTML = ''; if (window.data?.tipo) { Object.keys(window.data.tipo).forEach(tipo => { const option = crearOption(tipo, tipo); tipoSelect.appendChild(option); }); } } function cargarCategorias() { const tipoSelect = document.getElementById('tipo'); const categoriaSelect = document.getElementById('categoria'); // Limpiar categorías categoriaSelect.innerHTML = ''; if (window.data?.tipo && tipoSelect.value) { const categorias = Object.keys(window.data.tipo[tipoSelect.value]); categorias.forEach(categoria => { const option = crearOption(categoria, categoria); categoriaSelect.appendChild(option); }); } } function cargarUsuarios() { const usuarioSelect = document.getElementById('usuario'); usuarioSelect.innerHTML = ''; if (window.usuarios?.nombre_usuarios) { window.usuarios.nombre_usuarios.forEach(usuario => { const option = crearOption(usuario, usuario); usuarioSelect.appendChild(option); }); } } // ================================ // UTILIDADES // ================================ function crearOption(value, text) { const option = document.createElement('option'); option.value = value; option.textContent = text; return option; } function mostrarSpinner() { $('#loading').show(); } function ocultarSpinner() { $('#loading').hide(); } function mostrarMensaje(texto, tipo = 'info') { const contenedor = document.getElementById('mensaje'); const iconos = { exito: ``, error: ``, advertencia: `` }; contenedor.innerHTML = `