- POLIZA - EDICION EN MODO DE CONTRATO (MENSUAL, TRIMESTRAL, SEMESTRAL O ANUAL)

This commit is contained in:
Brayan.Gonzalez 2025-05-09 15:27:25 -06:00
parent 1264aa127b
commit e36c5f1b27
3 changed files with 260 additions and 9 deletions

View File

@ -184,6 +184,41 @@ public class PagosPolizaController extends ConnectionManager implements Serializ
return result;
}
public List<DetellePagoPoliza> fillDetellePagoPolizaPagadosByPoliza(Poliza poliza) {
logger.info("fillDetellePagoPolizaByPoliza");
List<DetellePagoPoliza> resultList = null;
Transaction transaction = null;
try {
logger.info("Searching pagos for poliza..");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<DetellePagoPoliza> criteria = builder.createQuery(DetellePagoPoliza.class);
Root<DetellePagoPoliza> root = criteria.from(DetellePagoPoliza.class);
Predicate criterio1 = builder.equal(root.get("pagoPoliza").get("poliza"), poliza);
Predicate criterio1_2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED);
Predicate criterio2 = builder.equal(root.get("pagoPoliza").get("estatusActivo"), GenericEnumType.ENABLED);
Predicate criterio3 = builder.equal(root.get("pagoPoliza").get("pagoEstatus"), GenericEnumType.ENABLED);
Predicate criterio4 = builder.equal(root.get("pagoPoliza").get("pagoEstatus"), GenericEnumType.INCOMPLETE);
criteria.where(builder.and(criterio1, criterio1_2, criterio2), builder.or(criterio3, criterio4));
resultList = session.createQuery(criteria).getResultList();
logger.info("Total of pagos found: " + (null == resultList ? -1 : resultList.size()));
transaction.commit();
} catch (HibernateException e) {
logger.error("Pagos cannot be loaded ");
rollback(transaction);
} catch (Exception e) {
logger.error("Method fillPagosPolizaByPoliza ", e);
rollback(transaction);
}
return resultList;
}
public boolean updatePago(PagosPoliza pago, User user) {
logger.info("addPagos");
boolean success = false;
@ -785,6 +820,85 @@ public class PagosPolizaController extends ConnectionManager implements Serializ
}
}
public boolean editarPolizaModoPago(Poliza selectedPoliza, int numeroPagos, List<Calendar> fechasPago, List<DetellePagoPoliza> detallesPagosRealizados, List<PagosPoliza> pagos, User user) {
logger.info("editarPolizaModoPago()");
Date fechaActual = correcciónDeHr(new Date(), -7);
Session session = null;
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
// 1. Actualizar póliza
selectedPoliza.setLastUpdatedBy(user);
selectedPoliza.setLastUpdatedOn(fechaActual);
session.update(selectedPoliza);
// 2. Obtener y desactivar pagos existentes
for (PagosPoliza pago : pagos) {
pago.setEstatusActivo(GenericEnumType.DISABLED);
pago.setLastUpdatedBy(user);
pago.setLastUpdatedOn(fechaActual);
session.update(pago);
}
// 3. Crear nuevos pagos
double contador = selectedPoliza.getCantidadPagada() == 0 ? 2 : 1;
for (Calendar fecha : fechasPago) {
PagosPoliza nuevoPago = new PagosPoliza();
nuevoPago.setId(UUID.randomUUID().toString());
nuevoPago.setPoliza(selectedPoliza);
nuevoPago.setEstatusActivo(GenericEnumType.ENABLED);
nuevoPago.setTipoPago(TipoAbono.ABONO);
nuevoPago.setFechaAPagar(fecha.getTime());
nuevoPago.setCreatedBy(user);
nuevoPago.setCreatedOn(fechaActual);
if (contador == 1) {
// Primer pago
if (numeroPagos == 1) {
nuevoPago.setPago(selectedPoliza.getAmount());
nuevoPago.setCantidadPagada(selectedPoliza.getCantidadPagada());
nuevoPago.setDiferenciaPago(selectedPoliza.getAmount() - selectedPoliza.getCantidadPagada());
nuevoPago.setPagoEstatus(Math.abs(nuevoPago.getDiferenciaPago()) < 0.01 ? GenericEnumType.ENABLED : GenericEnumType.INCOMPLETE);
} else {
nuevoPago.setPago(selectedPoliza.getCantidadPagada());
nuevoPago.setCantidadPagada(selectedPoliza.getCantidadPagada());
nuevoPago.setDiferenciaPago(0D);
nuevoPago.setPagoEstatus(GenericEnumType.ENABLED);
}
// Asociar pagos existentes
for (DetellePagoPoliza pagosRalizado : detallesPagosRealizados) {
pagosRalizado.setPagoPoliza(nuevoPago);
pagosRalizado.setLastUpdatedBy(user);
pagosRalizado.setLastUpdatedOn(fechaActual);
session.update(pagosRalizado);
}
contador = 2;
} else {
// Pagos subsiguientes
if (selectedPoliza.getCantidadPagada() == 0.0) {
nuevoPago.setPago(((selectedPoliza.getAmount() - selectedPoliza.getCantidadPagada())) / (numeroPagos));
} else {
nuevoPago.setPago(((selectedPoliza.getAmount() - selectedPoliza.getCantidadPagada())) / (numeroPagos - 1));
}
nuevoPago.setCantidadPagada(0D);
nuevoPago.setPagoEstatus(GenericEnumType.DISABLED);
}
session.save(nuevoPago);
}
transaction.commit();
return true;
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
logger.error("Error en editarPolizaModoPago: ", e);
return false;
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
}
private Date correcciónDeHr(Date fecha, int horas) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(fecha);

