Commit fd60509b5dc274e4d6b29298e5a2afaad0248bb5

Authored by Eric Fernandez
1 parent f1d2da7f17

paginación comprobantes

src/app/app.module.ts
1 import { BrowserModule } from '@angular/platform-browser'; 1 import { BrowserModule } from '@angular/platform-browser';
2 import { NgModule } from '@angular/core'; 2 import { NgModule } from '@angular/core';
3 import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; 3 import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
4 import { HttpClientModule } from '@angular/common/http'; 4 import { HttpClientModule } from '@angular/common/http';
5 import { FormsModule } from '@angular/forms'; 5 import { FormsModule } from '@angular/forms';
6 import { LaddaModule } from 'angular2-ladda'; 6 import { LaddaModule } from 'angular2-ladda';
7 7
8 import { AppRoutingModule } from './app-routing.module'; 8 import { AppRoutingModule } from './app-routing.module';
9 import { AppComponent } from './app.component'; 9 import { AppComponent } from './app.component';
10 import { AppBotonera } from './botonera/botonera.component'; 10 import { AppBotonera } from './botonera/botonera.component';
11 import { ComprobantesComponent } from './comprobantes/comprobantes.component'; 11 import { ComprobantesComponent } from './comprobantes/comprobantes.component';
12 import { NombreEmpresaComponent } from './nombre-empresa/nombre-empresa.component'; 12 import { NombreEmpresaComponent } from './nombre-empresa/nombre-empresa.component';
13 import { AccionesComponent } from './acciones/acciones.component'; 13 import { AccionesComponent } from './acciones/acciones.component';
14 import { LoginComponent } from './login/login.component'; 14 import { LoginComponent } from './login/login.component';
15 import { BusquedaComprobanteComponent } from './busqueda-comprobante/busqueda-comprobante.component'; 15 import { BusquedaComprobanteComponent } from './busqueda-comprobante/busqueda-comprobante.component';
16 16
17 @NgModule({ 17 @NgModule({
18 declarations: [ 18 declarations: [
19 AppComponent, 19 AppComponent,
20 AppBotonera, 20 AppBotonera,
21 ComprobantesComponent, 21 ComprobantesComponent,
22 NombreEmpresaComponent, 22 NombreEmpresaComponent,
23 AccionesComponent, 23 AccionesComponent,
24 LoginComponent, 24 LoginComponent,
25 BusquedaComprobanteComponent 25 BusquedaComprobanteComponent
26 ], 26 ],
27 imports: [ 27 imports: [
28 BrowserModule, 28 BrowserModule,
29 AppRoutingModule, 29 AppRoutingModule,
30 NgbModule, 30 NgbModule,
31 HttpClientModule, 31 HttpClientModule,
32 FormsModule, 32 FormsModule,
33 LaddaModule 33 LaddaModule
34 ], 34 ],
35 entryComponents:[BusquedaComprobanteComponent],
35 providers: [], 36 providers: [],
36 bootstrap: [AppComponent] 37 bootstrap: [AppComponent]
37 }) 38 })
38 export class AppModule { } 39 export class AppModule { }
39 40
src/app/comprobantes/comprobantes.component.html
1 <div class="row panel-informativo"> 1 <div class="row panel-informativo">
2 <div class="col-12"> 2 <div class="col-12">
3 <div class="row titulares"> 3 <div class="row titulares">
4 <div class="col-12 col-sm numero-pedido text-center text-md-left border border-white align-middle ng-binding ng-scope"> 4 <div class="col-12 col-sm numero-pedido text-center text-md-left border border-white align-middle ng-binding ng-scope">
5 Recepción 5 Recepción
6 <button 6 <button
7 class="btn btn-xs btn-outline-light float-right" 7 class="btn btn-xs btn-outline-light float-right"
8 type="button" 8 type="button"
9 ng-click="$ctrl.busqueda()" 9 (click)="busquedaComprobantes()"
10 ng-if="$ctrl.busqueda"
11 title="Buscar" 10 title="Buscar"
12 > 11 >
13 <i class="fa fa-search"></i> 12 <i class="fa fa-search"></i>
14 </button> 13 </button>
15 </div> 14 </div>
16 <div class="col-7 col-sm border border-white align-middle"> 15 <div class="col-7 col-sm border border-white align-middle">
17 Fecha: 16 Fecha:
18 <span 17 <span
19 ng-click="datepickerAbierto = true" 18 ng-click="datepickerAbierto = true"
20 >&nbsp;{{ fecha | date: 'dd/MM/yyyy' }}</span> 19 >&nbsp;{{ fecha | date: 'dd/MM/yyyy' }}</span>
21 </div> 20 </div>
22 <div class="col-5 col-sm border border-white border-right-0 align-middle"> 21 <div class="col-5 col-sm border border-white border-right-0 align-middle">
23 Hora: 22 Hora:
24 <span 23 <span
25 ng-click="datepickerAbierto = true" 24 ng-click="datepickerAbierto = true"
26 >&nbsp;{{ fecha | date: 'shortTime'}}</span> 25 >&nbsp;{{ fecha | date: 'shortTime'}}</span>
27 </div> 26 </div>
28 </div> 27 </div>
29 </div> 28 </div>
30 </div> 29 </div>
31 <div class="row"> 30 <div class="row">
32 <form class="col-12 col-sm-10"> 31 <form class="col-12 col-sm-10">
33 <div class="row border"> 32 <div class="row border">
34 <div class="col-6 col-sm-3 d-flex"> 33 <div class="col-6 col-sm-3 d-flex">
35 <strong>Letra Factura:&nbsp;</strong> 34 <strong>Letra Factura:&nbsp;</strong>
36 <label>{{cabecera.TIP}}</label> 35 <label>{{cabecera.TIP}}</label>
37 </div> 36 </div>
38 <div class="col-6 col-sm-3 d-flex"> 37 <div class="col-6 col-sm-3 d-flex">
39 <strong>Tipo Factura:&nbsp;</strong> 38 <strong>Tipo Factura:&nbsp;</strong>
40 <label>{{cabecera.TCO}}</label> 39 <label>{{cabecera.TCO}}</label>
41 </div> 40 </div>
42 <div class="col-6 col-sm-3 d-flex"> 41 <div class="col-6 col-sm-3 d-flex">
43 <strong>Sucursal:&nbsp;</strong> 42 <strong>Sucursal:&nbsp;</strong>
44 <label>{{cabecera.SUC}}</label> 43 <label>{{cabecera.SUC}}</label>
45 </div> 44 </div>
46 <div class="col-6 col-sm-3 d-flex"> 45 <div class="col-6 col-sm-3 d-flex">
47 <strong>Número:&nbsp;</strong> 46 <strong>Número:&nbsp;</strong>
48 <label>{{cabecera.NCO}}</label> 47 <label>{{cabecera.NCO}}</label>
49 </div> 48 </div>
50 <div class="col-6 col-sm-3 d-flex"> 49 <div class="col-6 col-sm-3 d-flex">
51 <strong>Cuit:&nbsp;</strong> 50 <strong>Cuit:&nbsp;</strong>
52 <label>{{cabecera.CUI}}</label> 51 <label>{{cabecera.CUI}}</label>
53 </div> 52 </div>
54 <div class="col-12 col-sm-3 d-flex"> 53 <div class="col-12 col-sm-6 d-flex">
55 <strong>Nombre:&nbsp;</strong> 54 <strong>Nombre:&nbsp;</strong>
56 <label>{{cabecera.NOM}}</label> 55 <label>{{cabecera.NOM}}</label>
57 </div> 56 </div>
58 </div> 57 </div>
59 <div class="row border"> 58 <div class="row border pr-2">
60 <div class="col-4"> 59 <div class="col-4">
61 <button 60 <button
62 type="button" 61 type="button"
63 class="btn btn-outline-secondary btn-sm" 62 class="btn btn-outline-secondary btn-sm"
64 [ngClass]="{'active': estadoArticulos == 'pendiente'}" 63 [ngClass]="{'active': estadoArticulos == 'pendiente'}"
65 (click)="estadoArticulos = 'pendiente'; paginaActiva = 1; filter = '';"> 64 (click)="estadoArticulos = 'pendiente'; paginaActiva = 1; filter = '';">
66 Pendientes&nbsp;({{getCantidadArticulosByEstado('pendiente')}}) 65 Pendientes&nbsp;({{getCantidadArticulosByEstado('pendiente')}})
67 </button> 66 </button>
68 </div> 67 </div>
69 <div class="col-4"> 68 <div class="col-4">
70 <button 69 <button
71 type="button" 70 type="button"
72 class="btn btn-outline-success btn-sm" 71 class="btn btn-outline-success btn-sm"
73 [ngClass]="{'active': estadoArticulos == 'aprobado'}" 72 [ngClass]="{'active': estadoArticulos == 'aprobado'}"
74 (click)="estadoArticulos = 'aprobado'; paginaActiva = 1; filter = '';"> 73 (click)="estadoArticulos = 'aprobado'; paginaActiva = 1; filter = '';">
75 Aprobados&nbsp;({{getCantidadArticulosByEstado('aprobado')}}) 74 Aprobados&nbsp;({{getCantidadArticulosByEstado('aprobado')}})
76 </button> 75 </button>
77 </div> 76 </div>
78 <div class="col-4"> 77 <div class="col-4">
79 <button 78 <button
80 type="button" 79 type="button"
81 class="btn btn-outline-danger btn-sm" 80 class="btn btn-outline-danger btn-sm"
82 [ngClass]="{'active': estadoArticulos == 'rechazado'}" 81 [ngClass]="{'active': estadoArticulos == 'rechazado'}"
83 (click)="estadoArticulos = 'rechazado'; paginaActiva = 1; filter = '';"> 82 (click)="estadoArticulos = 'rechazado'; paginaActiva = 1; filter = '';">
84 Rechazados&nbsp;({{getCantidadArticulosByEstado('rechazado')}}) 83 Rechazados&nbsp;({{getCantidadArticulosByEstado('rechazado')}})
85 </button> 84 </button>
86 </div> 85 </div>
87 </div> 86 </div>
88 <div class="row"> 87 <div class="row">
89 <input 88 <input
90 type="text" 89 type="text"
91 class="form-control-sm col-12" 90 class="form-control-sm col-12"
92 placeholder="Busque producto por nombre, codigo" 91 placeholder="Busque producto por nombre, codigo"
93 [(ngModel)]="filter" 92 [(ngModel)]="filter"
94 [ngModelOptions]="{standalone: true}"/> 93 [ngModelOptions]="{standalone: true}"/>
95 </div> 94 </div>
96 <div class="row"> 95 <div class="row">
97 <table class="table table-dark"> 96 <table class="table table-dark">
98 <thead> 97 <thead>
99 <tr> 98 <tr>
100 <th *ngIf="estadoArticulos != 'rechazado'">Rechazar</th> 99 <th *ngIf="estadoArticulos != 'rechazado'">Rechazar</th>
101 <th>Producto</th> 100 <th>Producto</th>
102 <th>Cantidad</th> 101 <th>Cantidad</th>
103 <th *ngIf="estadoArticulos != 'aprobado'">Aceptar</th> 102 <th *ngIf="estadoArticulos != 'aprobado'">Aceptar</th>
104 </tr> 103 </tr>
105 </thead> 104 </thead>
106 <tbody> 105 <tbody>
107 <tr *ngFor="let articulo of getPaginaFiltro()" [ngClass]="{'bg-success': articulo.estado == 'aprobado'}"> 106 <tr *ngFor="let articulo of getPaginaFiltro()" [ngClass]="{'bg-success': articulo.estado == 'aprobado'}">
108 <th *ngIf="estadoArticulos != 'rechazado'"><button type="button" class="" (click)="articulo.estado = 'rechazado'"> 107 <th *ngIf="estadoArticulos != 'rechazado'"><button type="button" class="" (click)="articulo.estado = 'rechazado'">
109 <i class="fa fa-window-close"></i> 108 <i class="fa fa-window-close"></i>
110 </button></th> 109 </button></th>
111 <th>{{articulo.LI0}}</th> 110 <th>{{articulo.TIO}}</th>
112 <th *ngIf="!articulo.input" (click)="articulo.input = true"> 111 <th *ngIf="!articulo.input" (click)="articulo.input = true">
113 {{articulo.recibido ? articulo.recibido + '/' : ''}}{{articulo.CAN}}</th> 112 {{articulo.recibido ? articulo.recibido + '/' : ''}}{{articulo.CAN}}</th>
114 <th *ngIf="articulo.input"> 113 <th *ngIf="articulo.input">
115 <input 114 <input
116 class="form-control-sm col-12" 115 class="form-control-sm col-12"
117 type="number" 116 type="number"
118 (keyup.enter)="articulo.input = false" 117 (keyup.enter)="articulo.input = false"
119 [(ngModel)]="articulo.recibido" 118 [(ngModel)]="articulo.recibido"
120 [ngModelOptions]="{standalone: true}" 119 [ngModelOptions]="{standalone: true}"
121 autofocus/> 120 autofocus/>
122 /{{articulo.CAN}} 121 /{{articulo.CAN}}
123 </th> 122 </th>
124 <th *ngIf="estadoArticulos != 'aprobado'"> 123 <th *ngIf="estadoArticulos != 'aprobado'">
125 <button type="button" class="" (click)="articulo.estado = 'aprobado'"> 124 <button type="button" class="" (click)="articulo.estado = 'aprobado'">
126 <i class="fa fa-check"></i> 125 <i class="fa fa-check"></i>
127 </button> 126 </button>
128 </th> 127 </th>
129 </tr> 128 </tr>
130 <tr> 129 <tr>
131 <th colspan="3" *ngIf="articulosFiltro.length == 0">Por el momento no hay elementos aquí</th> 130 <th colspan="3" *ngIf="articulosFiltro.length == 0">Por el momento no hay elementos aquí</th>
132 </tr> 131 </tr>
133 </tbody> 132 </tbody>
134 <tfoot> 133 <tfoot>
135 <nav *ngIf="articulosFiltro.length > 0" class="mr-auto position-absolute mb-5"> 134 <nav *ngIf="articulosFiltro.length > 0" class="mr-auto position-absolute mb-5">
136 <ul class="pagination pagination-sm justify-content mb-0"> 135 <ul class="pagination pagination-sm justify-content mb-0">
137 <li class="page-item" [ngClass]="{'disabled': paginaActiva == 1}"> 136 <li class="page-item" [ngClass]="{'disabled': paginaActiva == 1}">
138 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva - 1"> 137 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva - 1">
139 <span aria-hidden="true">&laquo;</span> 138 <span aria-hidden="true">&laquo;</span>
140 <span class="sr-only">Anterior</span> 139 <span class="sr-only">Anterior</span>
141 </a> 140 </a>
142 </li> 141 </li>
143 <li 142 <li
144 class="page-item" 143 class="page-item"
145 *ngFor="let pagina of paginas; index as i" 144 *ngFor="let pagina of paginas; index as i"
146 [ngClass]="{'active': pagina == paginaActiva}" 145 [ngClass]="{'active': pagina == paginaActiva}"
147 > 146 >
148 <a 147 <a
149 class="page-link" 148 class="page-link"
150 href="javascript:void();" 149 href="javascript:void();"
151 (click)="paginaActiva = pagina" 150 (click)="paginaActiva = pagina"
152 >{{pagina}}</a> 151 >{{pagina}}</a>
153 </li> 152 </li>
154 <li class="page-item" [ngClass]="{'disabled': paginaActiva == paginas.length}"> 153 <li class="page-item" [ngClass]="{'disabled': paginaActiva == paginas.length}">
155 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva + 1"> 154 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva + 1">
156 <span aria-hidden="true">&raquo;</span> 155 <span aria-hidden="true">&raquo;</span>
157 <span class="sr-only">Siguiente</span> 156 <span class="sr-only">Siguiente</span>
158 </a> 157 </a>
159 </li> 158 </li>
160 </ul> 159 </ul>
161 </nav> 160 </nav>
162 </tfoot> 161 </tfoot>
163 </table> 162 </table>
164 </div> 163 </div>
165 </form> 164 </form>
166 <app-acciones (guardar)="guardarComprobante()"></app-acciones> 165 <app-acciones (guardar)="guardarComprobante()"></app-acciones>
167 </div> 166 </div>
168 167
src/app/comprobantes/comprobantes.component.ts
1 import { Component, OnInit} from '@angular/core'; 1 import { Component, OnInit} from '@angular/core';
2 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
3 import { BusquedaComprobanteComponent } from '../busqueda-comprobante/busqueda-comprobante.component';
2 4
3 @Component({ 5 @Component({
4 templateUrl: './comprobantes.component.html', 6 templateUrl: './comprobantes.component.html',
5 styleUrls: ['./comprobantes.component.scss'] 7 styleUrls: ['./comprobantes.component.scss']
6 }) 8 })
7 export class ComprobantesComponent implements OnInit { 9 export class ComprobantesComponent implements OnInit {
8 10
9 constructor() { } 11 constructor(private modalService: NgbModal) { }
10 12
11 ngOnInit() { 13 ngOnInit() { }
12
13 this.obtenerConsulta();
14 }
15 14
16 filter = ''; 15 filter = '';
17 estadoArticulos = 'pendiente'; 16 estadoArticulos = 'pendiente';
18 comprobantes = [1, 2, 3]; 17 comprobantes = [1, 2, 3];
19 cabecera = {}; 18 cabecera = {};
20 cuerpo = []; 19 cuerpo = [];
21 articulosFiltro = []; 20 articulosFiltro = [];
22 paginaActiva = 1; 21 paginaActiva = 1;
23 paginas = []; 22 paginas = [];
24 23
25 fecha = new Date(); 24 fecha = new Date();
26 25
27 paginar() { 26 paginar() {
28 27
29 var cantPaginas = Math.ceil(this.articulosFiltro.length / 5); 28 var cantPaginas = Math.ceil(this.articulosFiltro.length / 5);
30 this.paginas = []; 29 this.paginas = [];
31 for (let i = 0; i < cantPaginas; i++) { 30 for (let i = 0; i < cantPaginas; i++) {
32 this.paginas.push(i + 1); 31 this.paginas.push(i + 1);
33 } 32 }
34 } 33 }
35 34
36 getPaginaFiltro() { 35 getPaginaFiltro() {
37 36
38 this.articulosFiltro = this.cuerpo.filter((articulo) => { 37 this.articulosFiltro = this.cuerpo.filter((articulo) => {
39 return articulo.estado == this.estadoArticulos && 38 return articulo.estado == this.estadoArticulos &&
40 (articulo.LI0.toLocaleUpperCase().includes(this.filter.toLocaleUpperCase()) || 39 (articulo.TIO.toLocaleUpperCase().includes(this.filter.toLocaleUpperCase()) ||
41 articulo.codigoBarras == this.filter); 40 articulo.codigoBarras == this.filter);
42 }); 41 });
43 42
44 this.paginar(); 43 this.paginar();
45 44
46 return this.articulosFiltro.slice((this.paginaActiva - 1) * 5 , this.paginaActiva * 5); 45 return this.articulosFiltro.slice((this.paginaActiva - 1) * 5 , this.paginaActiva * 5);
47 } 46 }
48 47
49 getCantidadArticulosByEstado(estado: String) { 48 getCantidadArticulosByEstado(estado: String) {
50 return this.cuerpo.filter((articulo) => { 49 return this.cuerpo.filter((articulo) => {
51 return articulo.estado == estado; 50 return articulo.estado == estado;
52 }).length; 51 }).length;
53 } 52 }
54 53
55 guardarComprobante(event: any) { 54 guardarComprobante(event: any) {
56 alert('Guardando'); 55 alert('Guardando');
57 } 56 }
58 57
59 obtenerConsulta() { 58 busquedaComprobantes() {
60 59 this.modalService.open(BusquedaComprobanteComponent).result.then(comprobante => {
61 setTimeout(() => { 60
62 this.cabecera = { 61 this.cabecera = comprobante.cabecera;
63 TIP: 'A', 62 this.cuerpo = comprobante.cuerpo;
64 TCO: 'FT', 63
65 SUC: 623, 64 this.cuerpo.forEach(articulo => {
66 NCO: 53979, 65 articulo['estado'] = 'pendiente';
67 COD: 1, 66 });
68 FEC: new Date(), 67
69 NOM: 'POTIGIAN GOLOCINAS', 68 this.getPaginaFiltro();
70 CUI: '30-54775125-2' 69 }, (reason) => { });
71 };
72
73 this.cuerpo = [
74 {
75 LI0: 'Mantel Combo Bolso CocaCola',
76 CAN: 5,
77 estado: 'pendiente',
78 codigoBarras: '7790667006462'
79 },
80 {
81 LI0: 'Papas',
82 CAN: 5,
83 estado: 'pendiente',
84 },
85 {
86 LI0: 'Peras',
87 CAN: 5,
88 estado: 'pendiente',
89 },
90 {
91 LI0: 'Cafe',
92 CAN: 5,
93 estado: 'pendiente',
94 },
95 {
96 LI0: 'Cafe capuchino',
97 CAN: 5,
98 estado: 'pendiente',
99 },
100 {
101 LI0: 'Menta',
102 CAN: 5,
103 estado: 'pendiente',
104 },
105 {
106 LI0: 'Fernet',
107 CAN: 5,
108 estado: 'pendiente',
109 },
110 {
111 LI0: 'Andes',
112 CAN: 5,
113 estado: 'pendiente',
114 }
115 ];
116
117 this.articulosFiltro = this.cuerpo;
118
119 this.paginar();
120 }, 500);
121 } 70 }
122 71