permitir 0s en dashboard

This commit is contained in:
2026-03-21 01:26:04 -03:00
parent 45e4f58747
commit 9a78f4c801
3 changed files with 55 additions and 40 deletions

View File

@@ -38,6 +38,8 @@ services:
- limpiar requirements.txt
- hacer que trabajador acompañante solo muestre trabajadores en el mismo modulo
- hacer placeholders funcionales (si dice 0 que el sistema lea 0 no null)
- mostrar rendiciones antiguas
- hacer como un hub del trabajador qu permita ver antiguos y crear uno nuevo
# TODO peppermint:
## formulario
- cantidad de boletas por metodo de pago

4
app.py
View File

@@ -218,11 +218,11 @@ def worker_dashboard():
# Función para limpiar puntos y validar presencia de datos
def clean_and_validate(val):
if val is None or val.strip() == "":
return None
return 0 # <--- Cambiado de None a 0
try:
return int(val.replace('.', ''))
except ValueError:
return None
return 0 # <--- Cambiado de None a 0
# Captura y validación de campos obligatorios
tarjeta = clean_and_validate(request.form.get('venta_tarjeta'))

View File

@@ -214,41 +214,41 @@
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const submitModal = document.getElementById('confirmSubmitModal');
const mainForm = document.querySelector('form'); // El formulario de la rendición
// Buscamos el botón de confirmar dentro del modal
const confirmBtn = submitModal.querySelector('button[type="submit"]');
// Cambiamos su comportamiento: que no haga el submit del form del modal,
// sino del formulario principal
confirmBtn.addEventListener('click', function(e) {
e.preventDefault();
document.addEventListener('DOMContentLoaded', function() {
const submitModal = document.getElementById('confirmSubmitModal');
const mainForm = document.querySelector('form');
const confirmBtn = submitModal.querySelector('button[type="submit"]');
// Ejecutamos la validación manual antes de enviar
const requiredInputs = mainForm.querySelectorAll('[required]');
let valid = true;
// Función única de validación para no repetir código
function validarFormulario() {
const requiredInputs = mainForm.querySelectorAll('[required]');
let valid = true;
requiredInputs.forEach(input => {
if (!input.value.trim()) {
input.classList.add('is-invalid');
valid = false;
requiredInputs.forEach(input => {
const isMoney = input.classList.contains('money-input');
// Si está vacío Y no es un campo de dinero, es inválido
// Si es campo de dinero, el placeholder/blur se encarga de que sea 0
if (!input.value.trim() && !isMoney) {
input.classList.add('is-invalid');
valid = false;
} else {
input.classList.remove('is-invalid');
}
});
return valid;
}
confirmBtn.addEventListener('click', function(e) {
e.preventDefault();
if (validarFormulario()) {
mainForm.submit();
} else {
input.classList.remove('is-invalid');
const modalInstance = bootstrap.Modal.getInstance(submitModal);
modalInstance.hide();
alert("Por favor, rellena los campos obligatorios (Fecha y Turno).");
}
});
if (valid) {
mainForm.submit();
} else {
// Si no es válido, cerramos el modal y avisamos
const modalInstance = bootstrap.Modal.getInstance(submitModal);
modalInstance.hide();
alert("Por favor, rellena todos los campos obligatorios antes de enviar.");
}
});
});
</script>
<script>
@@ -257,22 +257,21 @@ document.addEventListener('DOMContentLoaded', function() {
const displayGeneral = document.getElementById('total_general');
function calcularTotales() {
// Limpiamos los puntos para sumar números puros
const getVal = (id) => {
const el = document.getElementById(id);
return el ? parseInt(el.value.replace(/\D/g, '')) || 0 : 0;
// Si no hay valor, asumimos 0 para que el cálculo no de NaN
if (!el || !el.value.trim() || el.value === '0') return 0;
return parseInt(el.value.replace(/\D/g, '')) || 0;
};
const tarjeta = getVal('venta_tarjeta');
const mp = getVal('venta_mp');
const efectivo = getVal('venta_efectivo');
const gastos = getVal('gastos'); // Nuevo campo capturado
const gastos = getVal('gastos');
const totalDigital = tarjeta + mp;
// El total general ahora resta los gastos para mostrar el neto real
const totalGeneral = (totalDigital + efectivo) - gastos;
// Formateamos de vuelta a moneda chilena
displayDigital.value = totalDigital.toLocaleString('es-CL');
displayGeneral.value = totalGeneral.toLocaleString('es-CL');
}
@@ -286,8 +285,9 @@ document.addEventListener('DOMContentLoaded', function() {
const requiredInputs = this.querySelectorAll('[required]');
let valid = true;
requiredInputs.forEach(input => {
if (!input.value.trim()) {
requiredInputs.forEach(input => {
const isMoney = input.classList.contains('money-input');
if (!input.value.trim() && !isMoney) {
input.classList.add('is-invalid');
valid = false;
} else {
@@ -303,13 +303,26 @@ document.addEventListener('DOMContentLoaded', function() {
// Reuse our formatting script for the summary money inputs
document.querySelectorAll('.money-input').forEach(function(input) {
// Inicializar con 0 si está vacío para evitar que el validador se confunda
if (!input.value.trim()) input.value = '0';
input.addEventListener('focus', function() {
if (this.value === '0') this.value = '';
});
input.addEventListener('blur', function() {
if (this.value.trim() === '') {
this.value = '0';
calcularTotales();
}
});
input.addEventListener('input', function(e) {
let value = this.value.replace(/\D/g, '');
if (value !== '') {
this.value = parseInt(value, 10).toLocaleString('es-CL');
} else {
this.value = '';
}
calcularTotales();
});
});
</script>