From 401eaee2e34cf6965aca7097810862417f40c347 Mon Sep 17 00:00:00 2001 From: "Brayan.Gonzalez" Date: Tue, 18 Mar 2025 14:55:25 -0700 Subject: [PATCH] -taegeta de pagos --- .../controller/admin/CustomerController.java | 197 ++++---- .../web/beans/dashboard/DashboardBean.java | 431 ++++++++++++++++++ apc-web/src/main/webapp/dashboard.xhtml | 19 + 3 files changed, 549 insertions(+), 98 deletions(-) diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java index 69ee707..147a365 100644 --- a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.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.apc.controller.admin; @@ -15,6 +15,7 @@ import com.arrebol.apc.model.core.User; import com.arrebol.apc.model.core.constance.LoanCfg; import com.arrebol.apc.model.enums.ActiveStatus; import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.views.CustomerView; import com.arrebol.apc.model.views.LoanDetailZeroView; import com.arrebol.apc.model.views.LoanFinishedView; import com.arrebol.apc.repository.GenericEntityRepository; @@ -31,111 +32,111 @@ import org.hibernate.Transaction; * * @author Oscar Armando Vargas Cardenas */ -public class CustomerController extends PeopleController implements Serializable{ - - /** - * - * Searching all customers. - * - * @param officeId - * @return - */ - public List fillCustomersDatatable(String officeId) { - logger.debug("fillCustomersDatatable"); - List parameters = new ArrayList<>(); +public class CustomerController extends PeopleController implements Serializable { - parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + public CustomerView findCustomerViewByPeopleId(String peopleId) { + logger.debug("findCustomerViewByPeopleId"); + return (CustomerView) genericEntityRepository.selectAPCEntityById(CustomerView.class, peopleId); + } - return genericEntityRepository.xmlQueryAPCEntities(People.class, PeopleCfg.QUERY_FIND_ALL_CUSTOMER, parameters); - } - - /** - * - * Searching all loan by customer. - * - * @param peopleId - * @return - */ - public List findLoanByCustomer(String peopleId) { - logger.debug("findLoanByCustomer"); - List parameters = new ArrayList<>(); + /** + * + * Searching all customers. + * + * @param officeId + * @return + */ + public List fillCustomersDatatable(String officeId) { + logger.debug("fillCustomersDatatable"); + List parameters = new ArrayList<>(); - parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER, new People(peopleId))); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); - return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_BY_CUSTOMER, parameters); - } - - public List findLoanByCustomerLimit(String peopleId) { - logger.debug("findLoanByCustomer"); - List results = new ArrayList<>(); - - Transaction transaction = null; - - try { - Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + return genericEntityRepository.xmlQueryAPCEntities(People.class, PeopleCfg.QUERY_FIND_ALL_CUSTOMER, parameters); + } - transaction = session.beginTransaction(); - - + /** + * + * Searching all loan by customer. + * + * @param peopleId + * @return + */ + public List findLoanByCustomer(String peopleId) { + logger.debug("findLoanByCustomer"); + List parameters = new ArrayList<>(); - results = session.createQuery("SELECT l FROM Loan l WHERE customer = :customer AND loanStatus != 'DELETED' ORDER BY createdOn DESC") - .setParameter("customer", peopleId) - .setMaxResults(2) - .getResultList(); + parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER, new People(peopleId))); - transaction.commit(); + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_BY_CUSTOMER, parameters); + } - logger.info("Closing daily detail's list " + results.size()); - } catch (HibernateException e) { - logger.error("Can not find closing daily details list", e); - rollback(transaction); - } catch (Exception e) { - logger.error("Method findDetailsFromClosingDayID()", e); - rollback(transaction); - } - + public List findLoanByCustomerLimit(String peopleId) { + logger.debug("findLoanByCustomer"); + List results = new ArrayList<>(); - + Transaction transaction = null; - return results; - } - - /** - * - * Searching all loan for juridical. - * - * @param idUser - * @return - */ - public List findLoanJuridical(String idUser) { - logger.debug("findLoanJuridical"); - List parameters = new ArrayList<>(); - parameters.add(new ModelParameter(LoanCfg.FIELD_USER, new User(idUser))); - return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_JURIDICAL, parameters); - } - - public List findLoanZero( ) { - logger.debug("findLoanZero"); - List parameters = new ArrayList<>(); - return genericEntityRepository.xmlQueryAPCEntities(LoanDetailZeroView.class, LoanCfg.QUERY_FIND_LOAN_ZERO, parameters); - } - - public List findLoanFinished( ) { - logger.debug("findLoanFinished"); - List parameters = new ArrayList<>(); - return genericEntityRepository.xmlQueryAPCEntities(LoanFinishedView.class, LoanCfg.QUERY_FIND_LOAN_FINISHED, parameters); - } - - final Logger logger = LogManager.getLogger(CustomerController.class); - private final GenericEntityRepository genericEntityRepository; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); - public CustomerController() { - this.genericEntityRepository = new GenericEntityRepository(); - } - - protected void rollback(Transaction transaction) { - if (null != transaction) { - transaction.rollback(); - } - } + transaction = session.beginTransaction(); + + results = session.createQuery("SELECT l FROM Loan l WHERE customer = :customer AND loanStatus != 'DELETED' ORDER BY createdOn DESC") + .setParameter("customer", peopleId) + .setMaxResults(2) + .getResultList(); + + transaction.commit(); + + logger.info("Closing daily detail's list " + results.size()); + } catch (HibernateException e) { + logger.error("Can not find closing daily details list", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method findDetailsFromClosingDayID()", e); + rollback(transaction); + } + + return results; + } + + /** + * + * Searching all loan for juridical. + * + * @param idUser + * @return + */ + public List findLoanJuridical(String idUser) { + logger.debug("findLoanJuridical"); + List parameters = new ArrayList<>(); + parameters.add(new ModelParameter(LoanCfg.FIELD_USER, new User(idUser))); + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_JURIDICAL, parameters); + } + + public List findLoanZero() { + logger.debug("findLoanZero"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(LoanDetailZeroView.class, LoanCfg.QUERY_FIND_LOAN_ZERO, parameters); + } + + public List findLoanFinished() { + logger.debug("findLoanFinished"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(LoanFinishedView.class, LoanCfg.QUERY_FIND_LOAN_FINISHED, parameters); + } + + final Logger logger = LogManager.getLogger(CustomerController.class); + private final GenericEntityRepository genericEntityRepository; + + public CustomerController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + protected void rollback(Transaction transaction) { + if (null != transaction) { + transaction.rollback(); + } + } } diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java index 4821d3d..1b5f77d 100644 --- a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java @@ -14,6 +14,7 @@ import com.arrebol.apc.controller.admin.ClosingDayController; import com.arrebol.apc.controller.admin.CustomerController; import com.arrebol.apc.controller.admin.EndorsementController; import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.admin.PeopleController; import com.arrebol.apc.controller.catalog.LoanTypeController; import com.arrebol.apc.controller.catalog.RouteController; import com.arrebol.apc.controller.dashboard.CustomerWithoutRenovationViewService; @@ -41,6 +42,7 @@ import com.arrebol.apc.model.payroll.TotalExpectedPaymentDailyByUser; import com.arrebol.apc.model.system.logs.Bitacora; import com.arrebol.apc.model.views.AdvanceUserDailyDetail; import com.arrebol.apc.model.views.AdvanceUserDailyView; +import com.arrebol.apc.model.views.CustomerView; import com.arrebol.apc.model.views.CustomerWithoutRenovationView; import com.arrebol.apc.model.views.LoanDetailZeroView; import com.arrebol.apc.model.views.LoanFinishedView; @@ -53,6 +55,8 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -370,6 +374,413 @@ public class DashboardBean extends GenericBean implements Serializable { showMessage(FacesMessage.SEVERITY_INFO, "Cambio de bono", "La venta empezó a contar como bono de cliente nuevo."); } + public void cargarBoletaPagos() { + CustomerView clienteViewBoleta = customerCtrl.findCustomerViewByPeopleId(selectedLoan.getCustomer().getId()); + People clienteBoleta = peopleCtrl.findPeopleById(selectedLoan.getCustomer().getId()); + String pagos = ""; + for (int i = 0; i < 50; i++) { + pagos = pagos + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " "; + } + + String html = " \n" + + "\n" + + "\n" + + "
\n" + + "

" + clienteBoleta.getContrato() + " - " + clienteViewBoleta.getRouteName() + "

\n" + + "

CLIENTE

\n" + + "\n" + + "
\n" + + "

Datos del Cliente

\n" + + "
\n" + + "
Dirección completa:
\n" + + "
" + clienteBoleta.getAddressHome() + "
\n" + + "
\n" + + "
\n" + + "
Colonia/Municipio:
\n" + + "
" + clienteBoleta.getPersonalColonia() + "
\n" + + "
\n" + + "
\n" + + "
Entre calles:
\n" + + "
" + clienteBoleta.getPersonalCruzamientos() + "
\n" + + "
\n" + + "
\n" + + "
Teléfono/Celular:
\n" + + "
" + clienteBoleta.getPersonalCelular() + "
\n" + + "
\n" + + "
\n" + + "
Ciudad:
\n" + + "
" + clienteBoleta.getPersonalCiudad() + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Características del Domicilio

\n" + + "
\n" + + "
Fachada:
\n" + + "
" + clienteBoleta.getFachadaDecisionFachada() + "
\n" + + "
\n" + + "
\n" + + "
PUERTA:
\n" + + "
" + clienteBoleta.getFachadaDescripcionPuerta() + "
\n" + + "
VENTANA:
\n" + + "
" + clienteBoleta.getFachadaDescripcionVentanas() + "
\n" + + "
\n" + + "
\n" + + "
FRENTE A NÚM:
\n" + + "
" + clienteBoleta.getFachadaFrenteNumero() + "
\n" + + "
ENTRE NÚM:
\n" + + "
" + clienteBoleta.getFachadaEntreNumero1() + "
\n" + + "
Y NÚM:
\n" + + "
" + clienteBoleta.getFachadaEntreNumero2() + "
\n" + + "
\n" + + "
\n" + + "
Señas especiales:
\n" + + "
" + clienteBoleta.getFachadaSenasVivienda() + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

TRABAJO

\n" + + "
\n" + + "
Trabajo:
\n" + + "
" + clienteBoleta.getTrabajo() + "
\n" + + "
\n" + + "
\n" + + "
Domicilio:
\n" + + "
" + clienteBoleta.getTrabajoDomicilio() + "
\n" + + "
\n" + + "
\n" + + "
ENTRE:
\n" + + "
" + clienteBoleta.getTrabajoCruzamientos() + "
\n" + + "
CD:
\n" + + "
" + clienteBoleta.getTrabajoCiudad() + "
\n" + + "
\n" + + "
\n" + + "
COL:
\n" + + "
" + clienteBoleta.getTrabajoColonia() + "
\n" + + "
\n" + + "
\n" + + "
TEL.1:
\n" + + "
" + clienteBoleta.getTrabajoTelefono1() + "
\n" + + "
EXT:
\n" + + "
" + clienteBoleta.getTrabajoTelefonoExtra1() + "
\n" + + "
TEL.2:
\n" + + "
" + clienteBoleta.getTrabajoTelefono2() + "
\n" + + "
EXT:
\n" + + "
" + clienteBoleta.getTrabajoTelefonoExtra2() + "
\n" + + "
\n" + + "
\n" + + "
TURNO:
\n" + + "
" + clienteBoleta.getTrabajoTurno() + "
\n" + + "
DEPARTAMENTO:
\n" + + "
" + clienteBoleta.getTrabajoDepartamento() + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Avales

\n" + + "
\n" + + "
\n" + + "
Aval:
\n" + + "
" + selectedLoan.getEndorsement().getFullName() + "
\n" + + "
\n" + + "
\n" + + "
DOM:
\n" + + "
" + selectedLoan.getEndorsement().getAddressHome() + "
\n" + + "
COL:
\n" + + "
D" + selectedLoan.getEndorsement().getPersonalColonia() + "ATO
\n" + + "
\n" + + "
\n" + + "
CRUZA:
\n" + + "
" + selectedLoan.getEndorsement().getPersonalCruzamientos() + "
\n" + + "
CD:
\n" + + "
" + selectedLoan.getEndorsement().getPersonalCiudad() + "
\n" + + "
\n" + + "
\n" + + "
TEL:
\n" + + "
" + selectedLoan.getEndorsement().getPersonalCelular() + "
\n" + + "
TEL. TRA:
\n" + + "
" + selectedLoan.getEndorsement().getTrabajoTelefono1() + "
\n" + + "
EXT:
\n" + + "
" + selectedLoan.getEndorsement().getTrabajoTelefonoExtra1() + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Referencias

\n" + + "
\n" + + "

Referencia 1

\n" + + "
\n" + + "
Nombre:
\n" + + "
" + clienteBoleta.getReferencia1Nombre() + "
\n" + + "
PARENTESCO:
\n" + + "
" + clienteBoleta.getReferencia1Parentesco() + "
\n" + + "
\n" + + "
\n" + + "
DOM:
\n" + + "
" + clienteBoleta.getReferencia1Domicilio() + "
\n" + + "
COL:
\n" + + "
" + clienteBoleta.getReferencia1Colonia() + "
\n" + + "
\n" + + "
\n" + + "
CRUZA:
\n" + + "
" + clienteBoleta.getReferencia1Cruzamientos() + "
\n" + + "
CD:
\n" + + "
" + clienteBoleta.getReferencia1Ciudad() + "
\n" + + "
\n" + + "
\n" + + "
TEL:
\n" + + "
" + clienteBoleta.getReferencia1TelefonoParticular() + "
\n" + + "
CEL:
\n" + + "
" + clienteBoleta.getReferencia1CelularParticular() + "
\n" + + "
TEL. TRA:
\n" + + "
" + clienteBoleta.getReferencia1TelefonoTrabajo() + "
\n" + + "
EXT:
\n" + + "
" + clienteBoleta.getReferencia1ExtraTelefonoTrabajo() + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Referencia 2

\n" + + "
\n" + + "
Nombre:
\n" + + "
" + clienteBoleta.getReferencia2Nombre() + "
\n" + + "
PARENTESCO:
\n" + + "
" + clienteBoleta.getReferencia2Parentesco() + "
\n" + + "
\n" + + "
\n" + + "
DOM:
\n" + + "
" + clienteBoleta.getReferencia2Domicilio() + "
\n" + + "
COL:
\n" + + "
" + clienteBoleta.getReferencia2Colonia() + "
\n" + + "
\n" + + "
\n" + + "
CRUZA:
\n" + + "
" + clienteBoleta.getReferencia2Cruzamientos() + "
\n" + + "
CD:
\n" + + "
" + clienteBoleta.getReferencia2Ciudad() + "
\n" + + "
\n" + + "
\n" + + "
TEL:
\n" + + "
" + clienteBoleta.getReferencia2TelefonoParticular() + "
\n" + + "
CEL:
\n" + + "
" + clienteBoleta.getReferencia2CelularParticular() + "
\n" + + "
TEL. TRA:
\n" + + "
" + clienteBoleta.getReferencia2TelefonoTrabajo() + "
\n" + + "
EXT:
\n" + + "
" + clienteBoleta.getReferencia2ExtraTelefonoTrabajo() + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Datos del Crédito

\n" + + "
\n" + + "
COBRAR EN:
\n" + + "
" + clienteBoleta.getDatosCreditoCobrarEn() + "
\n" + + "
ENTREGADO EN:
\n" + + "
" + clienteBoleta.getDatosCreditoEntradaEn() + "
\n" + + "
\n" + + "
\n" + + "
Fecha de compra:
\n" + + "
" + formatDate(clienteBoleta.getDatosCreditoFechaCompra()) + "
\n" + + "
Primer pago:
\n" + + "
" + formatDate(clienteBoleta.getDatosCreditoPrimerPago()) + "
\n" + + "
Vence:
\n" + + "
" + calcularUltimoPago(clienteBoleta.getDatosCreditoPrimerPago(), clienteBoleta.getDatosCreditoNumeroPagos() == null ? 0 : clienteBoleta.getDatosCreditoNumeroPagos(), clienteBoleta.getDatosCreditoFormaPago() == null ? null : clienteBoleta.getDatosCreditoFormaPago().toString()) + "
\n" + + "
\n" + + "
\n" + + "
Vendedor:
\n" + + "
" + clienteBoleta.getDatosCreditoVendedor() + "
\n" + + "
Forma de pago:
\n" + + "
" + clienteBoleta.getDatosCreditoFormaPago() + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
Investigación crediticia:
\n" + + "
\n" + + "
Monto por pago:
\n" + + "
" + selectedLoan.getLoanType().getPaymentDaily() + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Observación de pago:

\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "\n" + + "

Compra

\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
CantArtículoPrecioImporte
1" + selectedLoan.getLoanType().getLoanTypeName() + "" + selectedLoan.getLoanType().getPayment() + "" + selectedLoan.getLoanType().getPayment() + "
\n" + + "\n" + + "
\n" + + "
Total de la compra:
\n" + + "
" + selectedLoan.getLoanType().getPaymentTotal() + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

Apuntes del Cobrador

\n" + + " \n" + + "
\n" + + "\n" + + "
\n" + + "

PAGOS

\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + pagos + + "
FECHAFOLIOCONCEPTOCARGOSABONOSSALDO
\n" + + "
" + + "
"; + + html = html.replaceAll("\\bnull\\b", " "); + setPlantillaHTML(html); + } + + public static String formatDate(Date date) { + if (date == null) { + return null; // Evita NullPointerException + } + SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); // Puedes cambiar el formato + return formatter.format(date); + } + + public void main(String[] args) { + Date today = new Date(); + System.out.println("Fecha formateada: " + formatDate(today)); + } + + public static String calcularUltimoPago(Date fechaInicio, int numeroPagos, String periodoPago) { + if (fechaInicio == null || numeroPagos <= 0 || periodoPago == null) { + return "NA"; + } + LocalDate fechaInicioLocal = fechaInicio.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + int diasAIncrementar; + switch (periodoPago.toUpperCase()) { + case "SEMANAL": + diasAIncrementar = 7; + break; + case "QUINCENAL": + diasAIncrementar = 15; + break; + case "MENSUAL": + LocalDate fechaUltimoPagoMes = fechaInicioLocal.plusMonths(numeroPagos - 1); + return formatDate(fechaUltimoPagoMes); + default: + throw new IllegalArgumentException("Periodo de pago no válido"); + } + LocalDate fechaUltimoPago = fechaInicioLocal.plusDays(diasAIncrementar * (numeroPagos - 1)); + return formatDate(fechaUltimoPago); + } + + private static String formatDate(LocalDate date) { + SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); + return formatter.format(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant())); + } + public void removeBonusNewCustomer() { loanCtrl.updateBonusNewCustomer(ActiveStatus.DISABLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); loan.clear(); @@ -1264,6 +1675,22 @@ public class DashboardBean extends GenericBean implements Serializable { this.lastStableSmallBox = lastStableSmallBox; } + public String getPlantillaHTML() { + return plantillaHTML; + } + + public void setPlantillaHTML(String plantillaHTML) { + this.plantillaHTML = plantillaHTML; + } + + public PeopleController getPeopleCtrl() { + return peopleCtrl; + } + + public void setPeopleCtrl(PeopleController peopleCtrl) { + this.peopleCtrl = peopleCtrl; + } + @Inject private CustomerWithoutRenovationViewService customerWithoutRenovationViewService; @@ -1276,6 +1703,7 @@ public class DashboardBean extends GenericBean implements Serializable { private LoanTypeController loanTypeCtrl; private RouteController routeCtrl; private BitacoraController bitacoraCtrl; + private PeopleController peopleCtrl; private BigDecimal totalAmountDaily; private BigDecimal totalTransferSenderDaily; @@ -1341,6 +1769,8 @@ public class DashboardBean extends GenericBean implements Serializable { private Date lastStableSmallBox; private boolean stableSmallBoxToday; + private String plantillaHTML; + @Inject private CustomerService customerService; @@ -1357,6 +1787,7 @@ public class DashboardBean extends GenericBean implements Serializable { loanTypeCtrl = new LoanTypeController(); routeCtrl = new RouteController(); bitacoraCtrl = new BitacoraController(); + peopleCtrl = new PeopleController(); commentsBitacora = ""; setGenericValidateController(new GenericValidationController()); setLastStableSmallBox(getGenericValidateController().lastStableSmallBoxByDate(getLoggedUser().getUser())); diff --git a/apc-web/src/main/webapp/dashboard.xhtml b/apc-web/src/main/webapp/dashboard.xhtml index 1b2a9a2..fe2d6c6 100644 --- a/apc-web/src/main/webapp/dashboard.xhtml +++ b/apc-web/src/main/webapp/dashboard.xhtml @@ -121,6 +121,7 @@ + @@ -439,6 +440,24 @@ + + + + + + + + + + + + + + + + + +