terminado (provisional) modulo de facturas

This commit is contained in:
2026-01-07 21:21:33 +01:00
parent 292aebcf65
commit 8263d97bf7
27 changed files with 13608 additions and 720 deletions

View File

@ -0,0 +1,120 @@
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{imprimelibros/layout}">
<head>
<th:block layout:fragment="pagetitle" />
<th:block th:replace="~{imprimelibros/partials/head-css :: head-css}" />
<th:block layout:fragment="pagecss">
<link th:href="@{/assets/css/presupuestador.css}" rel="stylesheet"
th:unless="${#authorization.expression('isAuthenticated()')}" />
<link th:href="@{/assets/libs/datatables/dataTables.bootstrap5.min.css}" rel="stylesheet" />
<link sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
th:href="@{/assets/libs/quill/quill.snow.css}" rel="stylesheet" type="text/css" />
</th:block>
</head>
<body>
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}" />
<th:block layout:fragment="content">
<div th:if="${#authorization.expression('isAuthenticated()')}">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/"><i class="ri-home-5-fill"></i></a></li>
<li class="breadcrumb-item"><a href="/facturas" th:text="#{facturas.breadcrumb}"></a></li>
<li class="breadcrumb-item active" aria-current="page" th:text="#{facturas.breadcrumb.nueva}">
Nueva factura</li>
</ol>
</nav>
<div class="container-fluid position-relative">
<div class="row">
<div class="col-xs-12 col-md-6 mb-3">
<label for="clienteSelect" class="form-label" th:text="#{facturas.form.cliente}">Cliente</label>
<select id="clienteSelect" class="form-select select2"
th:placeholder="#{facturas.form.cliente.placeholder}">
<option th:each="cliente : ${clientes}" th:value="${cliente.id}"
th:text="${cliente.nombre} + ' (' + cliente.email + ')'"></option>
</select>
</div>
<div class="col-xs-12 col-md-6 mb-3">
<label for="serieInput" class="form-label" th:text="#{facturas.form.serie}">Serie de
facturación</label>
<select id="serieInput" class="form-select select2" disabled
th:data-default-serie-rect="${defaultSerieRectificativa}">
</select>
</div>
<!-- salto de fila SOLO en md+ -->
<div class="w-100 d-none d-md-block"></div>
<div class="col-12 col-md-6 mb-3">
<label for="direccionFacturacion" class="form-label"
th:text="#{facturas.form.direccion-facturacion}">
Factura rectificada
</label>
<select id="direccionFacturacion" class="form-select select2" disabled></select>
</div>
<div class="col-12 col-md-6 mb-3 d-none" id="div-factura-rectificada">
<label for="facturaRectificada" class="form-label"
th:text="#{facturas.form.factura-rectificada}">
Factura rectificada
</label>
<select id="facturaRectificada" class="form-select select2"></select>
</div>
</div> <!-- end row -->
<div class="row mt-3 justify-content-md-end g-2">
<div class="col-12 col-md-auto">
<button type="button" th:text="#{app.guardar}" id="save-btn" class="btn btn-secondary w-100">
Guardar
</button>
</div>
<div class="col-12 col-md-auto">
<button type="button" th:text="#{app.cancelar}" id="cancel-btn" class="btn btn-light w-100">
Cancelar
</button>
</div>
</div>
</div>
</div>
</th:block>
<th:block layout:fragment="modal" />
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
<th:block layout:fragment="pagejs">
<script th:inline="javascript">
window.languageBundle = /*[[${languageBundle}]]*/ {};
</script>
<script th:src="@{/assets/libs/datatables/datatables.min.js}"></script>
<script th:src="@{/assets/libs/datatables/dataTables.bootstrap5.min.js}"></script>
<!-- JS de Buttons y dependencias -->
<script th:src="@{/assets/libs/datatables/dataTables.buttons.min.js}"></script>
<script th:src="@{/assets/libs/jszip/jszip.min.js}"></script>
<script th:src="@{/assets/libs/pdfmake/pdfmake.min.js}"></script>
<script th:src="@{/assets/libs/pdfmake/vfs_fonts.min.js}"></script>
<script th:src="@{/assets/libs/datatables/buttons.html5.min.js}"></script>
<script th:src="@{/assets/libs/datatables/buttons.print.min.js}"></script>
<script th:src="@{/assets/libs/datatables/buttons.colVis.min.js}"></script>
<script sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
th:src="@{/assets/libs/quill/quill.min.js}"></script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/facturas/add.js}"></script>
</th:block>
</body>
</html>

View File

