Merge pull request #121 from Quantum-P3/feature/US-49
add reportes del administrador
This commit is contained in:
commit
d3c80b3de5
|
@ -43,7 +43,11 @@
|
||||||
{ "glob": "axios.min.js", "input": "./node_modules/axios/dist", "output": "swagger-ui" },
|
{ "glob": "axios.min.js", "input": "./node_modules/axios/dist", "output": "swagger-ui" },
|
||||||
{ "glob": "**/*", "input": "src/main/webapp/swagger-ui/", "output": "swagger-ui" }
|
{ "glob": "**/*", "input": "src/main/webapp/swagger-ui/", "output": "swagger-ui" }
|
||||||
],
|
],
|
||||||
"styles": ["src/main/webapp/content/scss/paper-dashboard.scss", "./node_modules/swiper/swiper-bundle.min.css"],
|
"styles": [
|
||||||
|
"src/main/webapp/content/scss/paper-dashboard.scss",
|
||||||
|
"./node_modules/swiper/swiper-bundle.min.css",
|
||||||
|
"node_modules/chartist/dist/chartist.css"
|
||||||
|
],
|
||||||
"scripts": [
|
"scripts": [
|
||||||
"./node_modules/jquery/dist/jquery.min.js",
|
"./node_modules/jquery/dist/jquery.min.js",
|
||||||
"src/main/webapp/content/js/jquery.bootstrap.wizard.min.js",
|
"src/main/webapp/content/js/jquery.bootstrap.wizard.min.js",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -86,9 +86,11 @@
|
||||||
"@types/gapi.auth2": "0.0.54",
|
"@types/gapi.auth2": "0.0.54",
|
||||||
"angularx-social-login": "^4.0.1",
|
"angularx-social-login": "^4.0.1",
|
||||||
"bootstrap": "4.6.0",
|
"bootstrap": "4.6.0",
|
||||||
|
"chartist": "^0.11.4",
|
||||||
"dayjs": "1.10.5",
|
"dayjs": "1.10.5",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"jw-angular-social-buttons": "^1.0.0",
|
"jw-angular-social-buttons": "^1.0.0",
|
||||||
|
"ng-chartist": "^5.0.0",
|
||||||
"ngx-infinite-scroll": "10.0.1",
|
"ngx-infinite-scroll": "10.0.1",
|
||||||
"ngx-paypal": "^8.0.0",
|
"ngx-paypal": "^8.0.0",
|
||||||
"ngx-sharebuttons": "^8.0.5",
|
"ngx-sharebuttons": "^8.0.5",
|
||||||
|
@ -109,6 +111,7 @@
|
||||||
"@angular/compiler-cli": "12.0.5",
|
"@angular/compiler-cli": "12.0.5",
|
||||||
"@angular/service-worker": "12.0.5",
|
"@angular/service-worker": "12.0.5",
|
||||||
"@types/bootstrap": "^5.0.17",
|
"@types/bootstrap": "^5.0.17",
|
||||||
|
"@types/chartist": "^0.11.1",
|
||||||
"@types/jest": "26.0.23",
|
"@types/jest": "26.0.23",
|
||||||
"@types/jquery": "^3.5.6",
|
"@types/jquery": "^3.5.6",
|
||||||
"@types/node": "15.12.2",
|
"@types/node": "15.12.2",
|
||||||
|
|
|
@ -32,10 +32,11 @@ import { FooterComponent } from './layouts/footer/footer.component';
|
||||||
import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component';
|
import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component';
|
||||||
import { ErrorComponent } from './layouts/error/error.component';
|
import { ErrorComponent } from './layouts/error/error.component';
|
||||||
import { SidebarComponent } from './layouts/sidebar/sidebar.component';
|
import { SidebarComponent } from './layouts/sidebar/sidebar.component';
|
||||||
|
import { PaginaPrincipalComponent } from './pagina-principal/pagina-principal.component';
|
||||||
|
import { ChartistModule } from 'ng-chartist';
|
||||||
import { ListarPlantillaTiendaModule } from './entities/tienda/listar-tienda-plantilla/listar-plantilla-tienda.module';
|
import { ListarPlantillaTiendaModule } from './entities/tienda/listar-tienda-plantilla/listar-plantilla-tienda.module';
|
||||||
import { PaypalDialogComponent } from './entities/tienda/paypal-dialog/paypal-dialog.component';
|
import { PaypalDialogComponent } from './entities/tienda/paypal-dialog/paypal-dialog.component';
|
||||||
import { NgxPayPalModule } from 'ngx-paypal';
|
import { NgxPayPalModule } from 'ngx-paypal';
|
||||||
|
|
||||||
import { ShareButtonsModule } from 'ngx-sharebuttons/buttons';
|
import { ShareButtonsModule } from 'ngx-sharebuttons/buttons';
|
||||||
import { ShareIconsModule } from 'ngx-sharebuttons/icons';
|
import { ShareIconsModule } from 'ngx-sharebuttons/icons';
|
||||||
|
|
||||||
|
@ -66,6 +67,7 @@ import { ShareIconsModule } from 'ngx-sharebuttons/icons';
|
||||||
useFactory: missingTranslationHandler,
|
useFactory: missingTranslationHandler,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
ChartistModule, // add ChartistModule to your imports
|
||||||
ShareButtonsModule,
|
ShareButtonsModule,
|
||||||
ShareIconsModule,
|
ShareIconsModule,
|
||||||
NgxPayPalModule,
|
NgxPayPalModule,
|
||||||
|
|
|
@ -1 +1,139 @@
|
||||||
<p>dashboard-admin works!</p>
|
<div class="content">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row justify-content-around">
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-5 w-25 px-1">
|
||||||
|
<div class="icon-big icon-success text-center">
|
||||||
|
<fa-icon [icon]="faWallet"></fa-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-7 w-50">
|
||||||
|
<div class="numbers">
|
||||||
|
<p class="ds-title">Ganancias por plantillas</p>
|
||||||
|
{{ gananciasTotales | currency: 'CR' }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<hr />
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-xs-5 w-25 px-1">
|
||||||
|
<div class="icon-big icon-users-active text-center">
|
||||||
|
<fa-icon [icon]="faUsers"></fa-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-7 w-75">
|
||||||
|
<div class="numbers">
|
||||||
|
<p class="ds-title">Cantidad usuarios activos</p>
|
||||||
|
{{ cantUsuarioActivos }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<hr />
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-xs-4 w-25 px-1">
|
||||||
|
<div class="icon-big icon-users-block text-center">
|
||||||
|
<fa-icon [icon]="faUsersSlash"></fa-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-5 w-75">
|
||||||
|
<div class="numbers">
|
||||||
|
<p class="ds-title">Cantidad usuarios bloqueados</p>
|
||||||
|
{{ cantUsuarioBloqueados }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<hr />
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-around por-categoria">
|
||||||
|
<div class="col-md-5">
|
||||||
|
<div class="grafico-encuestas-fecha">
|
||||||
|
<div class="card">
|
||||||
|
<h1 class="ds-title">Cantidad de encuestas publicadas por mes</h1>
|
||||||
|
|
||||||
|
<div class="ct-chart ct-chart-line"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="card encuestas-por-categoria">
|
||||||
|
<div class="card-header w-100">
|
||||||
|
<h4 class="ds-title">Cantidad de Encuestas Publicadas por Categoria</h4>
|
||||||
|
</div>
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table">
|
||||||
|
<tbody>
|
||||||
|
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
|
||||||
|
<td>{{ categoria.nombre }}</td>
|
||||||
|
|
||||||
|
<td class="text-right">
|
||||||
|
{{ encuestasPublicadasCategoria[i] }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="card encuestas-por-categoria">
|
||||||
|
<div class="card-header w-100">
|
||||||
|
<h4 class="ds-title">Cantidad de Encuestas Finalizadas por Categoria</h4>
|
||||||
|
</div>
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table">
|
||||||
|
<tbody>
|
||||||
|
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
|
||||||
|
<td>{{ categoria.nombre }}</td>
|
||||||
|
|
||||||
|
<td class="text-right">
|
||||||
|
{{ encuestasFinalzadasCategoria[i] }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
.ct-chart {
|
||||||
|
width: 600px;
|
||||||
|
height: 400px;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
.grafico-encuestas-fecha .card {
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card .icon-big {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-success {
|
||||||
|
color: #00b88d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-users-active {
|
||||||
|
color: #018adf;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-users-block {
|
||||||
|
color: #da1b2b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.encuestas-por-categoria .table-responsive {
|
||||||
|
height: 300px;
|
||||||
|
max-height: 300px;
|
||||||
|
overflow-x: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.por-categoria {
|
||||||
|
padding: 5% 0;
|
||||||
|
}
|
|
@ -1,12 +1,188 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
import { FacturaService } from '../../factura/service/factura.service';
|
||||||
|
import { UsuarioExtraService } from '../../usuario-extra/service/usuario-extra.service';
|
||||||
|
import { CategoriaService } from '../../categoria/service/categoria.service';
|
||||||
|
import { EncuestaService } from '../../encuesta/service/encuesta.service';
|
||||||
|
|
||||||
|
import { ICategoria } from '../../categoria/categoria.model';
|
||||||
|
import { IEncuesta } from '../../encuesta/encuesta.model';
|
||||||
|
import { finalize } from 'rxjs/operators';
|
||||||
|
|
||||||
|
import * as Chartist from 'chartist';
|
||||||
|
|
||||||
|
import { faWallet, faUsers, faUsersSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'jhi-dashboard-admin',
|
selector: 'jhi-dashboard-admin',
|
||||||
templateUrl: './dashboard-admin.component.html',
|
templateUrl: './dashboard-admin.component.html',
|
||||||
styleUrls: ['./dashboard-admin.component.scss'],
|
styleUrls: ['./dashboard-admin.component.scss'],
|
||||||
})
|
})
|
||||||
export class DashboardAdminComponent implements OnInit {
|
export class DashboardAdminComponent implements OnInit {
|
||||||
constructor() {}
|
cantUsuarioActivos: number | undefined = 0;
|
||||||
|
cantUsuarioBloqueados: number | undefined = 0;
|
||||||
|
encuestasPublicadasCategoria: number[] = [];
|
||||||
|
encuestasFinalzadasCategoria: number[] = [];
|
||||||
|
encuestasPublicadasMesAnno: number[] = [];
|
||||||
|
listaMesesAnnos: string[] = [];
|
||||||
|
gananciasTotales: number = 0;
|
||||||
|
categorias: ICategoria[] | undefined = [];
|
||||||
|
encuestas: IEncuesta[] | undefined = [];
|
||||||
|
faWallet = faWallet;
|
||||||
|
faUsers = faUsers;
|
||||||
|
faUsersSlash = faUsersSlash;
|
||||||
|
|
||||||
ngOnInit(): void {}
|
chartFechas = [];
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected facturaService: FacturaService,
|
||||||
|
protected usuarioExtraService: UsuarioExtraService,
|
||||||
|
protected encuestaService: EncuestaService,
|
||||||
|
protected categoriaService: CategoriaService
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.loadAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
trackId(_index: number, item: ICategoria): number {
|
||||||
|
return item.id!;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadAll() {
|
||||||
|
this.cargarGananciasTotales();
|
||||||
|
this.cargarCantidadUsuarios();
|
||||||
|
this.cargarEncuestas();
|
||||||
|
}
|
||||||
|
|
||||||
|
cargarGananciasTotales() {
|
||||||
|
this.facturaService.query().subscribe(
|
||||||
|
res => {
|
||||||
|
const tempFacturas = res.body;
|
||||||
|
tempFacturas?.forEach(f => {
|
||||||
|
if (f.costo != undefined) {
|
||||||
|
this.gananciasTotales += f.costo;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
() => {}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
cargarCantidadUsuarios() {
|
||||||
|
this.usuarioExtraService.query().subscribe(res => {
|
||||||
|
const tmpUsuarios = res.body;
|
||||||
|
this.cantUsuarioActivos = tmpUsuarios?.filter(u => u.estado === 'ACTIVE').length;
|
||||||
|
this.cantUsuarioBloqueados = tmpUsuarios?.filter(u => u.estado === 'SUSPENDED').length;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
cargarEncuestas() {
|
||||||
|
this.encuestaService
|
||||||
|
.query()
|
||||||
|
.pipe(finalize(() => this.cargarCategorias()))
|
||||||
|
.subscribe(res => {
|
||||||
|
const tmpEncuestas = res.body;
|
||||||
|
this.encuestas = tmpEncuestas?.filter(e => e.estado === 'ACTIVE' || e.estado === 'FINISHED');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
cargarCategorias() {
|
||||||
|
this.categoriaService
|
||||||
|
.query()
|
||||||
|
.pipe(finalize(() => this.acomodarMesesYAnnos()))
|
||||||
|
.subscribe(res => {
|
||||||
|
const tmpCategorias = res.body;
|
||||||
|
this.categorias = tmpCategorias?.filter(c => c.estado === 'ACTIVE');
|
||||||
|
let cantPublicadas = 0;
|
||||||
|
let cantFinalizadas = 0;
|
||||||
|
const publicadas: number[] | null = [];
|
||||||
|
const finalizadas: number[] | null = [];
|
||||||
|
this.categorias?.forEach(c => {
|
||||||
|
this.encuestas?.forEach(e => {
|
||||||
|
if (e.categoria?.id === c.id && e.estado === 'ACTIVE') {
|
||||||
|
cantPublicadas = cantPublicadas + 1;
|
||||||
|
}
|
||||||
|
if (e.categoria?.id === c.id && e.estado === 'FINISHED') {
|
||||||
|
cantFinalizadas = cantFinalizadas + 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
publicadas.push(cantPublicadas);
|
||||||
|
finalizadas.push(cantFinalizadas);
|
||||||
|
});
|
||||||
|
this.encuestasPublicadasCategoria = publicadas;
|
||||||
|
this.encuestasFinalzadasCategoria = finalizadas;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
acomodarMesesYAnnos() {
|
||||||
|
const fechas: string[] | null = [];
|
||||||
|
const cantEncuestasFechas: number[] | null = [];
|
||||||
|
var encuestasPublicadas = this.encuestas?.filter(e => e.estado === 'ACTIVE');
|
||||||
|
if (encuestasPublicadas) {
|
||||||
|
encuestasPublicadas = this.ordenarFechas(encuestasPublicadas);
|
||||||
|
encuestasPublicadas.forEach(e => {
|
||||||
|
if (e.fechaPublicacion) {
|
||||||
|
let fecha = this.formatoFecha(e.fechaPublicacion);
|
||||||
|
if (!fechas.includes(fecha)) {
|
||||||
|
fechas.push(fecha);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.listaMesesAnnos = fechas;
|
||||||
|
|
||||||
|
this.listaMesesAnnos.forEach(f => {
|
||||||
|
let contEncuestaDeFecha = 0;
|
||||||
|
if (encuestasPublicadas) {
|
||||||
|
encuestasPublicadas.forEach(e => {
|
||||||
|
if (e.fechaPublicacion) {
|
||||||
|
let fecha = this.formatoFecha(e.fechaPublicacion);
|
||||||
|
if (f === fecha) {
|
||||||
|
contEncuestaDeFecha++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cantEncuestasFechas.push(contEncuestaDeFecha);
|
||||||
|
});
|
||||||
|
this.encuestasPublicadasMesAnno = cantEncuestasFechas;
|
||||||
|
}
|
||||||
|
this.llenarGraficoEncuestasXFechas();
|
||||||
|
}
|
||||||
|
|
||||||
|
llenarGraficoEncuestasXFechas() {
|
||||||
|
if (this.listaMesesAnnos && this.encuestasPublicadasMesAnno) {
|
||||||
|
var data = {
|
||||||
|
// A labels array that can contain any sort of values
|
||||||
|
labels: this.listaMesesAnnos,
|
||||||
|
// Our series array that contains series objects or in this case series data arrays
|
||||||
|
series: [this.encuestasPublicadasMesAnno],
|
||||||
|
};
|
||||||
|
var options = {
|
||||||
|
low: 0,
|
||||||
|
showArea: true,
|
||||||
|
showLabel: true,
|
||||||
|
axisY: {
|
||||||
|
onlyInteger: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
new Chartist.Line('.ct-chart', data, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
formatoFecha(fecha: any): string {
|
||||||
|
return fecha.month() + 1 + '/' + fecha.year();
|
||||||
|
}
|
||||||
|
|
||||||
|
ordenarFechas(encuestasPublicadas: IEncuesta[]): IEncuesta[] {
|
||||||
|
if (encuestasPublicadas) {
|
||||||
|
encuestasPublicadas.sort((e1, e2) => {
|
||||||
|
if (e1.fechaPublicacion && e2.fechaPublicacion) {
|
||||||
|
return e1.fechaPublicacion < e2.fechaPublicacion ? -1 : e1.fechaPublicacion > e2.fechaPublicacion ? 1 : 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return encuestasPublicadas;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue