- 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;
@ -34,137 +37,253 @@ import org.hibernate.Transaction;
*/
public class PagosPolizaController extends ConnectionManager implements Serializable {
private static final long serialVersionUID = -8772793021819350069L;
final Logger logger = LogManager.getLogger(getClass());
private static final long serialVersionUID = -8772793021819350069L;
final Logger logger = LogManager.getLogger(getClass());
public List<PagosPoliza> fillPagosPolizaByPoliza(Poliza poliza) {
logger.info("fillPagosPolizaByPoliza");
List<PagosPoliza> resultList = null;
Transaction transaction = null;
try {
logger.info("Searching pagos for poliza..");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
public List<PagosPoliza> fillPagosPolizaByPoliza(Poliza poliza) {
logger.info("fillPagosPolizaByPoliza");
List<PagosPoliza> 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<PagosPoliza> criteria = builder.createQuery(PagosPoliza.class);
Root<PagosPoliza> root = criteria.from(PagosPoliza.class);
CriteriaQuery<PagosPoliza> criteria = builder.createQuery(PagosPoliza.class);
Root<PagosPoliza> root = criteria.from(PagosPoliza.class);
Predicate criterio1 = builder.equal(root.get("poliza"), poliza);
Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED);
criteria.where(builder.and(criterio1, criterio2));
criteria.orderBy(builder.asc(root.get("fechaAPagar")));
Predicate criterio1 = builder.equal(root.get("poliza"), poliza);
Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED);
criteria.where(builder.and(criterio1, criterio2));
criteria.orderBy(builder.asc(root.get("fechaAPagar")));
resultList = session.createQuery(criteria).getResultList();
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;
}
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 List<PagosPoliza> fillPagosPolizaFechaAPagarByLocationFechaInicioAndFechaFin(Location location, Date startDate, Date endDate) {
logger.info("fillPagosPolizaByPoliza");
List<PagosPoliza> resultList = null;
Transaction transaction = null;
try {
logger.info("Searching pagos for poliza..");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
public List<PagosPoliza> fillPagosPolizaFechaAPagarByLocationFechaInicioAndFechaFin(Location location, Date startDate, Date endDate) {
logger.info("fillPagosPolizaByPoliza");
List<PagosPoliza> 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<PagosPoliza> criteria = builder.createQuery(PagosPoliza.class);
Root<PagosPoliza> root = criteria.from(PagosPoliza.class);
CriteriaQuery<PagosPoliza> criteria = builder.createQuery(PagosPoliza.class);
Root<PagosPoliza> root = criteria.from(PagosPoliza.class);
LocalDate localStartDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localEndDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localStartDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localEndDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Predicate criterio1 = builder.equal(root.get("poliza").get("location"), location);
Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED);
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.orderBy(builder.asc(root.get("fechaAPagar")));
Predicate criterio1 = builder.equal(root.get("poliza").get("location"), location);
Predicate criterio2 = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED);
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.orderBy(builder.asc(root.get("fechaAPagar")));
resultList = session.createQuery(criteria).getResultList();
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;
}
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 PagosPoliza fillFoliosByPagos(String abreviacionFolio) {
PagosPoliza result = null;
Transaction transaction = null;
try {
logger.info("Search last generated folio..");
public PagosPoliza fillFoliosByPagos(String abreviacionFolio) {
PagosPoliza result = null;
Transaction transaction = null;
try {
logger.info("Search last generated folio..");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
String query = "SELECT tap FROM PagosPoliza tap "
+ "WHERE tap.folio LIKE '" + abreviacionFolio + "%' "
+ "ORDER BY "
+ "SUBSTRING_INDEX(tap.folio, '-', 1) DESC, "
+ "SUBSTRING_INDEX(SUBSTRING_INDEX(tap.folio, '-', -2), '-', -6) DESC ";
String query = "SELECT tap FROM PagosPoliza tap "
+ "WHERE tap.folio LIKE '" + abreviacionFolio + "%' "
+ "ORDER BY "
+ "SUBSTRING_INDEX(tap.folio, '-', 1) DESC, "
+ "SUBSTRING_INDEX(SUBSTRING_INDEX(tap.folio, '-', -2), '-', -6) DESC ";
result = (PagosPoliza) session.createQuery(query).setMaxResults(1).uniqueResult();
transaction.commit();
} catch (HibernateException e) {
logger.error("Search for the last generated folio " + e);
rollback(transaction);
} catch (Exception e) {
logger.error("Method fillFoliosByPagos() " + e);
rollback(transaction);
}
return result;
}
public boolean updatePago(PagosPoliza pago, User user) {
logger.info("addPagos");
boolean success = false;
Transaction transaction = null;
result = (PagosPoliza) session.createQuery(query).setMaxResults(1).uniqueResult();
transaction.commit();
} catch (HibernateException e) {
logger.error("Search for the last generated folio " + e);
rollback(transaction);
} catch (Exception e) {
logger.error("Method fillFoliosByPagos() " + e);
rollback(transaction);
}
return result;
}
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
public boolean updatePago(PagosPoliza pago, User user) {
logger.info("addPagos");
boolean success = false;
Transaction transaction = null;
pago.setLastUpdatedOn(correcciónDeHr(new Date(), -7));
pago.setLastUpdatedBy(user);
session.update(pago);
transaction.commit();
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
success = true;
} catch (HibernateException e) {
logger.error("Venta can not be added ", e);
rollback(transaction);
} catch (Exception e) {
logger.error("Method addVenta() ", e);
rollback(transaction);
}
return success;
}
pago.setLastUpdatedOn(correcciónDeHr(new Date(), -7));
pago.setLastUpdatedBy(user);
session.update(pago);
transaction.commit();
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;
}
success = true;
} catch (HibernateException e) {
logger.error("Venta can not be added ", e);
rollback(transaction);
} catch (Exception e) {
logger.error("Method addVenta() ", e);
rollback(transaction);
}
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);
calendar.add(Calendar.HOUR_OF_DAY, horas);
Date nuevaFecha = calendar.getTime();
return nuevaFecha;
}
}

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;
@ -32,305 +33,349 @@ import org.apache.logging.log4j.Logger;
@ViewScoped
public class PagosPolizasBean extends TaxiGenericBean implements Serializable {
private static final long serialVersionUID = -136031528440947006L;
final Logger logger = LogManager.getLogger(PolizaBean.class);
private static final long serialVersionUID = -136031528440947006L;
final Logger logger = LogManager.getLogger(PolizaBean.class);
private PolizaController polizaController;
private PagosPolizaController pagosPolizaController;
private GenericValidationController genericController;
private PolizaController polizaController;
private PagosPolizaController pagosPolizaController;
private GenericValidationController genericController;
private List<Poliza> poliza;
private Poliza selectedPoliza;
private List<PagosPoliza> listPagosPolizas;
private PagosPoliza selectedPago;
private String pagoSiguiente;
private Double cantidadAPagar;
private Boolean pagoExitoso;
private String imagen;
private String metodoPago;
private List<Poliza> poliza;
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;
private String imagen;
private String metodoPago;
@PostConstruct
public void init() {
logger.info("init");
try {
loadBundlePropertyFile();
setPolizaController(new PolizaController());
setPagosPolizaController(new PagosPolizaController());
setGenericController(new GenericValidationController());
@PostConstruct
public void init() {
logger.info("init");
try {
loadBundlePropertyFile();
setPolizaController(new PolizaController());
setPagosPolizaController(new PagosPolizaController());
setGenericController(new GenericValidationController());
cargarPolizas();
} catch (Exception e) {
logger.error(e);
}
}
public void cargarPolizas() {
logger.info("cargarPolizas()");
setPoliza(getPolizaController().findActive(getLoggedUser().getLocation()));
}
public void cargarPagosPoliza() {
logger.info("cargarPagosPoliza()");
try {
// se caga la lista de pagos
setListPagosPolizas(getPagosPolizaController().fillPagosPolizaByPoliza(getSelectedPoliza()));
// se encuentra el siguiente pago a realizar
String idSiguinetePago = "";
for (PagosPoliza pa : getListPagosPolizas()) {
if (pa.getPagoEstatus().equals(GenericEnumType.DISABLED) || pa.getPagoEstatus().equals(GenericEnumType.INCOMPLETE)) {
idSiguinetePago = pa.getId();
break;
}
}
setPagoSiguiente(idSiguinetePago);
} catch (Exception e) {
logger.error("cargarPagosPoliza(): " + e);
}
}
public void cargarPago() {
setCantidadAPagar(getSelectedPago().getDiferenciaPago());
}
public void pagar() {
logger.info("pagar()");
setPagoExitoso(false);
if (getGenericController().existClosingDayByCreatedOn(new Date(), getLoggedUser())) {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "No se puede hacer ninguna acción si existe un corte del día");
return;
}
if (getGenericController().existStableGeneralBoxByCurdate(getLoggedUser())) {
showMessage(FacesMessage.SEVERITY_WARN, "Dia cerrado", "No se puede hacer ninguna acción porque ya existe un cuadre de caja chica del día");
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())) {
// se actuliza el pago
if (actualizarAbono(getSelectedPago(), getCantidadAPagar(), getMetodoPago())) {
// se actualiza la lista de pagos y polizas
setPagoExitoso(true);
// se carga el ultimo detalle para el tiked
setSelectedDetellePago(getPagosPolizaController().getUltimoDetalleByPago(getSelectedPago().getId()));
cargarPagosPoliza();
cargarDetalles();
cargarPolizas();
} catch (Exception e) {
logger.error(e);
}
}
showMessage(FacesMessage.SEVERITY_INFO, "Pago realizado", "El pago se realizó correctamente");
} else {
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al realizar el pago");
}
} else {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "Solo puede pagar el pago consecutivo");
}
public void cargarPolizas() {
logger.info("cargarPolizas()");
setPoliza(getPolizaController().findActive(getLoggedUser().getLocation()));
}
}
public void cargarPagosPoliza() {
logger.info("cargarPagosPoliza()");
try {
// se caga la lista de pagos
setListPagosPolizas(getPagosPolizaController().fillPagosPolizaByPoliza(getSelectedPoliza()));
// se encuentra el siguiente pago a realizar
String idSiguinetePago = "";
for (PagosPoliza pa : getListPagosPolizas()) {
if (pa.getPagoEstatus().equals(GenericEnumType.DISABLED)) {
idSiguinetePago = pa.getId();
break;
}
}
setPagoSiguiente(idSiguinetePago);
} catch (Exception e) {
logger.error("cargarPagosPoliza(): " + e);
}
}
public void cargarPago() {
setCantidadAPagar(getSelectedPago().getPago());
}
public void pagar() {
logger.info("pagar()");
try {
setPagoExitoso(false);
if (getGenericController().existClosingDayByCreatedOn(new Date(), getLoggedUser())) {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "No se puede hacer ninguna acción si existe un corte del día");
return;
}
if (getGenericController().existStableGeneralBoxByCurdate(getLoggedUser())) {
showMessage(FacesMessage.SEVERITY_WARN, "Dia cerrado", "No se puede hacer ninguna acción porque ya existe un cuadre de caja chica del día");
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 actualiza la lista de pagos y polizas
cargarPagosPoliza();
cargarPolizas();
setPagoExitoso(true);
logger.info("El pago se realizó correctamente");
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");
}
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 {
showMessage(FacesMessage.SEVERITY_WARN, "Error", "Solo puede pagar el pago consecutivo");
pagoA.setPagoEstatus(GenericEnumType.INCOMPLETE);
}
getPagosPolizaController().updatePago(pagoA, getLoggedUser());
} catch (Exception e) {
showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al realizar el pago");
logger.error("pagar(): " + e);
}
}
private String obtenerFolio(String ab) {
logger.info("Obteniendo último folio ");
try {
// Se cargan los abonos para validar el folio
String abreviacion = ab;
PagosPoliza ultimoFolio = getPagosPolizaController().fillFoliosByPagos(abreviacion);
// Se valida si ya existen folios registrados para el proyecto y se le asigna el último encontrado
int consecutivo = 0;
if (ultimoFolio != null) {
String folior = ultimoFolio.getFolio();
// Dividir el folio en partes utilizando el guion como separador
String[] partes = folior.split("-");
// Obtener la parte del consecutivo
String consecutivoParte = partes[2];
// Convertir el consecutivo a un entero
consecutivo = Integer.parseInt(consecutivoParte);
// 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());
}
// se formatea el consecutivo
String numeroFormateado = String.format("%06d", consecutivo + 1);
String folio;
// Se obtiene el año actual
Calendar calendario = Calendar.getInstance();
int ano = calendario.get(Calendar.YEAR);
String anoActual = String.valueOf(ano);
// Se valida si se creara el primer folio
if (consecutivo == 0) {
folio = abreviacion + "-" + "000001" + "-" + anoActual;
} else {
folio = abreviacion + "-" + numeroFormateado + "-" + anoActual;
}
return folio;
} catch (NumberFormatException e) {
logger.error("Ocurrió un erro al obtener el último folio ");
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al generar el folio");
return null;
}
}
getPolizaController().update(pagoA.getPoliza());
public void reimprimirTicket() {
setPagoExitoso(true);
try {
setImagen("images/prase_logo.jpeg");
} catch (Exception e) {
logger.error("Error al definir el logo para el tiked  " + e);
}
}
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;
}
}
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;
}
public void limpiarDetallePago() {
setSelectedDetellePago(null);
setPagoExitoso(false);
}
public String validarColores(String estatus) {
// Validadar color 
if (estatus.equals("LIQUIDADO")) {
return "bgVerde";
} else {
return "";
}
}
private String obtenerFolio(String ab) {
logger.info("Obteniendo último folio ");
try {
// Se cargan los abonos para validar el folio
String abreviacion = ab;
PagosPoliza ultimoFolio = getPagosPolizaController().fillFoliosByPagos(abreviacion);
// Se valida si ya existen folios registrados para el proyecto y se le asigna el último encontrado
int consecutivo = 0;
if (ultimoFolio != null) {
String folior = ultimoFolio.getFolio();
// Dividir el folio en partes utilizando el guion como separador
String[] partes = folior.split("-");
// Obtener la parte del consecutivo
String consecutivoParte = partes[2];
// Convertir el consecutivo a un entero
consecutivo = Integer.parseInt(consecutivoParte);
}
// se formatea el consecutivo
String numeroFormateado = String.format("%06d", consecutivo + 1);
String folio;
// Se obtiene el año actual
Calendar calendario = Calendar.getInstance();
int ano = calendario.get(Calendar.YEAR);
String anoActual = String.valueOf(ano);
// Se valida si se creara el primer folio
if (consecutivo == 0) {
folio = abreviacion + "-" + "000001" + "-" + anoActual;
} else {
folio = abreviacion + "-" + numeroFormateado + "-" + anoActual;
}
return folio;
} catch (NumberFormatException e) {
logger.error("Ocurrió un erro al obtener el último folio ");
showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al generar el folio");
return null;
}
}
public PolizaController getPolizaController() {
return polizaController;
}
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 setPolizaController(PolizaController polizaController) {
this.polizaController = polizaController;
}
public void reimprimirTicket() {
setPagoExitoso(true);
try {
setImagen("images/prase_logo.jpeg");
} catch (Exception e) {
logger.error("Error al definir el logo para el tiked  " + e);
}
}
public List<Poliza> getPoliza() {
return poliza;
}
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;
}
public void setPoliza(List<Poliza> poliza) {
this.poliza = poliza;
}
public String validarColores(String estatus) {
// Validadar color 
if (estatus.equals("LIQUIDADO")) {
return "bgVerde";
} else {
return "";
}
}
public Poliza getSelectedPoliza() {
return selectedPoliza;
}
public PolizaController getPolizaController() {
return polizaController;
}
public void setSelectedPoliza(Poliza selectedPoliza) {
this.selectedPoliza = selectedPoliza;
}
public void setPolizaController(PolizaController polizaController) {
this.polizaController = polizaController;
}
public List<PagosPoliza> getListPagosPolizas() {
return listPagosPolizas;
}
public List<Poliza> getPoliza() {
return poliza;
}
public void setListPagosPolizas(List<PagosPoliza> listPagosPolizas) {
this.listPagosPolizas = listPagosPolizas;
}
public void setPoliza(List<Poliza> poliza) {
this.poliza = poliza;
}
public PagosPoliza getSelectedPago() {
return selectedPago;
}
public Poliza getSelectedPoliza() {
return selectedPoliza;
}
public void setSelectedPago(PagosPoliza selectedPago) {
this.selectedPago = selectedPago;
}
public void setSelectedPoliza(Poliza selectedPoliza) {
this.selectedPoliza = selectedPoliza;
}
public PagosPolizaController getPagosPolizaController() {
return pagosPolizaController;
}
public List<PagosPoliza> getListPagosPolizas() {
return listPagosPolizas;
}
public void setPagosPolizaController(PagosPolizaController pagosPolizaController) {
this.pagosPolizaController = pagosPolizaController;
}
public void setListPagosPolizas(List<PagosPoliza> listPagosPolizas) {
this.listPagosPolizas = listPagosPolizas;
}
public String getPagoSiguiente() {
return pagoSiguiente;
}
public PagosPoliza getSelectedPago() {
return selectedPago;
}
public void setPagoSiguiente(String pagoSiguiente) {
this.pagoSiguiente = pagoSiguiente;
}
public void setSelectedPago(PagosPoliza selectedPago) {
this.selectedPago = selectedPago;
}
public Double getCantidadAPagar() {
return cantidadAPagar;
}
public PagosPolizaController getPagosPolizaController() {
return pagosPolizaController;
}
public void setCantidadAPagar(Double cantidadAPagar) {
this.cantidadAPagar = cantidadAPagar;
}
public void setPagosPolizaController(PagosPolizaController pagosPolizaController) {
this.pagosPolizaController = pagosPolizaController;
}
public GenericValidationController getGenericController() {
return genericController;
}
public String getPagoSiguiente() {
return pagoSiguiente;
}
public void setGenericController(GenericValidationController genericController) {
this.genericController = genericController;
}
public void setPagoSiguiente(String pagoSiguiente) {
this.pagoSiguiente = pagoSiguiente;
}
public Boolean getPagoExitoso() {
return pagoExitoso;
}
public Double getCantidadAPagar() {
return cantidadAPagar;
}
public void setPagoExitoso(Boolean pagoExitoso) {
this.pagoExitoso = pagoExitoso;
}
public void setCantidadAPagar(Double cantidadAPagar) {
this.cantidadAPagar = cantidadAPagar;
}
public String getImagen() {
return imagen;
}
public GenericValidationController getGenericController() {
return genericController;
}
public void setImagen(String imagen) {
this.imagen = imagen;
}
public void setGenericController(GenericValidationController genericController) {
this.genericController = genericController;
}
public String getMetodoPago() {
return metodoPago;
}
public Boolean getPagoExitoso() {
return pagoExitoso;
}
public void setMetodoPago(String metodoPago) {
this.metodoPago = metodoPago;
}
public void setPagoExitoso(Boolean pagoExitoso) {
this.pagoExitoso = pagoExitoso;
}
public String getImagen() {
return imagen;
}
public void setImagen(String imagen) {
this.imagen = imagen;
}
public String getMetodoPago() {
return metodoPago;
}
public void setMetodoPago(String metodoPago) {
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,9 +187,71 @@
<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>
<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"
@ -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,33 +303,34 @@
<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>
</h:form>
<h:form id="formTicket">
<p:dialog header="Vista previa del ticket" widgetVar="printer" minHeight="40" width="350" showEffect="fade" id="printer">
<p:outputPanel id="pnlPrint" class="no-page-break scrollable-panel" rendered="#{pagosPolizasBean.pagoExitoso}">
<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>