permitir 0s en dashboard
This commit is contained in:
@@ -38,6 +38,8 @@ services:
|
|||||||
- limpiar requirements.txt
|
- limpiar requirements.txt
|
||||||
- hacer que trabajador acompañante solo muestre trabajadores en el mismo modulo
|
- 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)
|
- 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:
|
# TODO peppermint:
|
||||||
## formulario
|
## formulario
|
||||||
- cantidad de boletas por metodo de pago
|
- cantidad de boletas por metodo de pago
|
||||||
|
|||||||
4
app.py
4
app.py
@@ -218,11 +218,11 @@ def worker_dashboard():
|
|||||||
# Función para limpiar puntos y validar presencia de datos
|
# Función para limpiar puntos y validar presencia de datos
|
||||||
def clean_and_validate(val):
|
def clean_and_validate(val):
|
||||||
if val is None or val.strip() == "":
|
if val is None or val.strip() == "":
|
||||||
return None
|
return 0 # <--- Cambiado de None a 0
|
||||||
try:
|
try:
|
||||||
return int(val.replace('.', ''))
|
return int(val.replace('.', ''))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return None
|
return 0 # <--- Cambiado de None a 0
|
||||||
|
|
||||||
# Captura y validación de campos obligatorios
|
# Captura y validación de campos obligatorios
|
||||||
tarjeta = clean_and_validate(request.form.get('venta_tarjeta'))
|
tarjeta = clean_and_validate(request.form.get('venta_tarjeta'))
|
||||||
|
|||||||
@@ -214,41 +214,41 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
const submitModal = document.getElementById('confirmSubmitModal');
|
const submitModal = document.getElementById('confirmSubmitModal');
|
||||||
const mainForm = document.querySelector('form'); // El formulario de la rendición
|
const mainForm = document.querySelector('form');
|
||||||
|
|
||||||
// Buscamos el botón de confirmar dentro del modal
|
|
||||||
const confirmBtn = submitModal.querySelector('button[type="submit"]');
|
const confirmBtn = submitModal.querySelector('button[type="submit"]');
|
||||||
|
|
||||||
// Cambiamos su comportamiento: que no haga el submit del form del modal,
|
// Función única de validación para no repetir código
|
||||||
// sino del formulario principal
|
function validarFormulario() {
|
||||||
confirmBtn.addEventListener('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
// Ejecutamos la validación manual antes de enviar
|
|
||||||
const requiredInputs = mainForm.querySelectorAll('[required]');
|
const requiredInputs = mainForm.querySelectorAll('[required]');
|
||||||
let valid = true;
|
let valid = true;
|
||||||
|
|
||||||
requiredInputs.forEach(input => {
|
requiredInputs.forEach(input => {
|
||||||
if (!input.value.trim()) {
|
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');
|
input.classList.add('is-invalid');
|
||||||
valid = false;
|
valid = false;
|
||||||
} else {
|
} else {
|
||||||
input.classList.remove('is-invalid');
|
input.classList.remove('is-invalid');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
if (valid) {
|
confirmBtn.addEventListener('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (validarFormulario()) {
|
||||||
mainForm.submit();
|
mainForm.submit();
|
||||||
} else {
|
} else {
|
||||||
// Si no es válido, cerramos el modal y avisamos
|
|
||||||
const modalInstance = bootstrap.Modal.getInstance(submitModal);
|
const modalInstance = bootstrap.Modal.getInstance(submitModal);
|
||||||
modalInstance.hide();
|
modalInstance.hide();
|
||||||
alert("Por favor, rellena todos los campos obligatorios antes de enviar.");
|
alert("Por favor, rellena los campos obligatorios (Fecha y Turno).");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -257,22 +257,21 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
const displayGeneral = document.getElementById('total_general');
|
const displayGeneral = document.getElementById('total_general');
|
||||||
|
|
||||||
function calcularTotales() {
|
function calcularTotales() {
|
||||||
// Limpiamos los puntos para sumar números puros
|
|
||||||
const getVal = (id) => {
|
const getVal = (id) => {
|
||||||
const el = document.getElementById(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 tarjeta = getVal('venta_tarjeta');
|
||||||
const mp = getVal('venta_mp');
|
const mp = getVal('venta_mp');
|
||||||
const efectivo = getVal('venta_efectivo');
|
const efectivo = getVal('venta_efectivo');
|
||||||
const gastos = getVal('gastos'); // Nuevo campo capturado
|
const gastos = getVal('gastos');
|
||||||
|
|
||||||
const totalDigital = tarjeta + mp;
|
const totalDigital = tarjeta + mp;
|
||||||
// El total general ahora resta los gastos para mostrar el neto real
|
|
||||||
const totalGeneral = (totalDigital + efectivo) - gastos;
|
const totalGeneral = (totalDigital + efectivo) - gastos;
|
||||||
|
|
||||||
// Formateamos de vuelta a moneda chilena
|
|
||||||
displayDigital.value = totalDigital.toLocaleString('es-CL');
|
displayDigital.value = totalDigital.toLocaleString('es-CL');
|
||||||
displayGeneral.value = totalGeneral.toLocaleString('es-CL');
|
displayGeneral.value = totalGeneral.toLocaleString('es-CL');
|
||||||
}
|
}
|
||||||
@@ -287,7 +286,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
let valid = true;
|
let valid = true;
|
||||||
|
|
||||||
requiredInputs.forEach(input => {
|
requiredInputs.forEach(input => {
|
||||||
if (!input.value.trim()) {
|
const isMoney = input.classList.contains('money-input');
|
||||||
|
if (!input.value.trim() && !isMoney) {
|
||||||
input.classList.add('is-invalid');
|
input.classList.add('is-invalid');
|
||||||
valid = false;
|
valid = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -303,13 +303,26 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
|
|
||||||
// Reuse our formatting script for the summary money inputs
|
// Reuse our formatting script for the summary money inputs
|
||||||
document.querySelectorAll('.money-input').forEach(function(input) {
|
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) {
|
input.addEventListener('input', function(e) {
|
||||||
let value = this.value.replace(/\D/g, '');
|
let value = this.value.replace(/\D/g, '');
|
||||||
if (value !== '') {
|
if (value !== '') {
|
||||||
this.value = parseInt(value, 10).toLocaleString('es-CL');
|
this.value = parseInt(value, 10).toLocaleString('es-CL');
|
||||||
} else {
|
|
||||||
this.value = '';
|
|
||||||
}
|
}
|
||||||
|
calcularTotales();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user