mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-28 06:38:51 +00:00
preparando el imprimir
This commit is contained in:
@ -43,7 +43,7 @@
|
||||
<i class="ri-file-paper-2-line"></i> <span th:text="#{app.sidebar.presupuestos}">Presupuestos</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<li th:if="${#authentication.principal.role == 'SUPERADMIN' or #authentication.principal.role == 'ADMIN'}" class="nav-item">
|
||||
<a class="nav-link menu-link collapsed" href="#sidebarConfig" data-bs-toggle="collapse"
|
||||
role="button" aria-expanded="false" aria-controls="sidebarConfig">
|
||||
<i class="ri-settings-2-line"></i> <span
|
||||
|
||||
@ -0,0 +1,195 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" lang="es">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title th:text="'Presupuesto ' + ${numero}">Presupuesto</title>
|
||||
<link rel="stylesheet" href="/assets/css/presupuesto.css" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- Header -->
|
||||
<header class="doc-header">
|
||||
<div class="brand">
|
||||
<img src="/img/logo-light.png" alt="ImprimeLibros" class="logo" />
|
||||
<div class="brand-meta">
|
||||
<div class="company-name" th:text="${empresa?.nombre} ?: 'ImprimeLibros ERP'">ImprimeLibros ERP</div>
|
||||
<div class="company-meta">
|
||||
<span th:text="${empresa?.direccion} ?: 'C/ Dirección 123, 28000 Madrid'">C/ Dirección 123, 28000 Madrid</span><br/>
|
||||
<span th:text="${empresa?.telefono} ?: '+34 600 000 000'">+34 600 000 000</span> ·
|
||||
<span th:text="${empresa?.email} ?: 'info@imprimelibros.com'">info@imprimelibros.com</span><br/>
|
||||
<span th:text="${empresa?.cif} ?: 'B-12345678'">B-12345678</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="doc-title">
|
||||
<div class="title-main">PRESUPUESTO</div>
|
||||
<table class="doc-info">
|
||||
<tr>
|
||||
<td>Nº</td>
|
||||
<td class="right" th:text="${numero}">2025-00123</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Fecha</td>
|
||||
<td class="right" th:text="${#temporals.format(fecha, 'dd/MM/yyyy')}">12/10/2025</td>
|
||||
</tr>
|
||||
<tr th:if="${validezDias != null}">
|
||||
<td>Validez</td>
|
||||
<td class="right" th:text="${validezDias} + ' días'">30 días</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Datos cliente / proyecto -->
|
||||
<section class="blocks">
|
||||
<div class="block">
|
||||
<div class="block-title">Cliente</div>
|
||||
<div class="block-body">
|
||||
<div class="row">
|
||||
<span class="label">Nombre:</span>
|
||||
<span class="value" th:text="${cliente?.nombre} ?: '-'">Editorial Ejemplo S.L.</span>
|
||||
</div>
|
||||
<div class="row">
|
||||
<span class="label">CIF/NIF:</span>
|
||||
<span class="value" th:text="${cliente?.cif} ?: '-'">B-00000000</span>
|
||||
</div>
|
||||
<div class="row">
|
||||
<span class="label">Dirección:</span>
|
||||
<span class="value" th:text="${cliente?.direccion} ?: '-'">Av. de los Libros, 45</span>
|
||||
</div>
|
||||
<div class="row" th:if="${cliente?.cp != null or cliente?.poblacion != null or cliente?.provincia != null}">
|
||||
<span class="label">Localidad:</span>
|
||||
<span class="value">
|
||||
<span th:text="${cliente?.cp} ?: ''"></span>
|
||||
<span th:text="${cliente?.poblacion} ?: ''"></span>
|
||||
<span th:text="${cliente?.provincia} ?: ''"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="row" th:if="${cliente?.email != null}">
|
||||
<span class="label">Email:</span>
|
||||
<span class="value" th:text="${cliente?.email}">comercial@editorial.com</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
<div class="block-title">Proyecto</div>
|
||||
<div class="block-body">
|
||||
<div class="row" th:if="${titulo != null}">
|
||||
<span class="label">Título:</span>
|
||||
<span class="value" th:text="${titulo}">Libro de Ejemplo</span>
|
||||
</div>
|
||||
<div class="row" th:if="${autor != null}">
|
||||
<span class="label">Autor:</span>
|
||||
<span class="value" th:text="${autor}">Autor/a</span>
|
||||
</div>
|
||||
<div class="row" th:if="${isbn != null}">
|
||||
<span class="label">ISBN:</span>
|
||||
<span class="value" th:text="${isbn}">978-1-2345-6789-0</span>
|
||||
</div>
|
||||
<div class="row" th:if="${ancho != null and alto != null}">
|
||||
<span class="label">Formato:</span>
|
||||
<span class="value">
|
||||
<span th:text="${ancho}">150</span> × <span th:text="${alto}">210</span> mm
|
||||
<span th:if="${formatoPersonalizado == true}">(personalizado)</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="row" th:if="${paginasNegro != null or paginasColor != null}">
|
||||
<span class="label">Páginas:</span>
|
||||
<span class="value">
|
||||
<span th:if="${paginasNegro != null}" th:text="'B/N ' + ${paginasNegro}"></span>
|
||||
<span th:if="${paginasColor != null}" th:text="' · Color ' + ${paginasColor}"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="row" th:if="${tiradas != null}">
|
||||
<span class="label">Tiradas:</span>
|
||||
<span class="value" th:text="${#strings.arrayJoin(tiradas, ', ')}">300, 500, 1000</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Conceptos principales -->
|
||||
<section class="table-section">
|
||||
<div class="section-title">Detalle del presupuesto</div>
|
||||
<table class="items">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-desc">Descripción</th>
|
||||
<th class="col-center">Uds</th>
|
||||
<th class="col-right">Precio unit.</th>
|
||||
<th class="col-right">Dto.</th>
|
||||
<th class="col-right">Importe</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- Línea tipo: interior, cubierta, manipulado, etc. -->
|
||||
<tr th:each="l : ${lineas}">
|
||||
<td class="col-desc">
|
||||
<div class="desc" th:text="${l.descripcion}">Impresión interior B/N 80 g</div>
|
||||
<div class="meta" th:if="${l.meta != null}" th:text="${l.meta}">
|
||||
300 páginas · offset 80 g · tinta negra
|
||||
</div>
|
||||
</td>
|
||||
<td class="col-center" th:text="${l.uds}">1000</td>
|
||||
<td class="col-right" th:text="${#numbers.formatDecimal(l.precio, 1, 'POINT', 2, 'COMMA')}">2,1500</td>
|
||||
<td class="col-right" th:text="${l.dto != null ? #numbers.formatDecimal(l.dto, 1, 'POINT', 2, 'COMMA') + '%':'-'}">-</td>
|
||||
<td class="col-right" th:text="${#numbers.formatDecimal(l.importe, 1, 'POINT', 2, 'COMMA')}">2.150,00</td>
|
||||
</tr>
|
||||
|
||||
<!-- Servicios extra (si vienen) -->
|
||||
<tr class="group-header" th:if="${servicios != null and !#lists.isEmpty(servicios)}">
|
||||
<td colspan="5">Servicios adicionales</td>
|
||||
</tr>
|
||||
<tr th:each="s : ${servicios}">
|
||||
<td class="col-desc">
|
||||
<div class="desc" th:text="${s.descripcion}">Transporte</div>
|
||||
</td>
|
||||
<td class="col-center" th:text="${s.unidades}">1</td>
|
||||
<td class="col-right" th:text="${#numbers.formatDecimal(s.precio, 1, 'POINT', 2, 'COMMA')}">90,00</td>
|
||||
<td class="col-right">-</td>
|
||||
<td class="col-right" th:text="${#numbers.formatDecimal(s.unidades * s.precio, 1, 'POINT', 2, 'COMMA')}">90,00</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<!-- Totales -->
|
||||
<section class="totals">
|
||||
<table class="totals-table">
|
||||
<tr>
|
||||
<td>Base imponible</td>
|
||||
<td class="right" th:text="${#numbers.formatDecimal(baseImponible, 1, 'POINT', 2, 'COMMA')}">2.180,00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td th:text="'IVA (' + ${ivaTipo} + '%)'">IVA (21%)</td>
|
||||
<td class="right" th:text="${#numbers.formatDecimal(ivaImporte, 1, 'POINT', 2, 'COMMA')}">457,80</td>
|
||||
</tr>
|
||||
<tr class="total-row">
|
||||
<td><strong>Total</strong></td>
|
||||
<td class="right"><strong th:text="${#numbers.formatDecimal(totalConIva, 1, 'POINT', 2, 'COMMA')}">2.637,80</strong></td>
|
||||
</tr>
|
||||
<tr th:if="${peso != null}">
|
||||
<td>Peso estimado</td>
|
||||
<td class="right" th:text="${#numbers.formatDecimal(peso, 1, 'POINT', 2, 'COMMA')} + ' kg'">120,00 kg</td>
|
||||
</tr>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<!-- Observaciones / condiciones -->
|
||||
<section class="notes" th:if="${observaciones != null or condiciones != null}">
|
||||
<div class="section-title">Observaciones</div>
|
||||
<div class="note-text" th:utext="${observaciones}">Presupuesto válido 30 días.</div>
|
||||
|
||||
<div class="section-title" th:if="${condiciones != null}">Condiciones</div>
|
||||
<div class="note-text" th:utext="${condiciones}">
|
||||
Entrega estimada 7-10 días laborables tras confirmación de artes finales.
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="doc-footer">
|
||||
<div class="footer-left" th:text="${empresa?.web} ?: 'www.imprimelibros.com'">www.imprimelibros.com</div>
|
||||
<div class="footer-right">Página <span class="page-number"></span> / <span class="page-count"></span></div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,10 +1,15 @@
|
||||
<!-- templates/fragments/common.html -->
|
||||
<div th:fragment="buttons(appMode)"
|
||||
th:if="${appMode == 'add' or appMode == 'edit'}"
|
||||
class="order-3 order-md-2 mx-md-auto d-flex">
|
||||
<button id="btn-guardar" type="button"
|
||||
<button th:if="${appMode == 'add' or appMode == 'edit'}" id="btn-guardar" type="button"
|
||||
class="btn btn-success d-flex align-items-center guardar-presupuesto">
|
||||
<i class="ri-save-3-line me-2"></i>
|
||||
<span th:text="#{presupuesto.guardar}">Guardar</span>
|
||||
</button>
|
||||
|
||||
<button id="btn-imprimir" type="button"
|
||||
class="btn btn-primary d-flex align-items-center imprimir-presupuesto">
|
||||
<i class="ri-printer-line me-2"></i>
|
||||
<span th:text="#{app.imprimir}">Imprimir</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -55,19 +55,15 @@
|
||||
|
||||
<div th:replace="~{imprimelibros/presupuestos/presupuestador-items/_buttons :: buttons(${appMode})}"></div>
|
||||
|
||||
<div th:unless="${#authorization.expression('isAuthenticated()')}">
|
||||
<button id="btn-add-cart" type="button"
|
||||
class="btn btn-secondary d-flex align-items-center order-2 order-md-3">
|
||||
<i class="mdi mdi-login label-icon align-middle fs-16 me-2"></i>
|
||||
<span th:text="#{presupuesto.resumen.inicie-sesion}">Inicie sesión para continuar</span>
|
||||
</button>
|
||||
</div>
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
<button id="btn-add-cart" type="button"
|
||||
class="btn btn-secondary d-flex align-items-center order-2 order-md-3">
|
||||
<span th:text="#{presupuesto.resumen.agregar-cesta}">Agregar a la cesta</span>
|
||||
<i class="ri-shopping-cart-2-line fs-16 ms-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
<button th:unless="${#authorization.expression('isAuthenticated()')}" id="btn-add-cart" type="button"
|
||||
class="btn btn-secondary d-flex align-items-center order-2 order-md-3">
|
||||
<i class="mdi mdi-login label-icon align-middle fs-16 me-2"></i>
|
||||
<span th:text="#{presupuesto.resumen.inicie-sesion}">Inicie sesión para continuar</span>
|
||||
</button>
|
||||
<button th:if="${#authorization.expression('isAuthenticated()')}" id="btn-add-cart" type="button"
|
||||
class="btn btn-secondary d-flex align-items-center order-2 order-md-3">
|
||||
<span th:text="#{presupuesto.resumen.agregar-cesta}">Agregar a la cesta</span>
|
||||
<i class="ri-shopping-cart-2-line fs-16 ms-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -15,6 +15,7 @@
|
||||
|
||||
<form action="#">
|
||||
<input type="hidden" id="cliente_id" th:value="${cliente_id} ?: null" />
|
||||
<input type="hidden" id="presupuesto_id" th:value="${presupuesto_id} ?: null" />
|
||||
|
||||
<div id="form-errors" class="alert alert-danger d-none" role="alert">
|
||||
<i class="ri-error-warning-line label-icon"></i>
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
|
||||
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}"
|
||||
th:unless="${#authorization.expression('isAuthenticated()') and (#authorization.expression('hasRole('SUPERADMIN', 'ADMIN')'))}" />
|
||||
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
|
||||
|
||||
<th:block layout:fragment="content">
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
<div th:fragment="tabla-cliente-user">
|
||||
<table id="presupuestos-clientes-user-datatable" class="table table-striped table-nowrap responsive w-100">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.id}">ID</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.titulo}">Título</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.encuadernacion}">Encuadernación</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.cubierta}">Cubierta</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.tipo-impresion}">Tipo de impresión</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.tirada}">Tirada</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.paginas}">Páginas</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.estado}">Estado</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.total-iva}">Total con IVA</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.updated-at}">Actualizado el</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.acciones}">Acciones</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="id" /></th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="titulo" /></th>
|
||||
</th>
|
||||
<th>
|
||||
<select class="form-select form-select-sm presupuesto-select-filter" data-col="tipoEncuadernacion">
|
||||
<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 presupuesto-select-filter" data-col="tipoCubierta">
|
||||
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
|
||||
<option value="tapaBlanda" th:text="#{presupuesto.tapa-blanda}">Tapa blanda</option>
|
||||
<option value="tapaDura" th:text="#{presupuesto.tapa-dura}">Tapa dura</option>
|
||||
<option value="tapaDuraLomoRedondo" th:text="#{presupuesto.tapa-dura-lomo-redondo}">Tapa dura
|
||||
lomo redondo</option>
|
||||
</select>
|
||||
</th>
|
||||
<th>
|
||||
<select class="form-select form-select-sm presupuesto-select-filter" data-col="tipoImpresion">
|
||||
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
|
||||
<option value="negro" th:text="#{presupuesto.blanco-negro}">B/N</option>
|
||||
<option value="negrohq" th:text="#{presupuesto.blanco-negro-premium}">B/N HQ</option>
|
||||
<option value="color" th:text="#{presupuesto.color}">Color</option>
|
||||
<option value="colorhq" th:text="#{presupuesto.color-premium}">Color HQ</option>
|
||||
</select>
|
||||
</th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="selectedTirada" /></th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="paginas" />
|
||||
</th>
|
||||
<th>
|
||||
<select class="form-select form-select-sm presupuesto-select-filter" data-col="estado">
|
||||
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
|
||||
<option value="borrador" th:text="#{presupuesto.estado.borrador}">Borrador</option>
|
||||
<option value="aceptado" th:text="#{presupuesto.estado.aceptado}">Aceptado</option>
|
||||
<option value="modificado" th:text="#{presupuesto.estado.modificado}">Modificado</option>
|
||||
</select>
|
||||
</th>
|
||||
<th></th> <!-- Total con IVA (sin filtro) -->
|
||||
<th></th> <!-- Actualizado el (sin filtro) -->
|
||||
<th></th> <!-- Acciones (sin filtro) -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@ -3,8 +3,8 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.id}">ID</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.titulo}">Título</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.cliente}">Cliente</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.titulo}">Título</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.encuadernacion}">Encuadernación</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.cubierta}">Cubierta</th>
|
||||
<th scope="col" th:text="#{presupuesto.tabla.tipo-impresion}">Tipo de impresión</th>
|
||||
@ -17,9 +17,8 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="id" /></th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="user.fullName" /></th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="titulo" /></th>
|
||||
<th><input type="text" class="form-control form-control-sm presupuesto-filter" data-col="user.fullName" />
|
||||
</th>
|
||||
<th>
|
||||
<select class="form-select form-select-sm presupuesto-select-filter" data-col="tipoEncuadernacion">
|
||||
<option value="" th:text="#{margenes-presupuesto.todos}">Todos</option>
|
||||
|
||||
@ -15,11 +15,13 @@
|
||||
|
||||
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
|
||||
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}"
|
||||
th:unless="${#authorization.expression('isAuthenticated()') and (#authorization.expression('hasRole('SUPERADMIN', 'ADMIN')'))}" />
|
||||
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
|
||||
|
||||
<th:block layout:fragment="content">
|
||||
<div th:if="${#authorization.expression('isAuthenticated()')}">
|
||||
|
||||
<input type="hidden" id="cliente_id" th:value="${#authentication.principal.id}" />
|
||||
|
||||
|
||||
<div class="container-fluid">
|
||||
<nav aria-label="breadcrumb">
|
||||
@ -45,7 +47,8 @@
|
||||
</button>
|
||||
|
||||
|
||||
<ul class="nav nav-pills arrow-navtabs nav-secondary-outline bg-light mb-3" role="tablist">
|
||||
<ul class="nav nav-pills arrow-navtabs nav-secondary-outline bg-light mb-3" role="tablist"
|
||||
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
|
||||
<li class="nav-item" role="presentation">
|
||||
<a class="nav-link active" data-bs-toggle="tab" href="#arrow-presupuestos-cliente" role="tab"
|
||||
aria-selected="true">
|
||||
@ -64,7 +67,7 @@
|
||||
</li>
|
||||
</ul>
|
||||
<!-- Tab panes -->
|
||||
<div class="tab-content text-muted">
|
||||
<div class="tab-content text-muted" sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
|
||||
<div class="tab-pane active show" id="arrow-presupuestos-cliente" role="tabpanel">
|
||||
|
||||
<div
|
||||
@ -79,6 +82,11 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div th:if="${#authorization.expression('isAuthenticated() and hasRole(''USER'')')}"
|
||||
th:insert="~{imprimelibros/presupuestos/presupuesto-list-items/tabla-cliente-user :: tabla-cliente-user}">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
@ -100,7 +108,8 @@
|
||||
<script th:src="@{/assets/libs/datatables/buttons.print.min.js}"></script>
|
||||
<script th:src="@{/assets/libs/datatables/buttons.colVis.min.js}"></script>
|
||||
|
||||
<script type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/list.js}"></script>
|
||||
<script sec:authorize="isAuthenticated() and hasAnyRole('ADMIN', 'SUPERADMIN')" type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/list.js}"></script>
|
||||
<script sec:authorize="isAuthenticated() and hasAnyRole('USER')" type="module" th:src="@{/assets/js/pages/imprimelibros/presupuestos/list-user.js}"></script>
|
||||
</th:block>
|
||||
</body>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user