modificado los margenes por precio en lugar de por tirada y tipos

This commit is contained in:
2025-10-20 09:37:04 +02:00
parent 1888850a64
commit d3ef954ceb
14 changed files with 275 additions and 331 deletions

View File

@ -6,18 +6,14 @@ margenes-presupuesto.editar=Editar margen
margenes-presupuesto.eliminar=Eliminar
margenes-presupuesto.tabla.id=ID
margenes-presupuesto.tabla.tipo_encuadernacion=Tipo encuadernación
margenes-presupuesto.tabla.tipo_cubierta=Tipo cubierta
margenes-presupuesto.tabla.tirada_minima=Tirada Mín.
margenes-presupuesto.tabla.tirada_maxima=Tirada Máx.
margenes-presupuesto.tabla.importe_minimo=Importe Mín.
margenes-presupuesto.tabla.importe_maximo=Importe Máx.
margenes-presupuesto.tabla.margen_minimo=Margen Mín.
margenes-presupuesto.tabla.margen_maximo=Margen Máx.
margenes-presupuesto.tabla.acciones=Acciones
margenes-presupuesto.form.tipo_encuadernacion=Tipo de encuadernación
margenes-presupuesto.form.tipo_cubierta=Tipo de cubierta
margenes-presupuesto.form.tirada_minima=Tirada mínima
margenes-presupuesto.form.tirada_maxima=Tirada máxima
margenes-presupuesto.form.importe_minimo=Importe mínimo
margenes-presupuesto.form.importe_maximo=Importe máximo
margenes-presupuesto.form.margen_minimo=Margen mínimo (%)
margenes-presupuesto.form.margen_maximo=Margen máximo (%)

View File

@ -1,3 +1,5 @@
import {normalizeNumericFilter} from '../../utils.js';
(() => {
// si jQuery está cargado, añade CSRF a AJAX
const csrfToken = document.querySelector('meta[name="_csrf"]')?.getAttribute('content');
@ -22,7 +24,6 @@
processing: true,
serverSide: true,
orderCellsTop: true,
stateSave: true,
pageLength: 50,
language: { url: '/assets/libs/datatables/i18n/' + language + '.json' },
responsive: true,
@ -45,18 +46,12 @@
ajax: {
url: '/configuracion/margenes-presupuesto/datatable',
method: 'GET',
data: function (d) {
d.f_encuadernacion = $('#search-encuadernacion').val() || ''; // 'USER' | 'ADMIN' | 'SUPERADMIN' | ''
d.f_cubierta = $('#search-cubierta').val() || ''; // 'true' | 'false' | ''
}
},
order: [[0, 'asc']],
columns: [
{ data: 'id', name: 'id', orderable: true },
{ data: 'tipoEncuadernacion', name: 'tipoEncuadernacion', orderable: true },
{ data: 'tipoCubierta', name: 'tipoCubierta', orderable: true },
{ data: 'tiradaMin', name: 'tiradaMin', orderable: true },
{ data: 'tiradaMax', name: 'tiradaMax', orderable: true },
{ data: 'importeMin', name: 'importeMin', orderable: true },
{ data: 'importeMax', name: 'importeMax', orderable: true },
{ data: 'margenMax', name: 'margenMax', orderable: true },
{ data: 'margenMin', name: 'margenMin', orderable: true },
{ data: 'actions', name: 'actions' }
@ -69,7 +64,7 @@
const colIndex = table.settings()[0].aoColumns.findIndex(c => c.name === colName);
if (colIndex >= 0) {
table.column(colIndex).search(this.value).draw();
table.column(colIndex).search(normalizeNumericFilter(this.value)).draw();
}
});

View File

@ -64,4 +64,17 @@ export function bracketPrefix(obj, prefix) {
out[`${prefix}[${k}]`] = v;
});
return out;
}
export function normalizeNumericFilter(input) {
if (!input) return input;
// Convierte todos los números del string:
// - Quita separadores de miles con punto
// - Cambia coma decimal por punto
// Mantiene operadores (>=, <=, <, >) y rangos con '-'
return input.replace(
/\d{1,3}(?:\.\d{3})*(?:,\d+)?|\d+(?:,\d+)?/g,
(num) => num.replace(/\./g, '').replace(',', '.')
);
}

View File