View File

@ -306,11 +306,63 @@ public class PolizaBean extends TaxiGenericBean implements Serializable, Datatab
showMessage(FacesMessage.SEVERITY_INFO, "Actualización realizada", "Póliza actualizada correctamente.");
logger.info("Póliza actualizada correctamente");
} catch (Exception e) {
showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al tratar de actualizar la póliza.");
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de actualizar la póliza.");
logger.error("editarPoliza(): " + e);
}
}
public void editarPolizaModoPago() {
logger.info("editarPolizaModoPago()");
try {
if (getIdPeriocidad().equals("0")) {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "La periodicidad es obligatoria");
return;
}
if (getSelectedPoliza().getAmount() < getSelectedPoliza().getCantidadPagada()) {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "El nuevo monto no puede ser menor que la cantidad que ya se ha pagado");
return;
}
// se define la fecha de inicio
getSelectedPoliza().setInitDate(correcciónDeDias(getInitDate(), 1));
Calendar fechaInicial = Calendar.getInstance();
fechaInicial.setTime(getSelectedPoliza().getInitDate());
// se determina le numero de pagos que se realizaran
int numeroPagos = 0;
switch (getIdPeriocidad()) {
case "ANUAL":
numeroPagos = 1;
break;
case "SEMESTRAL":
numeroPagos = 2;
break;
case "TRIMESTRAL":
numeroPagos = 4;
break;
case "MENSUAL":
numeroPagos = 12;
break;
default:
break;
}
List<DetellePagoPoliza> detallesPagosRealizados = getPagosPolizaController().fillDetellePagoPolizaPagadosByPoliza(getSelectedPoliza());
List<PagosPoliza> pagos = getPagosPolizaController().fillPagosPolizaByPoliza(getSelectedPoliza());
// se generan las fechas de pago
List<Calendar> fechasPago = generarFechasDePago(fechaInicial, numeroPagos, 0);
if (getPagosPolizaController().editarPolizaModoPago(getSelectedPoliza(), numeroPagos, fechasPago, detallesPagosRealizados, pagos, getLoggedUser())) {
clearPolizaForm();
getPolizaList();
showMessage(FacesMessage.SEVERITY_INFO, "Actualización realizada", "Póliza actualizada correctamente.");
logger.info("Póliza actualizada correctamente");
} else {
showMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "Ocurrió un error al tratar de actualizar la póliza.");
logger.info("Ocurrió un error al tratar de actualizar la póliza");
}
} catch (Exception e) {
showMessage(FacesMessage.SEVERITY_FATAL, "ERROR", "Ocurrió un error al tratar de actualizar la póliza.");
logger.error("editarPolizaModoPago(): " + e);
}
}
public List<Calendar> generarFechasDePago(Calendar fechaInicial, int numeroPagos, int periodoGracia) {
logger.info("Generación fechas");
//lista de fechas

View File

@ -237,11 +237,25 @@
</p:column>
<p:column headerText="Acciones" style="width: 4em">
<p:commandButton
id="edit1"
icon="ui-icon-pencil"
title="Editar el modo de contrato"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('editModoPagoDialog').show()"
style="padding-top: 1em; background-color: orange"
update="editModoPagoForm"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
<f:setPropertyActionListener value="#{data}" target="#{polizaBean.selectedPoliza}"/>
<p:confirm header="Editar el modo de contrato" message="El cambiar modo de pago cambiará la estructura de las fechas de pagos adjuntando los pagos ya realizados al primer abono y dividiendo el sobrante entre los pagos faltantes" icon="pi pi-info-circle"/>
</p:commandButton>
<p:commandButton
icon="ui-icon-pencil"
title="Editar"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('dlg2').show()"
style="padding-top: 1em"
update="carBrandForm:carBrandDialog"
action="#{polizaBean.cargarPoliza()}"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
@ -252,7 +266,7 @@
icon="ui-icon-close"
title="Cancelar póliza"
class="rounded-button"
style="background: red"
style="background: red; padding-top: 1em"
oncomplete="PF('eliminarPoliza').show()"
update="eliminarPolizaForm:eliminarPoliza"
action="#{polizaBean.cargarDevolucion()}"
@ -350,6 +364,19 @@
</p:column>
<p:column headerText="Acciones" style="width: 4em">
<p:commandButton
id="edit2"
icon="ui-icon-pencil"
title="Editar el modo de contrato"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('editModoPagoDialog').show()"
style="padding-top: 1em; background-color: orange"
update="editModoPagoForm"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
<f:setPropertyActionListener value="#{data}" target="#{polizaBean.selectedPoliza}"/>
<p:confirm header="Editar el modo de contrato" message="El cambiar modo de pago cambiará la estructura de las fechas de pagos adjuntando los pagos ya realizados al primer abono y dividiendo el sobrante entre los pagos faltantes" icon="pi pi-info-circle"/>
</p:commandButton>
<p:commandButton
value="$"
title="Pagos"
@ -368,6 +395,7 @@
title="Editar"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('dlg2').show()"
style="padding-top: 1em"
update="carBrandForm:carBrandDialog"
action="#{polizaBean.cargarPoliza()}"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
@ -476,6 +504,19 @@
</p:column>
<p:column headerText="Acciones" style="width: 4em">
<p:commandButton
id="edit3"
icon="ui-icon-pencil"
title="Editar el modo de contrato"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('editModoPagoDialog').show()"
style="padding-top: 1em; background-color: orange"
update="editModoPagoForm"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
<f:setPropertyActionListener value="#{data}" target="#{polizaBean.selectedPoliza}"/>
<p:confirm header="Editar el modo de contrato" message="El cambiar modo de pago cambiará la estructura de las fechas de pagos adjuntando los pagos ya realizados al primer abono y dividiendo el sobrante entre los pagos faltantes" icon="pi pi-info-circle"/>
</p:commandButton>
<p:commandButton
value="$"
title="Pagos"
@ -607,6 +648,7 @@
title="Editar"
class="ui-button-icon-only green-pixcua"
oncomplete="PF('dlg2').show()"
style="padding-top: 1em"
update="carBrandForm:carBrandDialog"
action="#{polizaBean.cargarPoliza()}"
rendered="#{data.active and (data.estatus eq 'COTIZACION' or data.estatus eq 'PENDIENTE')}">
@ -617,7 +659,7 @@
icon="ui-icon-close"
title="Cancelar póliza"
class="rounded-button"
style="background: red"
style="background: red; padding-top: 1em"
oncomplete="PF('eliminarPoliza').show()"
update="eliminarPolizaForm:eliminarPoliza"
action="#{polizaBean.cargarDevolucion()}"
@ -730,15 +772,17 @@
</p:dataTable>
</p:tab>
</p:tabView>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade" responsive="true" width="350">
<p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no ui-button-flat"/>
<p:commandButton value="Si" type="button" styleClass="ui-confirmdialog-yes" />
</p:confirmDialog>
</h:form>
</div>
</div>
<h:form id="confirmForm">
<p:confirmDialog id="globalConfirmMsg" global="true" showEffect="clip" hideEffect="clip" width="350">
<p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no ui-button-flat"/>
<p:commandButton value="Si" type="button" styleClass="ui-confirmdialog-yes" />
</p:confirmDialog>
</h:form>
<h:form id="carBrandForm">
<p:growl id="msgsDialog" showDetail="true"/>
<p:dialog widgetVar="dlg2" width="40em" id="carBrandDialog" header="#{polizaBean.polizaAdd.id==null ?'Agregar':'Editar'} póliza" modal="true" responsive="true" showEffect="clip" hideEffect="clip">
@ -888,6 +932,47 @@
</p:dialog>
</h:form>
<h:form id="editModoPagoForm">
<p:growl id="msgsDialog" showDetail="true"/>
<p:dialog widgetVar="editModoPagoDialog" width="40em" id="editModoPagoDialog" header="Cambiar modo de pago" modal="true" responsive="true" showEffect="clip" hideEffect="clip">
<p:ajax event="close" update="editModoPagoDialog" listener="#{polizaBean.clearPolizaForm()}" />
<h:panelGroup styleClass="md-inputfield" style="margin-top: 2em; margin-bottom: 2em" >
<h:panelGroup styleClass="md-inputfield" style="margin-top: 2em; margin-bottom: 2em" >
<p:calendar id="paymentDate" value="#{polizaBean.initDate}" readonlyInput="true" navigator="true" locale="es" pattern="dd - MMMM - yyyy" required="true" requiredMessage="La fecha es requerida" style="width: 100%;" />
<label>Fecha de inicio</label>
<p:message for="paymentDate" display="text"/>
</h:panelGroup>
<h:panelGroup styleClass="md-inputfield" style="margin-top: 2em; margin-bottom: 2em" >
<p:selectOneMenu
id="periocidadSlct"
style="width:100%"
value="#{polizaBean.idPeriocidad}"
required="true"
requiredMessage="Periodicidad es obligatoria" >
<f:selectItem itemLabel="Selecione la periodicidad de pago" itemValue="0" />
<f:selectItem itemLabel="Anual" itemValue="ANUAL" />
<f:selectItem itemLabel="Semestral" itemValue="SEMESTRAL" />
<f:selectItem itemLabel="Trimestral" itemValue="TRIMESTRAL" />
<f:selectItem itemLabel="Mensual" itemValue="MENSUAL" />
</p:selectOneMenu>
<p:message for="periocidadSlct" display="text"/>
</h:panelGroup>
<h:panelGroup styleClass="md-inputfield" style="margin-top: 2em;" >
<p:inputText id="amount" value="#{polizaBean.selectedPoliza.amount}" required="true" requiredMessage="El costo es obligatorio" style="width: 100%;" />
<label>Costo</label>
<p:message for="amount" display="text"/>
</h:panelGroup>
<div class="ui-g-12">
<p:commandButton id="addButton2" value="#{i18n['button.edit']}" rendered="#{polizaBean.selectedPoliza.id!=null}" actionListener="#{polizaBean.editarPolizaModoPago()}" oncomplete="validNewCarBrand(xhr, status, args)" update=":form,msgsDialog,editModoPagoForm"/>
</div>
</h:panelGroup>
</p:dialog>
</h:form>
<h:form id="agregarClienteForm">
<p:growl id="msgsDialog" showDetail="true"/>
<p:dialog id="agregarClienteDialog" widgetVar="agregarClienteDialog" width="45em" height="39em" header="Agregar cliente" modal="true" responsive="true" >