From deb3434d7db84a5148c0d6c9ab907ee9128b11ba Mon Sep 17 00:00:00 2001 From: "Brayan.Gonzalez" Date: Fri, 25 Apr 2025 13:34:25 -0700 Subject: [PATCH] - DEVOLUCION DE ABONOS --- .../admin/ClosingDayController.java | 32 +- .../prase/PagosPolizaController.java | 202 +++++++++ .../model/admin/ClosingDayDetail.java | 413 +++++++----------- .../taxiservicios/model/enums/TipoAbono.java | 84 ++-- .../prase/model/prase/DetellePagoPoliza.java | 25 ++ .../SolicitudDevolucionDetellePagoPoliza.java | 240 ++++++++++ .../src/main/resources/taxi.cfg.xml | 1 + .../beans/admin/AddClosingDayBean.java | 23 +- .../prase/AprobarDevolucionDePagosBean.java | 156 +++++++ .../crov/prase/prase/PagosPolizasBean.java | 68 ++- .../java/com/crov/prase/prase/PolizaBean.java | 2 + .../taxiservicios/i18n/taxi.properties | 1 + .../i18n/taxi_permissions_config.properties | 4 + .../src/main/webapp/WEB-INF/sidebar.xhtml | 3 +- .../app/admin/smallBox/dailyCash/add.xhtml | 2 +- .../poliza/aprobarDevolucionDePagos.xhtml | 97 ++++ .../main/webapp/app/prase/poliza/pagos.xhtml | 56 ++- 17 files changed, 1082 insertions(+), 327 deletions(-) create mode 100644 crov-prase-model/src/main/java/com/crov/prase/model/prase/SolicitudDevolucionDetellePagoPoliza.java create mode 100644 crov-prase-web/src/main/java/com/crov/prase/prase/AprobarDevolucionDePagosBean.java create mode 100644 crov-prase-web/src/main/webapp/app/prase/poliza/aprobarDevolucionDePagos.xhtml diff --git a/crov-prase-controller/src/main/java/com/arrebol/taxiservicios/controller/admin/ClosingDayController.java b/crov-prase-controller/src/main/java/com/arrebol/taxiservicios/controller/admin/ClosingDayController.java index f1fee77..9ce33f8 100644 --- a/crov-prase-controller/src/main/java/com/arrebol/taxiservicios/controller/admin/ClosingDayController.java +++ b/crov-prase-controller/src/main/java/com/arrebol/taxiservicios/controller/admin/ClosingDayController.java @@ -697,10 +697,11 @@ public class ClosingDayController extends ConnectionManager implements Serializa List details = new ArrayList<>(); try { - details.addAll(buildDetailsList(4, executeNativeSQLQuery(query_details_expenses, userID))); - details.addAll(buildDetailsList(13, executeNativeSQLQuery(query_details_expenses_by_type, userID))); - details.addAll(buildDetailsList(13, executeNativeSQLQuery(query_details_expenses_by_type_earning, userID))); - details.addAll(buildDetailsList(25, executeNativeSQLQuery(query_poliza_prase, userID))); + details.addAll(buildDetailsList(1, executeNativeSQLQuery(query_details_expenses, userID))); + details.addAll(buildDetailsList(2, executeNativeSQLQuery(query_details_expenses_by_type, userID))); + details.addAll(buildDetailsList(2, executeNativeSQLQuery(query_details_expenses_by_type_earning, userID))); + details.addAll(buildDetailsList(3, executeNativeSQLQuery(query_poliza_prase, userID))); + details.addAll(buildDetailsList(4, executeNativeSQLQuery(query_poliza_prase_devolcion, userID))); } catch (Exception e) { logger.error(e); @@ -1030,13 +1031,34 @@ public class ClosingDayController extends ConnectionManager implements Serializa + "UNION " + "SELECT e.payment, eic.name, e.driver_id, e.description, " + complete_name + ", e.id FROM expense e INNER JOIN expense_income_catalog eic ON e.id_expense_type = eic.id LEFT JOIN person p ON e.driver_id = p.id WHERE p.id IS NULL AND e.taxi_id is null AND DATE(e.created_on) > " + sub_query_to_find_previously_closing_day + " AND e.expense_status_type = 'AUTHORIZED' AND eic.type = 'EARNING' AND e.created_by = :userID "; - private final String query_poliza_prase = "SELECT e.cantidad_pagada, (CASE WHEN pa.tipo_pago = 'ABONO' THEN CONCAT('PAGO - ', e.metodo_pago) WHEN pa.tipo_pago = 'ANTICIPO' THEN CONCAT('ANTICIPO - ', e.metodo_pago) ELSE ' ' END) AS tipo_pago, p.id as person, CONCAT(e.folio, ' -> ', ve.folio), " + complete_name + ", e.id " + private final String query_poliza_prase = "SELECT e.cantidad_pagada, " + + "(CASE " + + "WHEN e.tipo_pago = 'ABONO' THEN CONCAT('PAGO - ', e.metodo_pago) " + + "WHEN e.tipo_pago = 'DEVOLUCION' THEN CONCAT('DEVOLUCION - ', e.metodo_pago) ELSE ' ' END) AS tipo_pago, " + + "p.id as person, CONCAT(e.folio, ' -> ', ve.folio), " + complete_name + ", e.id " + "FROM detelle_pago_poliza e " + "INNER JOIN pagos_poliza pa ON e.id_pago_poliza = pa.id " + "INNER JOIN poliza_prase ve ON pa.id_poliza = ve.id " + "INNER JOIN person p ON ve.id_customer = p.id " + "WHERE DATE(e.fecha_pago) > " + sub_query_to_find_previously_closing_day + "AND e.estatus_activo = 'ENABLED' " + + " AND (e.estatus_pago = 'ENABLED' OR e.estatus_pago = 'CANCELED') " + + " AND e.tipo_pago = 'ABONO' " + + "AND e.cobro = :userID "; + + private final String query_poliza_prase_devolcion = "SELECT e.cantidad_pagada, " + + "(CASE " + + "WHEN e.tipo_pago = 'ABONO' THEN CONCAT('PAGO - ', e.metodo_pago) " + + "WHEN e.tipo_pago = 'DEVOLUCION' THEN CONCAT('DEVOLUCION - ', e.metodo_pago) ELSE ' ' END) AS tipo_pago, " + + "p.id as person, CONCAT(e.folio, ' -> ', ve.folio), " + complete_name + ", e.id " + + "FROM detelle_pago_poliza e " + + "INNER JOIN pagos_poliza pa ON e.id_pago_poliza = pa.id " + + "INNER JOIN poliza_prase ve ON pa.id_poliza = ve.id " + + "INNER JOIN person p ON ve.id_customer = p.id " + + "WHERE DATE(e.fecha_pago) > " + sub_query_to_find_previously_closing_day + + "AND e.estatus_activo = 'ENABLED' " + + " AND e.estatus_pago = 'ENABLED' " + + " AND e.tipo_pago = 'DEVOLUCION' " + "AND e.cobro = :userID "; final Logger logger = LogManager.getLogger(ClosingDayController.class); diff --git a/crov-prase-controller/src/main/java/com/crov/prase/controller/prase/PagosPolizaController.java b/crov-prase-controller/src/main/java/com/crov/prase/controller/prase/PagosPolizaController.java index 7e4cfb8..73ab018 100644 --- a/crov-prase-controller/src/main/java/com/crov/prase/controller/prase/PagosPolizaController.java +++ b/crov-prase-controller/src/main/java/com/crov/prase/controller/prase/PagosPolizaController.java @@ -9,13 +9,16 @@ import com.arrebol.taxiservicios.controller.util.HibernateUtil; import com.arrebol.taxiservicios.model.catalog.Location; import com.arrebol.taxiservicios.model.core.User; import com.arrebol.taxiservicios.model.enums.EstatusPagoMultiple; +import com.arrebol.taxiservicios.model.enums.EstatusSolicitud; import com.arrebol.taxiservicios.model.enums.GenericEnumType; import com.arrebol.taxiservicios.model.enums.MetodoPago; import com.arrebol.taxiservicios.model.enums.PolizaEstatus; +import com.arrebol.taxiservicios.model.enums.TipoAbono; import com.crov.prase.model.prase.DetellePagoPoliza; import com.crov.prase.model.prase.HistorialAbonoMultiple; import com.crov.prase.model.prase.PagosPoliza; import com.crov.prase.model.prase.Poliza; +import com.crov.prase.model.prase.SolicitudDevolucionDetellePagoPoliza; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; @@ -371,6 +374,8 @@ public class PagosPolizaController extends ConnectionManager implements Serializ detalle.setId(UUID.randomUUID().toString()); detalle.setPagoPoliza(pago); detalle.setEstatusActivo(GenericEnumType.ENABLED); + detalle.setEstatusPago(GenericEnumType.ENABLED); + detalle.setTipoPago(TipoAbono.ABONO); detalle.setFechaPago(fechaActual); detalle.setCantidadPagada(montoAplicar); detalle.setCobro(user); @@ -510,6 +515,203 @@ public class PagosPolizaController extends ConnectionManager implements Serializ return general; } + public boolean createSolicitudDevolucionDetellePagoPoliza(SolicitudDevolucionDetellePagoPoliza modelo, User user) { + logger.info("createDetellePago"); + boolean success = false; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + modelo.setId(UUID.randomUUID().toString()); + modelo.setCreatedOn(correcciónDeHr(new Date(), -7)); + modelo.setCreatedBy(user); + session.save(modelo); + transaction.commit(); + success = true; + } catch (HibernateException e) { + logger.error("Detalle pago can not be added ", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method createDetellePago() ", e); + rollback(transaction); + } + return success; + } + + public List fillSolicitudDevolucionDetellePagoPolizaByLocation(String idLocation) { + logger.info("fillSolicitudDevolucionDetellePagoPolizaByLocation"); + List resultList = null; + Transaction transaction = null; + try { + logger.info("Searching solicitudes.."); + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + CriteriaBuilder builder = session.getCriteriaBuilder(); + + CriteriaQuery criteria = builder.createQuery(SolicitudDevolucionDetellePagoPoliza.class); + Root root = criteria.from(SolicitudDevolucionDetellePagoPoliza.class); + + Predicate criterio1 = builder.equal(root.get("location").get("id"), idLocation); + Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED); + + criteria.where(builder.and(criterio1, criterio2)); + criteria.orderBy(builder.asc(root.get("createdOn"))); + + resultList = session.createQuery(criteria).getResultList(); + + logger.info("Total of solicitudes found: " + (null == resultList ? -1 : resultList.size())); + transaction.commit(); + } catch (HibernateException e) { + logger.error("solicitudes cannot be loaded "); + rollback(transaction); + } catch (Exception e) { + logger.error("Method fillSolicitudDevolucionDetellePagoPolizaByLocation ", e); + rollback(transaction); + } + return resultList; + } + + public List fillSolicitudesPedientesByDetallePago(String idPago) { + logger.info("fillSolicitudesPedientesByDetallePago"); + List resultList = null; + Transaction transaction = null; + try { + logger.info("Searching solicitudes.."); + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + CriteriaBuilder builder = session.getCriteriaBuilder(); + + CriteriaQuery criteria = builder.createQuery(SolicitudDevolucionDetellePagoPoliza.class); + Root root = criteria.from(SolicitudDevolucionDetellePagoPoliza.class); + + Predicate criterio1 = builder.equal(root.get("detallePagoSolicitud").get("id"), idPago); + Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED); + Predicate criterio3 = builder.equal(root.get("estatusSolicitud"), EstatusSolicitud.PENDIENTE); + + criteria.where(builder.and(criterio1, criterio2)); + criteria.orderBy(builder.asc(root.get("createdOn"))); + + resultList = session.createQuery(criteria).getResultList(); + + logger.info("Total of solicitudes found: " + (null == resultList ? -1 : resultList.size())); + transaction.commit(); + } catch (HibernateException e) { + logger.error("solicitudes cannot be loaded "); + rollback(transaction); + } catch (Exception e) { + logger.error("Method fillSolicitudesPedientesByDetallePago ", e); + rollback(transaction); + } + return resultList; + } + + public boolean rechazarSolicitudDevolucionDetellePagoPoliza(SolicitudDevolucionDetellePagoPoliza modelo, User user) { + logger.info("rechazarSolicitudDevolucionDetellePagoPoliza"); + boolean success = false; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + modelo.setEstatusSolicitud(EstatusSolicitud.CANCELADO); + modelo.setLastUpdatedOn(correcciónDeHr(new Date(), -7)); + modelo.setLastUpdatedBy(user); + session.update(modelo); + transaction.commit(); + success = true; + } catch (HibernateException e) { + logger.error("Solicitud Devolucion Detelle Pago Poliza can not be added: ", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method rechazarSolicitudDevolucionDetellePagoPoliza() ", e); + rollback(transaction); + } + return success; + } + + public Boolean aprobarSolicitudDevolucionDetellePagoPoliza(SolicitudDevolucionDetellePagoPoliza solicitud, User user) { + logger.info("aprobarSolicitudDevolucionDetellePagoPoliza()"); + Session session = null; + Transaction transaction = null; + Date fechaActual = correcciónDeHr(new Date(), -7); + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + // 1.- se carga el detalle + DetellePagoPoliza detalleOriginal = solicitud.getDetallePagoSolicitud(); + + // 2. Actualizar detalle original + detalleOriginal.setEstatusPago(GenericEnumType.CANCELED); + detalleOriginal.setLastUpdatedOn(fechaActual); + detalleOriginal.setLastUpdatedBy(user); + session.update(detalleOriginal); + + // 3. Crear detalle de devolución + DetellePagoPoliza detalleDevolucion = new DetellePagoPoliza(); + detalleDevolucion.setId(UUID.randomUUID().toString()); + detalleDevolucion.setPagoPoliza(solicitud.getDetallePagoSolicitud().getPagoPoliza()); + detalleDevolucion.setEstatusActivo(GenericEnumType.ENABLED); + detalleDevolucion.setEstatusPago(GenericEnumType.ENABLED); + detalleDevolucion.setTipoPago(TipoAbono.DEVOLUCION); + detalleDevolucion.setFechaPago(fechaActual); + detalleDevolucion.setCantidadPagada(solicitud.getMontoDevolucion()); + detalleDevolucion.setCobro(solicitud.getUsuarioCorte()); + detalleDevolucion.setFolio(""); + detalleDevolucion.setMetodoPago(MetodoPago.EFECTIVO); + detalleDevolucion.setCreatedOn(fechaActual); + detalleDevolucion.setCreatedBy(user); + detalleDevolucion.setHistorialAbonoMultiple(null); + session.save(detalleDevolucion); + + // 4. Actualizar pago principal + PagosPoliza pagoPrincipal = detalleOriginal.getPagoPoliza(); + pagoPrincipal.setCantidadPagada(pagoPrincipal.getCantidadPagada() - solicitud.getMontoDevolucion()); + pagoPrincipal.setDiferenciaPago(pagoPrincipal.getPago() - pagoPrincipal.getCantidadPagada()); + // 5. Validar estado del pago + double nuevaDiferencia = pagoPrincipal.getPago() - pagoPrincipal.getCantidadPagada(); + if (Math.abs(nuevaDiferencia) > 0.01) { + pagoPrincipal.setPagoEstatus(GenericEnumType.INCOMPLETE); + } else { + pagoPrincipal.setPagoEstatus(GenericEnumType.DISABLED); + pagoPrincipal.setCantidadPagada(0.0); + } + pagoPrincipal.setLastUpdatedOn(fechaActual); + pagoPrincipal.setLastUpdatedBy(user); + session.update(pagoPrincipal); + + // 6. Actualizar póliza + Poliza poliza = pagoPrincipal.getPoliza(); + poliza.setCantidadPagada(poliza.getCantidadPagada() - solicitud.getMontoDevolucion()); + // 7. Validar estado de la póliza + if (poliza.getEstatus() == PolizaEstatus.LIQUIDADO && (poliza.getAmount() - poliza.getCantidadPagada()) > 0.10) { + poliza.setEstatus(PolizaEstatus.PENDIENTE); + } + poliza.setLastUpdatedOn(fechaActual); + poliza.setLastUpdatedBy(user); + session.update(poliza); + + // 8. Registrar solicitud de devolución + solicitud.setEstatusSolicitud(EstatusSolicitud.APROBADO); + solicitud.setDetallePagoDevolucion(detalleDevolucion); + solicitud.setLastUpdatedOn(fechaActual); + solicitud.setLastUpdatedBy(user); + session.update(solicitud); + + transaction.commit(); + return true; + + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + logger.error("aprobarSolicitudDevolucionDetellePagoPoliza(): ", e); + return false; + } finally { + if (session != null) { + session.close(); + } + } + } + private Date correcciónDeHr(Date fecha, int horas) { Calendar calendar = Calendar.getInstance(); calendar.setTime(fecha); diff --git a/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/admin/ClosingDayDetail.java b/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/admin/ClosingDayDetail.java index facab69..90474d7 100644 --- a/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/admin/ClosingDayDetail.java +++ b/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/admin/ClosingDayDetail.java @@ -1,8 +1,8 @@ /* * Arrebol Consultancy copyright. - * + * * This code belongs to Arrebol Consultancy - * its use, redistribution or modification are prohibited + * its use, redistribution or modification are prohibited * without written authorization from Arrebol Consultancy. */ package com.arrebol.taxiservicios.model.admin; @@ -10,7 +10,6 @@ package com.arrebol.taxiservicios.model.admin; import com.arrebol.taxiservicios.model.core.Person; import com.arrebol.taxiservicios.model.core.User; import com.arrebol.taxiservicios.model.enums.ExpenseType; -import com.arrebol.taxiservicios.model.enums.SanctionType; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; @@ -21,296 +20,188 @@ import java.util.Date; */ public class ClosingDayDetail implements Serializable { - private String id; - private ClosingDay closingDay; - private String type; - private BigDecimal amount; - private BigDecimal amountSaving; - private BigDecimal amountAccident; - private Person person; - private String comments; - private User createdBy; - private Date createdOn; - private User lastUpdatedBy; - private Date lastUpdatedOn; + private String id; + private ClosingDay closingDay; + private String type; + private BigDecimal amount; + private BigDecimal amountSaving; + private BigDecimal amountAccident; + private Person person; + private String comments; + private User createdBy; + private Date createdOn; + private User lastUpdatedBy; + private Date lastUpdatedOn; - private GeneralPublic general; + private GeneralPublic general; - public ClosingDayDetail() { - } + public ClosingDayDetail() { + } - /** - * - * @param type - * @param amount - * @param amountSaving - * @param amountAccident - * @param person - * @param comments - */ - public ClosingDayDetail(String type, BigDecimal amount, BigDecimal amountSaving, BigDecimal amountAccident, Person person, String comments) { - this.type = type; - this.amount = amount; - this.amountSaving = amountSaving; - this.amountAccident = amountAccident; - this.person = person; - this.comments = comments; - } + /** + * + * @param type + * @param amount + * @param amountSaving + * @param amountAccident + * @param person + * @param comments + */ + public ClosingDayDetail(String type, BigDecimal amount, BigDecimal amountSaving, BigDecimal amountAccident, Person person, String comments) { + this.type = type; + this.amount = amount; + this.amountSaving = amountSaving; + this.amountAccident = amountAccident; + this.person = person; + this.comments = comments; + } - /** - * - * @param queryNumber 1: query_details_sales, 2: query_details_sanctions_in, - * 3: query_details_sanctions_out, 4: query_details_expenses, 5: - * query_details_invoices. - * @param array - */ - //Para poder añadir que se va a mostrar (supongo) - public ClosingDayDetail(int queryNumber, Object[] array) { - switch (queryNumber) { - case 1: - if (((String) array[6]).equals("DISABLED")) { - this.type = "Venta diaria"; - } else { - this.type = "Venta diaria - Depósito"; - } + /** + * + * @param queryNumber 1: query_details_sales, 2: query_details_sanctions_in, + * 3: query_details_sanctions_out, 4: query_details_expenses, 5: + * query_details_invoices. + * @param array + */ + //Para poder añadir que se va a mostrar (supongo) + public ClosingDayDetail(int queryNumber, Object[] array) { + switch (queryNumber) { - this.person = new Person((String) array[3], (String) array[5]); - this.amount = new BigDecimal((Double) array[0]); - this.amountSaving = new BigDecimal((Double) array[1]); - this.amountAccident = new BigDecimal((Double) array[2]); - this.comments = (String) array[4]; - break; - case 2: - this.type = SanctionType.valueOf(array[1].toString()).getType(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = (String) array[3]; - break; - case 3: - this.type = SanctionType.valueOf(array[1].toString()).getType(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = (String) array[3]; - break; - case 4: - this.type = ExpenseType.valueOf(array[1].toString()).getType(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = (String) array[3]; - break; - case 5: - this.type = "Compra"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = new BigDecimal((Float) array[0]); - this.comments = (String) array[2]; - break; - case 6: - this.type = "Transferencia enviada"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Enviada a usuario: " + (String) array[3]; - break; - case 7: - this.type = "Transferencia recibida"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Recibida del usuario: " + (String) array[3]; - break; - case 8: - this.type = "Pago cliente"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = ""; - break; - case 9: - this.type = "Venta público general"; - this.person = null; - this.amount = new BigDecimal((Double) array[0]); - this.comments = ""; - break; - case 10: - this.type = "Devolución de compra"; - this.person = null; - this.amount = new BigDecimal((Double) array[0]); - this.comments = (String) array[2]; - break; - case 11: - this.type = "Tiempo aire"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = BigDecimal.valueOf(Double.parseDouble(array[0].toString())); - this.comments = ""; - break; - case 12: - this.type = "Transferencia Mutual enviada"; - this.person = new Person((String) array[1], (String) array[3]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Enviada a usuario: " + (String) array[3]; - break; - case 13: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = (String) array[3]; - break; - case 15: - this.type = array[1].toString() + " Proyecto"; - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Abono al proyecto " + array[3]; - break; - case 16: - this.type = "ABONO Urbanizacion"; - this.person = new Person((String) array[2], (String) array[5]); - this.amount = new BigDecimal((Double) array[4]); - this.comments = "Abono a la urbanizacion " + array[3] + " :" + array[4]; - break; - case 18: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Devolución de abono a lote ENTRADA" + array[3]; - break; - case 19: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0] * -1); - this.comments = "Devolución de abono a lote SALIDA" + array[3]; - break; - case 20: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0] * -1); - this.comments = "Abono a rembolso por cancelacion " + array[3]; - break; - case 23: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Devolución de abono multiple a lote ENTRADA" + array[3]; - break; - case 24: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0] * -1); - this.comments = "Devolución de abono multiple a lote SALIDA" + array[3]; - break; - case 25: - this.type = array[1].toString(); - this.person = new Person((String) array[2], (String) array[4]); - this.amount = new BigDecimal((Double) array[0]); - this.comments = "Folio del pago: "+ array[3]; - break; - } + case 1: + this.type = ExpenseType.valueOf(array[1].toString()).getType(); + this.person = new Person((String) array[2], (String) array[4]); + this.amount = new BigDecimal((Double) array[0]); + this.comments = (String) array[3]; + break; + case 2: + this.type = array[1].toString(); + this.person = new Person((String) array[2], (String) array[4]); + this.amount = new BigDecimal((Double) array[0]); + this.comments = (String) array[3]; + break; + case 3: + this.type = array[1].toString(); + this.person = new Person((String) array[2], (String) array[4]); + this.amount = new BigDecimal((Double) array[0]); + this.comments = "Folio del pago : " + array[3]; + break; + case 4: + this.type = array[1].toString(); + this.person = new Person((String) array[2], (String) array[4]); + this.amount = new BigDecimal((Double) array[0] * -1); + this.comments = "Devolución : " + array[3]; + break; + } - } + } - public String getId() { - return id; - } + public String getId() { + return id; + } - public void setId(String id) { - this.id = id; - } + public void setId(String id) { + this.id = id; + } - public ClosingDay getClosingDay() { - return closingDay; - } + public ClosingDay getClosingDay() { + return closingDay; + } - public void setClosingDay(ClosingDay closingDay) { - this.closingDay = closingDay; - } + public void setClosingDay(ClosingDay closingDay) { + this.closingDay = closingDay; + } - public String getType() { - return type; - } + public String getType() { + return type; + } - public void setType(String type) { - this.type = type; - } + public void setType(String type) { + this.type = type; + } - public BigDecimal getAmount() { - return amount; - } + public BigDecimal getAmount() { + return amount; + } - public void setAmount(BigDecimal amount) { - this.amount = amount; - } + public void setAmount(BigDecimal amount) { + this.amount = amount; + } - public BigDecimal getAmountSaving() { - return amountSaving; - } + public BigDecimal getAmountSaving() { + return amountSaving; + } - public void setAmountSaving(BigDecimal amountSaving) { - this.amountSaving = amountSaving; - } + public void setAmountSaving(BigDecimal amountSaving) { + this.amountSaving = amountSaving; + } - public BigDecimal getAmountAccident() { - return amountAccident; - } + public BigDecimal getAmountAccident() { + return amountAccident; + } - public void setAmountAccident(BigDecimal amountAccident) { - this.amountAccident = amountAccident; - } + public void setAmountAccident(BigDecimal amountAccident) { + this.amountAccident = amountAccident; + } - public Person getPerson() { - return person; - } + public Person getPerson() { + return person; + } - public void setPerson(Person person) { - this.person = person; - } + public void setPerson(Person person) { + this.person = person; + } - public String getComments() { - return comments; - } + public String getComments() { + return comments; + } - public void setComments(String comments) { - this.comments = comments; - } + public void setComments(String comments) { + this.comments = comments; + } - public User getCreatedBy() { - return createdBy; - } + public User getCreatedBy() { + return createdBy; + } - public void setCreatedBy(User createdBy) { - this.createdBy = createdBy; - } + public void setCreatedBy(User createdBy) { + this.createdBy = createdBy; + } - public Date getCreatedOn() { - return createdOn; - } + public Date getCreatedOn() { + return createdOn; + } - public void setCreatedOn(Date createdOn) { - this.createdOn = createdOn; - } + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } - public User getLastUpdatedBy() { - return lastUpdatedBy; - } + public User getLastUpdatedBy() { + return lastUpdatedBy; + } - public void setLastUpdatedBy(User lastUpdatedBy) { - this.lastUpdatedBy = lastUpdatedBy; - } + public void setLastUpdatedBy(User lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } - public Date getLastUpdatedOn() { - return lastUpdatedOn; - } + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } - public void setLastUpdatedOn(Date lastUpdatedOn) { - this.lastUpdatedOn = lastUpdatedOn; - } + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } - public GeneralPublic getGeneral() { - return general; - } + public GeneralPublic getGeneral() { + return general; + } - public void setGeneral(GeneralPublic general) { - this.general = general; - } + public void setGeneral(GeneralPublic general) { + this.general = general; + } - @Override - public String toString() { - return "ClosingDayDetail{" + "closingDay=" + closingDay + ", type=" + type + ", comments=" + comments + '}'; - } + @Override + public String toString() { + return "ClosingDayDetail{" + "closingDay=" + closingDay + ", type=" + type + ", comments=" + comments + '}'; + } } diff --git a/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/enums/TipoAbono.java b/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/enums/TipoAbono.java index 4dc8117..1ff4da7 100644 --- a/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/enums/TipoAbono.java +++ b/crov-prase-model/src/main/java/com/arrebol/taxiservicios/model/enums/TipoAbono.java @@ -9,46 +9,50 @@ package com.arrebol.taxiservicios.model.enums; * @author pc one */ public enum TipoAbono { - ANTICIPO("Anticipo") { - @Override - public String toString() { - return "Anticipo"; - } - }, - ABONO("Abono") { - @Override - public String toString() { - return "Abono"; - } - }, - SUBABONO("Sub abono") { - @Override - public String toString() { - return "Sub abono"; - } - }, - - COMISION ("Comisión por apertura"){ - @Override - public String toString() { - return "COMISION"; - } - }, - - AJUSTE("Ajuste") { - @Override - public String toString() { - return "Ajuste"; - } - }; - - private final String type; + ANTICIPO("ANTICIPO") { + @Override + public String toString() { + return "Anticipo"; + } + }, + ABONO("ABONO") { + @Override + public String toString() { + return "Abono"; + } + }, + SUBABONO("ABONO") { + @Override + public String toString() { + return "Sub abono"; + } + }, + DEVOLUCION("DEVOLUCION") { + @Override + public String toString() { + return "Devolución"; + } + }, + COMISION("COMISION") { + @Override + public String toString() { + return "Comisión por apertura"; + } + }, + AJUSTE("AJUSTE") { + @Override + public String toString() { + return "Ajuste"; + } + }; - private TipoAbono(String type) { - this.type = type; - } + private final String type; - public String getType() { - return type; - } + private TipoAbono(String type) { + this.type = type; + } + + public String getType() { + return type; + } } diff --git a/crov-prase-model/src/main/java/com/crov/prase/model/prase/DetellePagoPoliza.java b/crov-prase-model/src/main/java/com/crov/prase/model/prase/DetellePagoPoliza.java index 382abcb..9922a2e 100644 --- a/crov-prase-model/src/main/java/com/crov/prase/model/prase/DetellePagoPoliza.java +++ b/crov-prase-model/src/main/java/com/crov/prase/model/prase/DetellePagoPoliza.java @@ -7,6 +7,7 @@ package com.crov.prase.model.prase; import com.arrebol.taxiservicios.model.core.User; import com.arrebol.taxiservicios.model.enums.GenericEnumType; import com.arrebol.taxiservicios.model.enums.MetodoPago; +import com.arrebol.taxiservicios.model.enums.TipoAbono; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; @@ -51,6 +52,14 @@ public class DetellePagoPoliza implements Serializable { @Column(name = "estatus_activo", nullable = false) private GenericEnumType estatusActivo; + @Enumerated(EnumType.STRING) + @Column(name = "estatus_pago", nullable = false) + private GenericEnumType estatusPago; + + @Enumerated(EnumType.STRING) + @Column(name = "tipo_pago", nullable = false) + private TipoAbono tipoPago; + @Temporal(TemporalType.TIMESTAMP) @Column(name = "fecha_pago") private Date fechaPago; @@ -216,4 +225,20 @@ public class DetellePagoPoliza implements Serializable { this.historialAbonoMultiple = historialAbonoMultiple; } + public GenericEnumType getEstatusPago() { + return estatusPago; + } + + public void setEstatusPago(GenericEnumType estatusPago) { + this.estatusPago = estatusPago; + } + + public TipoAbono getTipoPago() { + return tipoPago; + } + + public void setTipoPago(TipoAbono tipoPago) { + this.tipoPago = tipoPago; + } + } diff --git a/crov-prase-model/src/main/java/com/crov/prase/model/prase/SolicitudDevolucionDetellePagoPoliza.java b/crov-prase-model/src/main/java/com/crov/prase/model/prase/SolicitudDevolucionDetellePagoPoliza.java new file mode 100644 index 0000000..4510092 --- /dev/null +++ b/crov-prase-model/src/main/java/com/crov/prase/model/prase/SolicitudDevolucionDetellePagoPoliza.java @@ -0,0 +1,240 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.crov.prase.model.prase; + +import com.arrebol.taxiservicios.model.catalog.Location; +import com.arrebol.taxiservicios.model.core.User; +import com.arrebol.taxiservicios.model.enums.EstatusSolicitud; +import com.arrebol.taxiservicios.model.enums.GenericEnumType; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar + */ +@Entity +@Table(name = "solicitud_devolucion_detelle_pago_poliza") +public class SolicitudDevolucionDetellePagoPoliza implements Serializable { + + private static final long serialVersionUID = -6653037938225719593L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_location", + referencedColumnName = "id", + nullable = false + ) + private Location location; + + @Enumerated(EnumType.STRING) + @Column(name = "estatus_activo", nullable = false) + private GenericEnumType estatusActivo; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_detalle_pago_solicitud", + referencedColumnName = "id", + nullable = false + ) + private DetellePagoPoliza detallePagoSolicitud; + + @ManyToOne(fetch = FetchType.LAZY, optional = true) + @JoinColumn( + name = "id_detalle_pago_devolucion", + referencedColumnName = "id", + nullable = true + ) + private DetellePagoPoliza detallePagoDevolucion; + + @ManyToOne(fetch = FetchType.LAZY, optional = true) + @JoinColumn( + name = "id_usuario_solicito", + referencedColumnName = "id", + nullable = true + ) + private User usuarioSolicito; + + @ManyToOne(fetch = FetchType.LAZY, optional = true) + @JoinColumn( + name = "id_usuario_corte", + referencedColumnName = "id", + nullable = true + ) + private User usuarioCorte; + + @Enumerated(EnumType.STRING) + @Column(name = "estatus_solicitud", nullable = false) + private EstatusSolicitud estatusSolicitud; + + @Column(name = "monto_devolucion") + private Double montoDevolucion; + + @Column(name = "comentario") + private String comentario; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on") + private Date createdOn; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "created_by", + referencedColumnName = "id", + nullable = false + ) + private User createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on") + private Date lastUpdatedOn; + + @ManyToOne(fetch = FetchType.LAZY, optional = true) + @JoinColumn( + name = "last_updated_by", + referencedColumnName = "id", + nullable = true + ) + private User lastUpdatedBy; + + public SolicitudDevolucionDetellePagoPoliza() { + } + + public SolicitudDevolucionDetellePagoPoliza(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public GenericEnumType getEstatusActivo() { + return estatusActivo; + } + + public void setEstatusActivo(GenericEnumType estatusActivo) { + this.estatusActivo = estatusActivo; + } + + public DetellePagoPoliza getDetallePagoSolicitud() { + return detallePagoSolicitud; + } + + public void setDetallePagoSolicitud(DetellePagoPoliza detallePagoSolicitud) { + this.detallePagoSolicitud = detallePagoSolicitud; + } + + public DetellePagoPoliza getDetallePagoDevolucion() { + return detallePagoDevolucion; + } + + public void setDetallePagoDevolucion(DetellePagoPoliza detallePagoDevolucion) { + this.detallePagoDevolucion = detallePagoDevolucion; + } + + public User getUsuarioSolicito() { + return usuarioSolicito; + } + + public void setUsuarioSolicito(User usuarioSolicito) { + this.usuarioSolicito = usuarioSolicito; + } + + public User getUsuarioCorte() { + return usuarioCorte; + } + + public void setUsuarioCorte(User usuarioCorte) { + this.usuarioCorte = usuarioCorte; + } + + public EstatusSolicitud getEstatusSolicitud() { + return estatusSolicitud; + } + + public void setEstatusSolicitud(EstatusSolicitud estatusSolicitud) { + this.estatusSolicitud = estatusSolicitud; + } + + public Double getMontoDevolucion() { + return montoDevolucion; + } + + public void setMontoDevolucion(Double montoDevolucion) { + this.montoDevolucion = montoDevolucion; + } + + public String getComentario() { + return comentario; + } + + public void setComentario(String comentario) { + this.comentario = comentario; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public User getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(User createdBy) { + this.createdBy = createdBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public User getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(User lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + +} diff --git a/crov-prase-model/src/main/resources/taxi.cfg.xml b/crov-prase-model/src/main/resources/taxi.cfg.xml index b2abf98..e20295a 100644 --- a/crov-prase-model/src/main/resources/taxi.cfg.xml +++ b/crov-prase-model/src/main/resources/taxi.cfg.xml @@ -93,6 +93,7 @@ + diff --git a/crov-prase-web/src/main/java/com/arrebol/taxiservicios/beans/admin/AddClosingDayBean.java b/crov-prase-web/src/main/java/com/arrebol/taxiservicios/beans/admin/AddClosingDayBean.java index 5bd0716..87cb895 100644 --- a/crov-prase-web/src/main/java/com/arrebol/taxiservicios/beans/admin/AddClosingDayBean.java +++ b/crov-prase-web/src/main/java/com/arrebol/taxiservicios/beans/admin/AddClosingDayBean.java @@ -147,6 +147,7 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { setTotalPaid(null); setTotalTransfer(null); setTotalPagosPoliza(null); + setTotalDevolucionPagosPoliza(null); validateMutual = null; setUsers(getController().getAllActiveUsers(getLoggedUser().getLocation())); getDetails().clear(); @@ -350,6 +351,7 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { setTotalExpenses(getController().findTotals(query_total_expenses, getSelectedUserId()) + getController().findTotals(query_total_transfer_send, getSelectedUserId())); setTotalPagosPoliza(getController().findTotals(query_total_poliza_prase, getSelectedUserId())); + setTotalDevolucionPagosPoliza(getController().findTotals(query_total_poliza_prase_devolucion, getSelectedUserId())); setSaveCashDailyCut(true); setDetails(getController().findClosingDayDetails(getSelectedUserId())); sumTotals(); @@ -362,7 +364,7 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { private void sumTotals() { try { - totalToPay = getTotalSanctionsIn() + getTotalPagosPoliza(); + totalToPay = getTotalSanctionsIn() + (getTotalPagosPoliza() - getTotalDevolucionPagosPoliza()); totalToPay += -(getTotalSanctionsOut() + getTotalExpenses()); totalExpenses = getTotalExpenses(); } catch (Exception e) { @@ -410,6 +412,7 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { private Double totalPaid; private Double totalPagosPoliza; + private Double totalDevolucionPagosPoliza; private Double validateMutual; private Double validateSale; @@ -645,6 +648,14 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { this.totalPagosPoliza = totalPagosPoliza; } + public Double getTotalDevolucionPagosPoliza() { + return totalDevolucionPagosPoliza; + } + + public void setTotalDevolucionPagosPoliza(Double totalDevolucionPagosPoliza) { + this.totalDevolucionPagosPoliza = totalDevolucionPagosPoliza; + } + final Logger logger = LogManager.getLogger(AddClosingDayBean.class); private static final long serialVersionUID = -2421681541992908524L; @@ -659,6 +670,16 @@ public class AddClosingDayBean extends TaxiGenericBean implements Serializable { + "FROM detelle_pago_poliza WHERE DATE(fecha_pago) > " + sub_query_to_find_previously_closing_day + " " + " AND cobro = :userID " + " AND metodo_pago = 'EFECTIVO' " + + " AND (estatus_pago = 'ENABLED' OR estatus_pago = 'CANCELED') " + + " AND tipo_pago = 'ABONO' " + + " AND estatus_activo = 'ENABLED' "; + + private final String query_total_poliza_prase_devolucion = "SELECT IFNULL(SUM(cantidad_pagada), 0) AS total_pagos " + + "FROM detelle_pago_poliza WHERE DATE(fecha_pago) > " + sub_query_to_find_previously_closing_day + " " + + " AND cobro = :userID " + + " AND metodo_pago = 'EFECTIVO' " + + " AND estatus_pago = 'ENABLED' " + + " AND tipo_pago = 'DEVOLUCION' " + " AND estatus_activo = 'ENABLED' "; } diff --git a/crov-prase-web/src/main/java/com/crov/prase/prase/AprobarDevolucionDePagosBean.java b/crov-prase-web/src/main/java/com/crov/prase/prase/AprobarDevolucionDePagosBean.java new file mode 100644 index 0000000..7a90097 --- /dev/null +++ b/crov-prase-web/src/main/java/com/crov/prase/prase/AprobarDevolucionDePagosBean.java @@ -0,0 +1,156 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.crov.prase.prase; + +import com.arrebol.taxiservicios.beans.Datatable; +import com.arrebol.taxiservicios.beans.TaxiGenericBean; +import com.arrebol.taxiservicios.controller.admin.ClosingDayServiceImpl; +import com.crov.prase.controller.prase.PagosPolizaController; +import com.crov.prase.model.prase.SolicitudDevolucionDetellePagoPoliza; +import java.io.Serializable; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar + */ +@Named("aprobarDevolucionDePagosBean") +@ViewScoped +public class AprobarDevolucionDePagosBean extends TaxiGenericBean implements Serializable, Datatable { + + private static final long serialVersionUID = -136031528440947006L; + final Logger logger = LogManager.getLogger(PolizaBean.class); + + private PagosPolizaController pagosPolizaController; + + private List listSolicitudes; + private SolicitudDevolucionDetellePagoPoliza selectSolicitud; + + @PostConstruct + public void init() { + logger.info("init"); + try { + loadTaxiPropertyFile(); + loadBundlePropertyFile(); + + setPagosPolizaController(new PagosPolizaController()); + setSelectSolicitud(null); + cargarSolicitudes(); + } catch (Exception e) { + logger.error(e); + } + } + + public void cargarSolicitudes() { + logger.info("cargarSolicitudes()"); + try { + setListSolicitudes(getPagosPolizaController().fillSolicitudDevolucionDetellePagoPolizaByLocation(getLoggedUser().getLocation().getId())); + } catch (Exception e) { + logger.error("cargarSolicitudes(): " + e); + showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al tratar de cargar la lista de solicitudes"); + } + } + + public void rechazarSolicitud() { + logger.info("rechazarSolicitud()"); + try { + if (getPagosPolizaController().rechazarSolicitudDevolucionDetellePagoPoliza(getSelectSolicitud(), getLoggedUser())) { + showMessage(FacesMessage.SEVERITY_INFO, "Solicitud rechazada", "Solicitud rechazada correctamente"); + } else { + showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de rechazar la solicitud"); + } + cargarSolicitudes(); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al tratar de rechazar la solicitud"); + logger.error("rechazarSolicitud(): " + e); + } + } + + public void aprobarSolcitud() { + logger.info("aprobarSolcitud()"); + try { + if (new ClosingDayServiceImpl().existClosingDayByCreatedOn(correcciónDeHr(new Date(), -7), getSelectSolicitud().getUsuarioCorte())) { + showMessage(FacesMessage.SEVERITY_WARN, "Error", "El usuario al que afectará la devolución ya realizó su corte del día "); + return; + } + if (getPagosPolizaController().aprobarSolicitudDevolucionDetellePagoPoliza(getSelectSolicitud(), getLoggedUser())) { + showMessage(FacesMessage.SEVERITY_INFO, "Solicitud aprobada", "Solicitud aprobada correctamente"); + } else { + showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de aprobar la solicitud"); + } + cargarSolicitudes(); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al tratar de aprobar la solicitud"); + logger.error("aprobarSolcitud(): " + e); + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + public PagosPolizaController getPagosPolizaController() { + return pagosPolizaController; + } + + public void setPagosPolizaController(PagosPolizaController pagosPolizaController) { + this.pagosPolizaController = pagosPolizaController; + } + + public List getListSolicitudes() { + return listSolicitudes; + } + + public void setListSolicitudes(List listSolicitudes) { + this.listSolicitudes = listSolicitudes; + } + + public SolicitudDevolucionDetellePagoPoliza getSelectSolicitud() { + return selectSolicitud; + } + + public void setSelectSolicitud(SolicitudDevolucionDetellePagoPoliza selectSolicitud) { + this.selectSolicitud = selectSolicitud; + } + + private Date correcciónDeHr(Date fecha, int horas) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(fecha); + calendar.add(Calendar.HOUR_OF_DAY, horas); + Date nuevaFecha = calendar.getTime(); + return nuevaFecha; + } +} diff --git a/crov-prase-web/src/main/java/com/crov/prase/prase/PagosPolizasBean.java b/crov-prase-web/src/main/java/com/crov/prase/prase/PagosPolizasBean.java index c15b7c2..68cc6e6 100644 --- a/crov-prase-web/src/main/java/com/crov/prase/prase/PagosPolizasBean.java +++ b/crov-prase-web/src/main/java/com/crov/prase/prase/PagosPolizasBean.java @@ -6,17 +6,21 @@ package com.crov.prase.prase; import com.arrebol.taxiservicios.beans.TaxiGenericBean; import com.arrebol.taxiservicios.controller.admin.GenericValidationController; +import com.arrebol.taxiservicios.model.enums.EstatusSolicitud; import com.arrebol.taxiservicios.model.enums.GenericEnumType; import com.arrebol.taxiservicios.model.enums.MetodoPago; import com.arrebol.taxiservicios.model.enums.PolizaEstatus; +import com.arrebol.taxiservicios.model.enums.TipoAbono; import com.crov.prase.controller.prase.PagosPolizaController; import com.crov.prase.controller.prase.PolizaController; import com.crov.prase.model.prase.DetellePagoPoliza; import com.crov.prase.model.prase.HistorialAbonoMultiple; import com.crov.prase.model.prase.PagosPoliza; import com.crov.prase.model.prase.Poliza; +import com.crov.prase.model.prase.SolicitudDevolucionDetellePagoPoliza; import java.io.Serializable; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.UUID; @@ -56,6 +60,9 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable { private String metodoPago; private HistorialAbonoMultiple selectedHistorialAbonoMultiple; + private String comentarioDevolucionPago; + private String detallePagoDisponibleParaDevocion; + @PostConstruct public void init() { logger.info("init"); @@ -183,6 +190,8 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable { DetellePagoPoliza detalle = new DetellePagoPoliza(); detalle.setPagoPoliza(pagoA); detalle.setEstatusActivo(GenericEnumType.ENABLED); + detalle.setEstatusPago(GenericEnumType.ENABLED); + detalle.setTipoPago(TipoAbono.ABONO); detalle.setFechaPago(correcciónDeHr(new Date(), -7)); detalle.setCantidadPagada(montoPagado); detalle.setCobro(getLoggedUser()); @@ -227,6 +236,36 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable { } } + public void solicitarDevolusionDePago() { + logger.info("solicitarDevolusionDePago()"); + try { + List solisitudesPendientes = getPagosPolizaController().fillSolicitudesPedientesByDetallePago(getSelectedDetellePago().getId()); + if (!solisitudesPendientes.isEmpty()) { + showMessage(FacesMessage.SEVERITY_WARN, "Error", "Este detalle ya tiene una solicitud de devolución de pago en proceso"); + return; + } + SolicitudDevolucionDetellePagoPoliza solicitud = new SolicitudDevolucionDetellePagoPoliza(); + solicitud.setEstatusActivo(GenericEnumType.ENABLED); + solicitud.setLocation(getLoggedUser().getLocation()); + solicitud.setDetallePagoSolicitud(getSelectedDetellePago()); + solicitud.setDetallePagoDevolucion(null); + solicitud.setUsuarioSolicito(getLoggedUser()); + solicitud.setUsuarioCorte(getLoggedUser()); + solicitud.setEstatusSolicitud(EstatusSolicitud.PENDIENTE); + solicitud.setMontoDevolucion(getSelectedDetellePago().getCantidadPagada()); + solicitud.setComentario(getComentarioDevolucionPago()); + getPagosPolizaController().createSolicitudDevolucionDetellePagoPoliza(solicitud, getLoggedUser()); + showMessage(FacesMessage.SEVERITY_INFO, "Solicitud realizada", "Solicitud de devolución de abono realizada correctamente"); + } catch (Exception e) { + logger.error("solicitarDevolusionDePago(): " + e); + showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error al generar la solicitud de devolución de pago"); + } + } + + public void limpiarFormDevolusionDetallePago() { + setComentarioDevolucionPago(""); + } + public void limpiarDetallePago() { setSelectedDetellePago(null); setPagoExitoso(false); @@ -282,7 +321,18 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable { public void cargarDetalles() { try { - setListDetallePagosPolizas(getPagosPolizaController().fillDetellePagoPolizaByPago(getSelectedPago().getId())); + List listaDeDetallesPago = getPagosPolizaController().fillDetellePagoPolizaByPago(getSelectedPago().getId()); + setListDetallePagosPolizas(listaDeDetallesPago); + // se encuentra el siguiente pago que se puede devolver + String idDetallePago = ""; + Collections.reverse(listaDeDetallesPago); + for (DetellePagoPoliza pa : listaDeDetallesPago) { + if (pa.getEstatusPago().equals(GenericEnumType.ENABLED) && pa.getTipoPago().equals(TipoAbono.ABONO)) { + idDetallePago = pa.getId(); + break; + } + } + setDetallePagoDisponibleParaDevocion(idDetallePago); } catch (Exception e) { logger.error("cargarDetalles(): " + e); showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de cargar los detalles de pago"); @@ -455,4 +505,20 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable { this.selectedHistorialAbonoMultiple = selectedHistorialAbonoMultiple; } + public String getComentarioDevolucionPago() { + return comentarioDevolucionPago; + } + + public void setComentarioDevolucionPago(String comentarioDevolucionPago) { + this.comentarioDevolucionPago = comentarioDevolucionPago; + } + + public String getDetallePagoDisponibleParaDevocion() { + return detallePagoDisponibleParaDevocion; + } + + public void setDetallePagoDisponibleParaDevocion(String detallePagoDisponibleParaDevocion) { + this.detallePagoDisponibleParaDevocion = detallePagoDisponibleParaDevocion; + } + } diff --git a/crov-prase-web/src/main/java/com/crov/prase/prase/PolizaBean.java b/crov-prase-web/src/main/java/com/crov/prase/prase/PolizaBean.java index eed198e..46b0d04 100644 --- a/crov-prase-web/src/main/java/com/crov/prase/prase/PolizaBean.java +++ b/crov-prase-web/src/main/java/com/crov/prase/prase/PolizaBean.java @@ -204,6 +204,8 @@ public class PolizaBean extends TaxiGenericBean implements Serializable, Datatab detalle.setId(UUID.randomUUID().toString()); detalle.setPagoPoliza(pagoPoliza); detalle.setEstatusActivo(GenericEnumType.ENABLED); + detalle.setEstatusPago(GenericEnumType.ENABLED); + detalle.setTipoPago(TipoAbono.ABONO); detalle.setFechaPago(correcciónDeHr(new Date(), -7)); detalle.setCantidadPagada(pagoPoliza.getCantidadPagada()); detalle.setCobro(getLoggedUser()); diff --git a/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi.properties b/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi.properties index 8e6351b..5341214 100644 --- a/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi.properties +++ b/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi.properties @@ -741,4 +741,5 @@ outcome.prase.polizas=/app/prase/poliza/index outcome.prase.pagos=/app/prase/poliza/pagos outcome.prase.incidencias=/app/prase/incidencias/index outcome.prase.cargarIncidencia=/app/prase/incidencias/cargarIncidencia +outcome.prase.polizas.aprobarDevolucionDePagos=/app/prase/poliza/aprobarDevolucionDePagos diff --git a/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi_permissions_config.properties b/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi_permissions_config.properties index 825cca1..fac0bd1 100644 --- a/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi_permissions_config.properties +++ b/crov-prase-web/src/main/resources/com/arrebol/taxiservicios/i18n/taxi_permissions_config.properties @@ -1077,6 +1077,10 @@ catalog.income.expenses.add.path=Cat\u00e1logo / Ingresos/Egresos (Agregar) catalog.income.expenses.delete=Borrar ingresos/egresos catalog.income.expenses.delete.description=Permite borrar un ingreso o egreso. catalog.income.expenses.delete.path=Cat\u00e1logo / Ingresos/Egresos (Borrar) +#PRACE +admin.devolucion.pagos.aprobe.name=Aprobar devoluci\u00f3n detalle pago +admin.devolucion.pagos.aprobe.description=Permite aprobar o cancelar las solicitudes de devoluci\u00f3n de detalles de pago. +admin.devolucion.pagos.aprobe.path=Administraci\u00f3n / Solicitudes de devoci\u00f3n pagos (Aprobar) ###################################### # Corporativo / Historial de compras # ###################################### diff --git a/crov-prase-web/src/main/webapp/WEB-INF/sidebar.xhtml b/crov-prase-web/src/main/webapp/WEB-INF/sidebar.xhtml index f9b07d1..9fa505e 100644 --- a/crov-prase-web/src/main/webapp/WEB-INF/sidebar.xhtml +++ b/crov-prase-web/src/main/webapp/WEB-INF/sidebar.xhtml @@ -47,9 +47,8 @@ - - + diff --git a/crov-prase-web/src/main/webapp/app/admin/smallBox/dailyCash/add.xhtml b/crov-prase-web/src/main/webapp/app/admin/smallBox/dailyCash/add.xhtml index 00ca506..e5ab6fd 100644 --- a/crov-prase-web/src/main/webapp/app/admin/smallBox/dailyCash/add.xhtml +++ b/crov-prase-web/src/main/webapp/app/admin/smallBox/dailyCash/add.xhtml @@ -80,7 +80,7 @@ decimalSeparator="." thousandSeparator="," symbol="$" - value="#{addClosingDayBean.totalSanctionsIn+addClosingDayBean.totalPagosPoliza}" + value="#{addClosingDayBean.totalSanctionsIn+(addClosingDayBean.totalPagosPoliza-addClosingDayBean.totalDevolucionPagosPoliza)}" disabled="true"> diff --git a/crov-prase-web/src/main/webapp/app/prase/poliza/aprobarDevolucionDePagos.xhtml b/crov-prase-web/src/main/webapp/app/prase/poliza/aprobarDevolucionDePagos.xhtml new file mode 100644 index 0000000..b85e8c7 --- /dev/null +++ b/crov-prase-web/src/main/webapp/app/prase/poliza/aprobarDevolucionDePagos.xhtml @@ -0,0 +1,97 @@ + + #{i18n.project} - Pólizas + + + + + + + + + +
  • Prase
  • +
  • /
  • +
  • Aprobar devolución de pagos
  • +
    + + +
    +
    +
    +

    Solicitudes de devolución de pagos 

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + +
    \ No newline at end of file diff --git a/crov-prase-web/src/main/webapp/app/prase/poliza/pagos.xhtml b/crov-prase-web/src/main/webapp/app/prase/poliza/pagos.xhtml index a048302..626f593 100644 --- a/crov-prase-web/src/main/webapp/app/prase/poliza/pagos.xhtml +++ b/crov-prase-web/src/main/webapp/app/prase/poliza/pagos.xhtml @@ -159,10 +159,6 @@ - - - - @@ -187,16 +183,6 @@ - - - - - - - - - - @@ -238,6 +224,14 @@ + + + + + + + + @@ -272,7 +266,20 @@ oncomplete="PF('printer').show()" update="formTicket" style="margin-top: 0.5em; background-color: #E6702E" - action="#{pagosPolizasBean.reimprimirTicket()}"> + action="#{pagosPolizasBean.reimprimirTicket()}" + rendered="#{detallePago.tipoPago eq 'ABONO' and detallePago.estatusPago eq 'ENABLED'}"> + + + + @@ -362,6 +369,23 @@ + + + + + + + + + + + + + + + + + @@ -409,7 +433,7 @@ - +