haciendo vista de pagos

This commit is contained in:
2025-11-04 15:29:29 +01:00
parent 7516e9e91e
commit dc64e40e38
11 changed files with 186 additions and 6 deletions

View File

@ -0,0 +1,20 @@
package com.imprimelibros.erp.payments;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
@RequestMapping("/pagos")
@PreAuthorize("hasRole('SUPERADMIN')")
public class PaymentController {
@GetMapping()
public String index() {
return "imprimelibros/pagos/gestion-pagos";
}
}

View File

@ -187,7 +187,7 @@ public class PaymentService {
p.setStatus(PaymentStatus.failed);
p.setFailedAt(LocalDateTime.now());
}
payRepo.save(p);
if (!authorized) {

View File

@ -23,5 +23,6 @@ app.sidebar.configuracion=Configuración
app.sidebar.usuarios=Usuarios
app.sidebar.direcciones=Mis Direcciones
app.sidebar.direcciones-admin=Administrar Direcciones
app.sidebar.gestion-pagos=Gestión de Pagos
app.errors.403=No tienes permiso para acceder a esta página.

View File

@ -0,0 +1,4 @@
pagos.module-title=Gestión de Pagos
pagos.tab.movimientos-redsys=Movimientos Redsys
pagos.tab.transferencias-bancarias=Transferencias Bancarias

View File

@ -422,7 +422,7 @@ $(() => {
return;
}
// Éxito real: cerrar y recargar tabla
modal.addClass('d-none');
$('#direccionFormModal').modal('hide');
seleccionarDireccionEnvio();
},
error: function (xhr) {
@ -432,7 +432,6 @@ $(() => {
const isEdit = $('#direccionFormModalBody #direccionForm input[name="_method"][value="PUT"]').length > 0;
const title = $('#direccionFormModalBody #direccionForm').data(isEdit ? 'edit' : 'add');
$('#direccionModal .modal-title').text(title);
initSelect2Cliente(true);
return;
}
// Fallback

View File

@ -153,10 +153,59 @@ $(() => {
$('#btn-checkout').prop('disabled', true);
});
$('input[name="paymentMethod"]').on('change', function() {
$('input[name="paymentMethod"]').on('change', function () {
const method = $(this).val();
// set the hidden input value in the form
$('input[name="method"]').val(method);
});
$(document).on("change", ".direccionFacturacion", function () {
const isChecked = $(this).is(':checked');
if (isChecked) {
$('.direccionFacturacionItems').removeClass('d-none');
} else {
$('.direccionFacturacionItems').addClass('d-none');
$('#razonSocial').val('');
$('#tipoIdentificacionFiscal').val('DNI');
$('#identificacionFiscal').val('');
}
});
$(document).on('submit', '#direccionForm', function (e) {
e.preventDefault();
const $form = $(this);
$.ajax({
url: $form.attr('action'),
type: 'POST', // PUT simulado via _method
data: $form.serialize(),
dataType: 'html',
success: function (html) {
// Si por cualquier motivo llega 200 con fragmento, lo insertamos igual
if (typeof html === 'string' && html.indexOf('id="direccionForm"') !== -1 && html.indexOf('<html') === -1) {
$('#direccionFormModalBody').html(html);
const isEdit = $('#direccionFormModalBody #direccionForm input[name="_method"][value="PUT"]').length > 0;
const title = $('#direccionFormModalBody #direccionForm').data(isEdit ? 'edit' : 'add');
$('#direccionModal .modal-title').text(title);
return;
}
// Éxito real: cerrar y recargar tabla
$('#direccionFormModal').modal('hide');
seleccionarDireccionEnvio();
},
error: function (xhr) {
// Con 422 devolvemos el fragmento con errores aquí
if (xhr.status === 422 && xhr.responseText) {
$('#direccionFormModalBody').html(xhr.responseText);
const isEdit = $('#direccionFormModalBody #direccionForm input[name="_method"][value="PUT"]').length > 0;
const title = $('#direccionFormModalBody #direccionForm').data(isEdit ? 'edit' : 'add');
$('#direccionModal .modal-title').text(title);
return;
}
// Fallback
$('#direccionFormModalBody').html('<div class="p-3 text-danger">Error inesperado.</div>');
}
});
});
});

View File

@ -181,7 +181,7 @@
});
// Submit del form en el modal
$(document).on('submit', '#direccionForm', function (e) {
$(document).on('submit', '#direccionForm', function (e) {
e.preventDefault();
const $form = $(this);

View File

@ -0,0 +1,3 @@
$(()=>{
})

View File

@ -0,0 +1,96 @@
<!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/libs/datatables/dataTables.bootstrap5.min.css}" rel="stylesheet" />
</th:block>
<th:block layout:fragment="pagecss">
</th:block>
</head>
<body>
<div th:replace="~{imprimelibros/partials/topbar :: topbar}" />
<div th:replace="~{imprimelibros/partials/sidebar :: sidebar}"
sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')">
<th:block layout:fragment="content">
<div th:if="${#authorization.expression('isAuthenticated()')}">
<div class="container-fluid">
<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 active" aria-current="page" th:text="#{pagos.module-title}">
Gestión de Pagos</li>
</ol>
</nav>
</div>
<div class="container-fluid">
<div th:if="${errorMessage}" class="alert alert-danger alert-dismissible fade show" role="alert">
<span th:text="${errorMessage}"></span>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<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-redsys" role="tab"
aria-selected="true">
<span class="d-block d-sm-none"><i class="mdi mdi-home-variant"></i></span>
<span class="d-none d-sm-block" th:text="#{pagos.tab.movimientos-redsys}">Movimientos
Redsys</span>
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link" data-bs-toggle="tab" href="#arrow-transferencias" role="tab"
aria-selected="false" tabindex="-1">
<span class="d-block d-sm-none"><i class="mdi mdi-account"></i></span>
<span class="d-none d-sm-block"
th:text="#{pagos.tab.transferencias-bancarias}">Transferencias bancarias</span>
</a>
</li>
</ul>
<!-- Tab panes -->
<div class="tab-content text-muted">
<div class="tab-pane active show" id="arrow-redsys" role="tabpanel">
<!---
<div
th:insert="~{imprimelibros/presupuestos/presupuesto-list-items/tabla-cliente :: tabla-cliente}">
</div>
--->
</div>
<div class="tab-pane" id="arrow-transferencias" role="tabpanel">
<!---
<div
th:insert="~{imprimelibros/presupuestos/presupuesto-list-items/tabla-anonimos :: tabla-anonimos}">
</div>
-->
</div>
</div>
</div>
</div>
</th:block>
<th:block th:replace="~{theme/partials/vendor-scripts :: scripts}" />
<th:block layout:fragment="pagejs">
<script th:inline="javascript">
window.languageBundle = /*[[${languageBundle}]]*/ {};
</script>
<script type="module" th:src="@{/assets/js/pages/imprimelibros/pagos/pagos.js}"></script>
</th:block>
</body>
</html>

View File

@ -53,6 +53,14 @@
th:text="#{app.sidebar.direcciones}">Mis Direcciones</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link menu-link" href="/pagos" th:if="${#authentication.principal.role == 'SUPERADMIN'}">
<i class="ri-money-euro-box-line"></i>
<span
th:text="#{app.sidebar.gestion-pagos}">Administrar Pagos</span>
</span>
</a>
</li>
<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">