- AGREGAR DETALLES DE ABONOS PARA PODER GENERAR SUB ABONOS

This commit is contained in:
Brayan.Gonzalez 2025-04-15 19:15:56 -06:00
parent 2112b251d4
commit 97d6613040
4 changed files with 636 additions and 394 deletions

View File

@ -9,6 +9,7 @@ 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.GenericEnumType;
import com.crov.prase.model.prase.DetellePagoPoliza;
import com.crov.prase.model.prase.PagosPoliza;
import com.crov.prase.model.prase.Poliza;
import java.io.Serializable;
@ -18,6 +19,8 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
@ -90,7 +93,7 @@ public class PagosPolizaController extends ConnectionManager implements Serializ
Predicate criterio3 = builder.equal(root.get("pagoEstatus"), GenericEnumType.DISABLED);
Predicate startDatePredicate = builder.greaterThanOrEqualTo(root.get("fechaAPagar").as(LocalDate.class), localStartDate);
Predicate endDatePredicate = builder.lessThanOrEqualTo(root.get("fechaAPagar").as(LocalDate.class), localEndDate);
criteria.where(builder.and(criterio1, criterio2,criterio3,startDatePredicate, endDatePredicate));
criteria.where(builder.and(criterio1, criterio2, criterio3, startDatePredicate, endDatePredicate));
criteria.orderBy(builder.asc(root.get("fechaAPagar")));
resultList = session.createQuery(criteria).getResultList();
@ -159,6 +162,122 @@ public class PagosPolizaController extends ConnectionManager implements Serializ
return success;
}
public boolean createDetellePago(DetellePagoPoliza dpago, User user) {
logger.info("createDetellePago");
boolean success = false;
Transaction transaction = null;
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
dpago.setId(UUID.randomUUID().toString());
dpago.setCreatedOn(correcciónDeHr(new Date(), -7));
dpago.setCreatedBy(user);
session.save(dpago);
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 boolean updateDetellePago(DetellePagoPoliza dpago, User user) {
logger.info("createDetellePago");
boolean success = false;
Transaction transaction = null;
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
dpago.setLastUpdatedOn(correcciónDeHr(new Date(), -7));
dpago.setLastUpdatedBy(user);
session.update(dpago);
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 DetellePagoPoliza getUltimoDetalleByPago(String idPago) {
logger.info("getUltimoDetalleByPago");
DetellePagoPoliza result = null;
Transaction transaction = null;
try {
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);
criteria.where(builder.equal(root.get("pagoPoliza").get("id"), idPago));
criteria.orderBy(builder.desc(root.get("createdOn")));
TypedQuery<DetellePagoPoliza> query = session.createQuery(criteria);
query.setMaxResults(1);
result = query.getSingleResult();
transaction.commit();
} catch (NoResultException e) {
logger.info("No se encontró detalle para el pago: " + idPago);
rollback(transaction);
} catch (HibernateException e) {
logger.error("Error al obtener el detalle del pago " + idPago, e);
rollback(transaction);
} catch (Exception e) {
logger.error("Error en getUltimoDetalleByPago(" + idPago + ")", e);
rollback(transaction);
}
return result;
}
public List<DetellePagoPoliza> fillDetellePagoPolizaByPago(String idPago) {
logger.info("fillDetellePagoPolizaByPago");
List<DetellePagoPoliza> resultList = null;
Transaction transaction = null;
try {
logger.info("Searching detalles 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("id"), idPago);
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 detalles pagos found: " + (null == resultList ? -1 : resultList.size()));
transaction.commit();
} catch (HibernateException e) {
logger.error("Detalles pagos cannot be loaded ");
rollback(transaction);
} catch (Exception e) {
logger.error("Method fillDetellePagoPolizaByPago ", e);
rollback(transaction);
}
return resultList;
}
private Date correcciónDeHr(Date fecha, int horas) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(fecha);

View File

@ -61,6 +61,14 @@ public class DetellePagoPoliza implements Serializable {
@Column(name = "folio")
private String folio;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(
name = "cobro",
referencedColumnName = "id",
nullable = true
)
private User cobro;
@Enumerated(EnumType.STRING)
@Column(name = "metodo_pago", nullable = true)
private MetodoPago metodoPago;
@ -184,4 +192,12 @@ public class DetellePagoPoliza implements Serializable {
this.lastUpdatedBy = lastUpdatedBy;
}
public User getCobro() {
return cobro;
}
public void setCobro(User cobro) {
this.cobro = cobro;
}
}

View File

@ -11,6 +11,7 @@ import com.arrebol.taxiservicios.model.enums.MetodoPago;
import com.arrebol.taxiservicios.model.enums.PolizaEstatus;
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.PagosPoliza;
import com.crov.prase.model.prase.Poliza;
import java.io.Serializable;
@ -43,6 +44,8 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
private Poliza selectedPoliza;
private List<PagosPoliza> listPagosPolizas;
private PagosPoliza selectedPago;
private List<DetellePagoPoliza> listDetallePagosPolizas;
private DetellePagoPoliza selectedDetellePago;
private String pagoSiguiente;
private Double cantidadAPagar;
private Boolean pagoExitoso;
@ -76,7 +79,7 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
// se encuentra el siguiente pago a realizar
String idSiguinetePago = "";
for (PagosPoliza pa : getListPagosPolizas()) {
if (pa.getPagoEstatus().equals(GenericEnumType.DISABLED)) {
if (pa.getPagoEstatus().equals(GenericEnumType.DISABLED) || pa.getPagoEstatus().equals(GenericEnumType.INCOMPLETE)) {
idSiguinetePago = pa.getId();
break;
}
@ -88,13 +91,11 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
}
public void cargarPago() {
setCantidadAPagar(getSelectedPago().getPago());
setCantidadAPagar(getSelectedPago().getDiferenciaPago());
}
public void pagar() {
logger.info("pagar()");
try {
setPagoExitoso(false);
if (getGenericController().existClosingDayByCreatedOn(new Date(), getLoggedUser())) {
@ -107,70 +108,89 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
return;
}
if (getCantidadAPagar() > (getSelectedPago().getPago() - getSelectedPago().getCantidadPagada())) {
showMessage(FacesMessage.SEVERITY_WARN, "ERROR", "La cantidad a pagar no puede ser mayor al pago restante del abono");
return;
}
// se valida el pago realizado sea el siguiente según el consecutivo
if (getSelectedPago().getId().equals(getPagoSiguiente())) {
setImagen("images/prase_logo.jpeg");
// se optiene el folio consecutivo
String folio = obtenerFolio("A-PRASE");
if (folio != null) {
// se actualiza el pago
getSelectedPago().setPagoEstatus(GenericEnumType.ENABLED);
getSelectedPago().setFolio(folio);
getSelectedPago().setFechaPago(correcciónDeHr(new Date(), -7));
getSelectedPago().setCobro(getLoggedUser());
getSelectedPago().setCantidadPagada(getSelectedPago().getPago());
getSelectedPago().setDiferenciaPago(0.0);
switch (getMetodoPago()) {
case "EFECTIVO":
getSelectedPago().setMetodoPago(MetodoPago.EFECTIVO);
break;
case "TARJETA":
getSelectedPago().setMetodoPago(MetodoPago.TARJETA);
break;
case "DEPOSITO":
getSelectedPago().setMetodoPago(MetodoPago.DEPOSITO);
break;
case "TRASFERENCIA":
getSelectedPago().setMetodoPago(MetodoPago.TRASFERENCIA);
break;
default:
getSelectedPago().setMetodoPago(MetodoPago.EFECTIVO);
}
getPagosPolizaController().updatePago(getSelectedPago(), getLoggedUser());
// se actuliza la venta
getSelectedPoliza().setCantidadPagada(getSelectedPoliza().getCantidadPagada() + getSelectedPago().getPago());
getSelectedPoliza().setLastUpdatedBy(getLoggedUser());
getSelectedPoliza().setLastUpdatedOn(new Date());
//se valida si la venta ya fue liquidada
double cantidadPa = getSelectedPoliza().getCantidadPagada();
double costoTotal = getSelectedPoliza().getAmount();
double tolerancia = 0.001;
if (Math.abs(cantidadPa - costoTotal) < tolerancia) {
getSelectedPoliza().setEstatus(PolizaEstatus.LIQUIDADO);
}
getPolizaController().update(getSelectedPoliza());
// se actuliza el pago
if (actualizarAbono(getSelectedPago(), getCantidadAPagar(), getMetodoPago())) {
// se actualiza la lista de pagos y polizas
cargarPagosPoliza();
cargarPolizas();
setPagoExitoso(true);
logger.info("El pago se realizó correctamente");
// se carga el ultimo detalle para el tiked
setSelectedDetellePago(getPagosPolizaController().getUltimoDetalleByPago(getSelectedPago().getId()));
cargarPagosPoliza();
cargarDetalles();
cargarPolizas();
showMessage(FacesMessage.SEVERITY_INFO, "Pago realizado", "El pago se realizó correctamente");
} else {
logger.error("Ocurrió un error al generar el folio");
showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al generar el folio");
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al realizar el pago");
}
} else {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "Solo puede pagar el pago consecutivo");
}
} catch (Exception e) {
showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al realizar el pago");
logger.error("pagar(): " + e);
}
private boolean actualizarAbono(PagosPoliza pagoA, Double montoPagado, String metodoDePago) {
try {
setImagen("images/prase_logo.jpeg");
// se optiene el folio consecutivo
String folio = obtenerFolio("A-PRASE");
if (folio != null) {
// se genera el detalle pago
DetellePagoPoliza detalle = new DetellePagoPoliza();
detalle.setPagoPoliza(pagoA);
detalle.setEstatusActivo(GenericEnumType.ENABLED);
detalle.setFechaPago(correcciónDeHr(new Date(), -7));
detalle.setCantidadPagada(montoPagado);
detalle.setCobro(getLoggedUser());
detalle.setFolio(folio);
detalle.setMetodoPago(MetodoPago.valueOf(metodoDePago));
getPagosPolizaController().createDetellePago(detalle, getLoggedUser());
// se actualisa el pago pricipal
pagoA.setCantidadPagada(pagoA.getCantidadPagada() + detalle.getCantidadPagada());
pagoA.setDiferenciaPago(pagoA.getPago() - pagoA.getCantidadPagada());
if (Math.abs(pagoA.getDiferenciaPago()) < 0.01) {
pagoA.setPagoEstatus(GenericEnumType.ENABLED);
pagoA.setCantidadPagada(pagoA.getPago());
pagoA.setDiferenciaPago(0.0);
} else {
pagoA.setPagoEstatus(GenericEnumType.INCOMPLETE);
}
getPagosPolizaController().updatePago(pagoA, getLoggedUser());
// se actuliza la venta
pagoA.getPoliza().setCantidadPagada(pagoA.getPoliza().getCantidadPagada() + detalle.getCantidadPagada());
pagoA.getPoliza().setLastUpdatedBy(getLoggedUser());
pagoA.getPoliza().setLastUpdatedOn(new Date());
//se valida si la venta ya fue liquidada
double cantidadPa = pagoA.getPoliza().getCantidadPagada();
double costoTotal = pagoA.getPoliza().getAmount();
if (Math.abs(cantidadPa - costoTotal) < 0.10) {
pagoA.getPoliza().setEstatus(PolizaEstatus.LIQUIDADO);
pagoA.getPoliza().setCantidadPagada(pagoA.getPoliza().getAmount());
}
getPolizaController().update(pagoA.getPoliza());
logger.info("El pago se realizó correctamente");
return true;
} else {
logger.error("Ocurrió un error al generar el folio");
return false;
}
} catch (Exception e) {
logger.error("actualizarAbono(): " + e);
return false;
}
}
public void limpiarDetallePago() {
setSelectedDetellePago(null);
setPagoExitoso(false);
}
private String obtenerFolio(String ab) {
@ -211,6 +231,15 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
}
}
public void cargarDetalles() {
try {
setListDetallePagosPolizas(getPagosPolizaController().fillDetellePagoPolizaByPago(getSelectedPago().getId()));
} catch (Exception e) {
logger.error("cargarDetalles(): " + e);
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de cargar los detalles de pago");
}
}
public void reimprimirTicket() {
setPagoExitoso(true);
try {
@ -333,4 +362,20 @@ public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
this.metodoPago = metodoPago;
}
public DetellePagoPoliza getSelectedDetellePago() {
return selectedDetellePago;
}
public void setSelectedDetellePago(DetellePagoPoliza selectedDetellePago) {
this.selectedDetellePago = selectedDetellePago;
}
public List<DetellePagoPoliza> getListDetallePagosPolizas() {
return listDetallePagosPolizas;
}
public void setListDetallePagosPolizas(List<DetellePagoPoliza> listDetallePagosPolizas) {
this.listDetallePagosPolizas = listDetallePagosPolizas;
}
}

View File

@ -187,10 +187,72 @@
<p:column headerText="Acciones">
<p:commandButton title="Pagar" value="Pagar" update="pagarForm" oncomplete="PF('pagarDialog').show()" action="#{pagosPolizasBean.cargarPago()}" rendered="#{pago.pagoEstatus eq 'DISABLED' and pago.id eq pagosPolizasBean.pagoSiguiente}" >
<p:commandButton title="Pagar" value="Pagar" update="pagarForm" oncomplete="PF('pagarDialog').show()" action="#{pagosPolizasBean.cargarPago()}" rendered="#{(pago.pagoEstatus eq 'DISABLED' or pago.pagoEstatus eq 'INCOMPLETE' )and pago.id eq pagosPolizasBean.pagoSiguiente}" >
<f:setPropertyActionListener value="#{pago}" target="#{pagosPolizasBean.selectedPago}" />
</p:commandButton>
<p:commandButton
process="@this"
value="Detalles"
title="Detalles"
oncomplete="PF('detallePagosDialog').show()"
update="detallePagosForm"
style="margin-top: 0.5em; background-color: #E6702E"
action="#{pagosPolizasBean.cargarDetalles()}"
rendered="#{pago.pagoEstatus=='ENABLED' or pago.pagoEstatus=='INCOMPLETE'}">
<f:setPropertyActionListener value="#{pago}" target="#{pagosPolizasBean.selectedPago}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</p:outputPanel>
</p:dialog>
</h:form>
<h:form id="detallePagosForm">
<p:dialog widgetVar="detallePagosDialog" id="detallePagosDialog" style="max-height: 45em; overflow-y: scroll;" width="95em" header="detallePagos" modal="true" >
<p:outputPanel style="padding-top: 2em">
<p:dataTable widgetVar="dtdetallePagos" id="dtdetallePagos" value="#{pagosPolizasBean.listDetallePagosPolizas}" var="detallePago" draggableRows="true" draggableColumns="true" style="margin-bottom:20px; text-align: center" reflow="true" rowsPerPageTemplate="5,10,25,50,100" emptyMessage="No hay registros"
rowKey="#{detallePago.id}" selection="#{pagosPolizasBean.selectedDetellePago}" editable="true" selectionMode="single" paginator="true" rows="10" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}">
<f:facet name="header">
<p:commandButton id="toggler" type="button" value="Columnas" style="float:left;" styleClass="amber-btn flat" icon="ui-icon-calendar"/>
<p:columnToggler datasource="dtdetallePagos" trigger="toggler" />
<p:outputPanel>
<h:outputText value="#{i18n['general.search']}: " />
<p:inputText id="globalFilter" onkeyup="PF('dtdetallePagos').filter()" style="width:150px;color: #000000;"/>
</p:outputPanel>
</f:facet>
<p:column headerText="Metodo pago" sortBy="#{detallePago.metodoPago}" filterBy="#{detallePago.metodoPago}">
<h:outputText value="#{detallePago.metodoPago}" />
</p:column>
<p:column headerText="Folio" sortBy="#{detallePago.folio}" filterBy="#{detallePago.folio}">
<h:outputText value="#{detallePago.folio}" />
</p:column>
<p:column headerText="Cantidad pagada" sortBy="#{detallePago.cantidadPagada}" filterBy="#{detallePago.cantidadPagada}">
<h:outputText value="#{detallePago.cantidadPagada}" >
<f:convertNumber currencySymbol="$" groupingUsed="true" maxFractionDigits="2" type="currency" locale="en" />
</h:outputText>
</p:column>
<p:column headerText="Fecha de pago" sortBy="#{detallePago.fechaPago}" filterBy="#{detallePago.fechaPago}">
<h:outputText value="#{detallePago.fechaPago}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
</p:column>
<p:column headerText="Usuario cobro" sortBy="#{detallePago.cobro.person.firstName} #{detallePago.cobro.person.secondName} #{detallePago.cobro.person.lastName} #{detallePago.cobro.person.middleName}" filterBy="#{detallePago.cobro.person.firstName} #{detallePago.cobro.person.secondName} #{detallePago.cobro.person.lastName} #{detallePago.cobro.person.middleName}">
<h:outputText value="#{detallePago.cobro.person.firstName} #{detallePago.cobro.person.secondName} #{detallePago.cobro.person.lastName} #{detallePago.cobro.person.middleName}" />
</p:column>
<p:column headerText="Acciones">
<p:commandButton
process="@this"
value="Reimprimir"
@ -198,9 +260,8 @@
oncomplete="PF('printer').show()"
update="formTicket"
style="margin-top: 0.5em; background-color: #E6702E"
action="#{pagosPolizasBean.reimprimirTicket()}"
rendered="#{pago.pagoEstatus=='ENABLED'}">
<f:setPropertyActionListener value="#{pago}" target="#{pagosPolizasBean.selectedPago}"/>
action="#{pagosPolizasBean.reimprimirTicket()}">
<f:setPropertyActionListener value="#{detallePago}" target="#{pagosPolizasBean.selectedDetellePago}"/>
</p:commandButton>
</p:column>
@ -216,14 +277,14 @@
<p:ajax event="close" update="pagarDialog" />
<p:outputPanel style="margin-top: 1em" >
<h:panelGroup id="panel" >
<div class="ui-g-12">
<h:panelGroup id="panel" style="margin-top: 2em; margin-bottom: 2em">
<h:panelGroup styleClass="md-inputfield" >
<p:inputNumber id="canridadPagada" value="#{pagosPolizasBean.cantidadAPagar}" emptyValue="zero" minValue="0" decimalPlaces="2" autocomplete="on" required="true" requiredMessage="El nomero de pagos es obligatorio" style="width: 100%;" disabled="true" />
<p:inputNumber id="canridadPagada" value="#{pagosPolizasBean.cantidadAPagar}" minValue="0" decimalPlaces="2" autocomplete="off" required="true" requiredMessage="El nomero de pagos es obligatorio" style="width: 100%;" />
<label>Cantidad a pagar</label>
<p:message for="canridadPagada" display="text"/>
</h:panelGroup>
</div>
</h:panelGroup>
<h:panelGroup styleClass="md-inputfield" style="margin-top: 2em; margin-bottom: 2em" >
@ -242,7 +303,7 @@
<p:message for="metodoPagoSlct" display="text"/>
</h:panelGroup>
<p:commandButton id="addButton1" value="Pagar" actionListener="#{pagosPolizasBean.pagar()}" update="form, pagosForm:dtPagos, pagarForm, formTicket, pagarDialog" rendered="#{pagosPolizasBean.selectedPago.pagoEstatus eq 'DISABLED'}" oncomplete="PF('printer').show()" />
<p:commandButton id="addButton1" value="Pagar" actionListener="#{pagosPolizasBean.pagar()}" update="form, pagosForm:dtPagos, pagarForm, formTicket, pagarDialog" rendered="#{pagosPolizasBean.selectedPago.pagoEstatus eq 'DISABLED' or pagosPolizasBean.selectedPago.pagoEstatus=='INCOMPLETE'}" oncomplete="PF('printer').show()" />
</p:outputPanel>
</p:dialog>
@ -250,25 +311,26 @@
<h:form id="formTicket">
<p:dialog header="Vista previa del ticket" widgetVar="printer" minHeight="40" width="350" showEffect="fade" id="printer">
<p:ajax event="close" update="printer" listener="#{pagosPolizasBean.limpiarDetallePago()}" />
<p:outputPanel id="pnlPrint" class="no-page-break scrollable-panel" rendered="#{pagosPolizasBean.pagoExitoso}">
<p:graphicImage name="#{pagosPolizasBean.imagen}" style="width: 110px; height: 100px; display: block; margin-left: auto; margin-right: auto;" library="serenity-layout"/>
<div class="details">
<p><strong>Folio: </strong>
<h:outputText value="#{pagosPolizasBean.selectedPago.folio}" style="margin-right: 5em" />
<h:outputText value="#{pagosPolizasBean.selectedDetellePago.folio}" style="margin-right: 5em" />
</p>
<p><strong>Poliza: </strong>
<h:outputText value="#{pagosPolizasBean.selectedPoliza.folio}" style="margin-right: 5em" />
</p>
<p><strong>Fecha: </strong>
<h:outputText value="#{pagosPolizasBean.selectedPago.fechaPago}" style="margin-right: 5em">
<h:outputText value="#{pagosPolizasBean.selectedDetellePago.fechaPago}" style="margin-right: 5em">
<f:convertDateTime type="date" locale="es" timeZone="GMT-6" pattern="dd - MMMM - yyyy"/>
</h:outputText>
</p>
<p><strong><h:outputText value="CLIENTE: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedPago.poliza.customer.firstName} #{pagosPolizasBean.selectedPago.poliza.customer.secondName} #{pagosPolizasBean.selectedPago.poliza.customer.lastName}" /></p>
<p><strong><h:outputText value="PAGO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedPago.cantidadPagada}" ><f:convertNumber currencySymbol="$" groupingUsed="true" maxFractionDigits="2" type="currency" locale="en" /></h:outputText></p>
<p><strong><h:outputText value="PAGO RESTANTE: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedPoliza.amount - pagosPolizasBean.selectedPoliza.cantidadPagada}" ><f:convertNumber currencySymbol="$" groupingUsed="true" maxFractionDigits="2" type="currency" locale="en" /></h:outputText></p>
<p><strong><h:outputText value="COBRO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedPago.cobro.person.firstName} #{pagosPolizasBean.selectedPago.cobro.person.secondName} #{pagosPolizasBean.selectedPago.cobro.person.lastName} #{pagosPolizasBean.selectedPago.cobro.person.middleName}"/></p>
<p><strong><h:outputText value="MÉTODO DE PAGO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedPago.metodoPago.type}" ></h:outputText></p>
<p><strong><h:outputText value="CLIENTE: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedDetellePago.pagoPoliza.poliza.customer.firstName} #{pagosPolizasBean.selectedDetellePago.pagoPoliza.poliza.customer.secondName} #{pagosPolizasBean.selectedDetellePago.pagoPoliza.poliza.customer.lastName}" /></p>
<p><strong><h:outputText value="PAGO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedDetellePago.cantidadPagada}" ><f:convertNumber currencySymbol="$" groupingUsed="true" maxFractionDigits="2" type="currency" locale="en" /></h:outputText></p>
<p><strong><h:outputText value="PAGO RESTANTE: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedDetellePago.pagoPoliza.poliza.amount - pagosPolizasBean.selectedDetellePago.pagoPoliza.poliza.cantidadPagada}" ><f:convertNumber currencySymbol="$" groupingUsed="true" maxFractionDigits="2" type="currency" locale="en" /></h:outputText></p>
<p><strong><h:outputText value="COBRO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedDetellePago.cobro.person.firstName} #{pagosPolizasBean.selectedDetellePago.cobro.person.secondName} #{pagosPolizasBean.selectedDetellePago.cobro.person.lastName} #{pagosPolizasBean.selectedDetellePago.cobro.person.middleName}"/></p>
<p><strong><h:outputText value="MÉTODO DE PAGO: " /></strong> <h:outputText value="#{pagosPolizasBean.selectedDetellePago.metodoPago.type}" ></h:outputText></p>
</div>
<p><center><strong><h:outputText value="#{pagosPolizasBean.loggedUser.location.businessName}" /><br/> AGRADECE SU PREFERENCIA </strong></center></p>
<p>