@ -16,10 +16,14 @@
<div class="row g-3">
<!-- Número (solo lectura siempre, normalmente) -->
<div class="col-md-3">
<div th:if="${factura.numeroFactura != null}" class="col-md-3">
<label class="form-label" th:text="#{facturas.form.numero-factura}">Número de factura</label>
<input id="facturaNumero" type="text" class="form-control" th:value="${factura.numeroFactura}" readonly>
</div>
<div th:if="${factura.numeroFactura == null}" class="col-md-3">
<label class="form-label" th:text="#{facturas.form.id}">ID de la factura</label>
<input id="facturaId" type="text" class="form-control" th:value="${factura.id}" readonly>
</div>
<!-- Serie -->
<div class="col-md-3">
@ -43,6 +47,15 @@
</select>
</div>
<!-- Factura rectificada -->
<div th:if="${factura.facturaRectificada != null}" class="w-100 d-md-block"></div>
<div th:if="${factura.facturaRectificada != null}" class="col-md-3">
<label class="form-label" th:text="#{facturas.form.factura-rectificada}">Factura rectificada</label>
<input readonly id="facturaRectificadaId" class="form-control"
th:value="${factura.facturaRectificada.numeroFactura}" />
</div>
<div th:if="${factura.facturaRectificada != null}" class="w-100 d-md-block"></div>
<div class="col-md-3">
<label class="form-label" th:text="#{facturas.form.fecha-emision}">Fecha</label>

View File

@ -73,24 +73,24 @@
Aceptar ferro
</button>
<button th:if="${item.estado.priority >= 7 && item.estado.priority < 11 && item.buttons.ferro}"
<button
th:if="${item.estado.priority >= 7 and item.estado.priority <= 11 and item['buttons'] != null and item['buttons']['ferro'] == true}"
type="button" class="btn btn-light w-100 btn-download-ferro"
th:text="#{pedido.view.ferro-download}"
th:attr="data-linea-id=${item.lineaId}">
th:text="#{pedido.view.ferro-download}" th:attr="data-linea-id=${item.lineaId}">
Descargar ferro
</button>
<button th:if="${item.estado.priority >= 7 && item.estado.priority < 11 && item.buttons.cub}"
<button
th:if="${item.estado.priority >= 7 and item.estado.priority <= 11 and item['buttons'] != null and item['buttons']['cub'] == true}"
type="button" class="btn btn-light w-100 btn-download-cub"
th:text="#{pedido.view.cub-download}"
th:attr="data-linea-id=${item.lineaId}">
th:text="#{pedido.view.cub-download}" th:attr="data-linea-id=${item.lineaId}">
Descargar cubierta
</button>
<button th:if="${item.estado.priority >= 7 && item.estado.priority < 11 && item.buttons.tapa}"
<button
th:if="${item.estado.priority >= 7 and item.estado.priority <= 11 and item['buttons'] != null and item['buttons']['tapa'] == true}"
type="button" class="btn btn-light w-100 btn-download-tapa"
th:text="#{pedido.view.tapa-download}"
th:attr="data-linea-id=${item.lineaId}">
th:text="#{pedido.view.tapa-download}" th:attr="data-linea-id=${item.lineaId}">
Descargar tapa
</button>
</div>
@ -136,7 +136,7 @@
<div class="d-flex flex-wrap my-n1">
<!-- Actualizar estado-->
<div class="update-estado-button"
th:if="${item.estado.name != 'cancelado' && item.estado.name != 'maquetacion' && item.estado.name != 'terminado'}">
th:if="${item.estado.name != 'cancelado' && item.estado.name != 'maquetacion' && item.estado.name != 'enviado'}">
<a href="javascript:void(0);" class="d-block text-body p-1 px-2 update-status-item"
th:attr="data-linea-id=${item.lineaId}">
<i class="ri-refresh-line text-muted align-bottom me-1"><span

View File

@ -43,6 +43,7 @@
pais=${direccionFacturacion != null ? direccionFacturacion.paisNombre : ''}
)}">
</div>
</div>
<th:block th:if="${isAdmin and showCancel}">
<div sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
@ -60,11 +61,23 @@
</div>
</div>
</th:block>
<th:block th:if="${showDownloadFactura}">
<div class="col-12 col-md-auto">
<div class="card card border mb-3">
<div class="card-header bg-light">
<span class="fs-16" th:text="#{'pedido.view.actions'}"></span>
</div>
<div class="card-body">
<button type="button" th:attr="data-factura-id=${facturaId}" class="btn btn-secondary w-100 btn-download-factura"
th:text="#{pedido.view.descargar-factura}">
Descargar factura
</button>
</div>
</div>
</div>
</th:block>
</div>
<th:block th:each="linea: ${lineas}">
<div
th:insert="~{imprimelibros/pedidos/pedidos-linea :: pedido-linea (item=${linea}, isAdmin=${isAdmin})}">