@ -9,41 +9,17 @@
</div>
<div class="form-group">
<label th:text="#{margenes-presupuesto.form.tipo_encuadernacion}" for="tipo_encuadernacion">Tipo de Encuadernación</label>
<select class="form-control" id="tipo_encuadernacion" th:field="*{tipoEncuadernacion}" required
th:classappend="${#fields.hasErrors('tipoEncuadernacion')} ? ' is-invalid'">
<option value="fresado" th:text="#{presupuesto.fresado}" selected>Fresado</option>
<option value="cosido" th:text="#{presupuesto.cosido}">Cosido</option>
<option value="espiral" th:text="#{presupuesto.espiral}">Espiral</option>
<option value="wireo" th:text="#{presupuesto.wireo}">Wire-O</option>
<option value="grapado" th:text="#{presupuesto.grapado}">Grapado</option>
</select>
<div class="invalid-feedback" th:if="${#fields.hasErrors('tipoEncuadernacion')}" th:errors="*{tipoEncuadernacion}">Error</div>
<label th:text="#{margenes-presupuesto.form.importe_minimo}" for="importe_minimo">Importe Mínimo</label>
<input type="number" class="form-control" id="importe_minimo" th:field="*{importeMin}" min="1"
th:classappend="${#fields.hasErrors('importeMin')} ? ' is-invalid'" required>
<div class="invalid-feedback" th:if="${#fields.hasErrors('importeMin')}" th:errors="*{importeMin}">Error</div>
</div>
<div class="form-group">
<label th:text="#{margenes-presupuesto.form.tipo_cubierta}" for="tipo_cubierta">Tipo de Cubierta</label>
<select class="form-control" id="tipo_cubierta" th:field="*{tipoCubierta}" required
th:classappend="${#fields.hasErrors('tipoCubierta')} ? ' is-invalid'">
<option value="tapaBlanda" th:text="#{presupuesto.tapaBlanda}" selected>Tapa Blanda</option>
<option value="tapaDura" th:text="#{presupuesto.tapaDura}">Tapa Dura</option>
<option value="tapaDuraLomoRedondo" th:text="#{presupuesto.tapaDuraLomoRedondo}">Tapa Dura Lomo Redondo</option>
</select>
<div class="invalid-feedback" th:if="${#fields.hasErrors('tipoCubierta')}" th:errors="*{tipoCubierta}">Error</div>
</div>
<div class="form-group">
<label th:text="#{margenes-presupuesto.form.tirada_minima}" for="tirada_minima">Tirada Mínima</label>
<input type="number" class="form-control" id="tirada_minima" th:field="*{tiradaMin}" min="1"
th:classappend="${#fields.hasErrors('tiradaMin')} ? ' is-invalid'" required>
<div class="invalid-feedback" th:if="${#fields.hasErrors('tiradaMin')}" th:errors="*{tiradaMin}">Error</div>
</div>
<div class="form-group">
<label th:text="#{margenes-presupuesto.form.tirada_maxima}" for="tirada_maxima">Tirada Máxima</label>
<input type="number" class="form-control" id="tirada_maxima" th:field="*{tiradaMax}" min="1"
th:classappend="${#fields.hasErrors('tiradaMax')} ? ' is-invalid'" required>
<div class="invalid-feedback" th:if="${#fields.hasErrors('tiradaMax')}" th:errors="*{tiradaMax}">Error</div>
<label th:text="#{margenes-presupuesto.form.importe_maximo}" for="importe_maximo">Importe Máximo</label>
<input type="number" class="form-control" id="importe_maximo" th:field="*{importeMax}" min="1"
th:classappend="${#fields.hasErrors('importeMax')} ? ' is-invalid'" required>
<div class="invalid-feedback" th:if="${#fields.hasErrors('importeMax')}" th:errors="*{importeMax}">Error</div>
</div>
<div class="form-group">

View File

@ -45,11 +45,8 @@
<thead>
<tr>
<th scope="col" th:text="#{margenes-presupuesto.tabla.id}">ID</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.tipo_encuadernacion}">Tipo
encuadernación</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.tipo_cubierta}">Tipo cubierta</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.tirada_minima}">Tirada Mín.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.tirada_maxima}">Tirada Máx.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.importe_minimo}">Importe Mín.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.importe_maximo}">Importe Máx.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.margen_maximo}">Margen Máx.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.margen_minimo}">Margen Mín.</th>
<th scope="col" th:text="#{margenes-presupuesto.tabla.acciones}">Acciones</th>
@ -58,33 +55,12 @@
<th><input type="text" class="form-control form-control-sm margenes-presupuesto-filter"
data-col="id" /></th>
<th>
<select class="form-select form-select-sm margenes-presupuesto-select-filter"
id="search-encuadernacion">
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
<option value="fresado" th:text="#{presupuesto.fresado}">Fresado</option>
<option value="cosido" th:text="#{presupuesto.cosido}">Cosido</option>
<option value="espiral" th:text="#{presupuesto.espiral}">Espiral</option>
<option value="wireo" th:text="#{presupuesto.wireo}">Wireo</option>
<option value="grapado" th:text="#{presupuesto.grapado}">Grapado</option>
</select>
</th>
<th>
<select class="form-select form-select-sm margenes-presupuesto-select-filter"
id="search-cubierta">
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
<option value="tapaBlanda" th:text="#{presupuesto.tapa-blanda}"></option>
<option value="tapaDura" th:text="#{presupuesto.tapa-dura}"></option>
<option value="tapaDuraLomoRedondo" th:text="#{presupuesto.tapa-dura-lomo-redondo}">
</option>
</select>
<input type="text" class="form-control form-control-sm margenes-presupuesto-filter"
data-col="importeMin" />
</th>
<th>
<input type="text" class="form-control form-control-sm margenes-presupuesto-filter"
data-col="tiradaMin" />
</th>
<th>
<input type="text" class="form-control form-control-sm margenes-presupuesto-filter"
data-col="tiradaMax" />
data-col="importeMax" />
</th>
<th>
<input type="text" class="form-control form-control-sm margenes-presupuesto-filter"
@ -122,7 +98,7 @@
<script th:src="@{/assets/libs/datatables/buttons.print.min.js}"></script>
<script th:src="@{/assets/libs/datatables/buttons.colVis.min.js}"></script>
<script th:src="@{/assets/js/pages/imprimelibros/configuracion/margenes-presupuesto/list.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/configuracion/margenes-presupuesto/list.js}"></script>
</th:block>
</body>