permitir 0s en dashboard
This commit is contained in:
@@ -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
4
app.py
@@ -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'))
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user