Commit ad214f9d4275bc0e682a95ca97b7a94e1bfc6fb2

Authored by Eric Fernandez
1 parent 3e5d641314
Exists in master

devuelvo comprobante a servicio

src/app/acciones/acciones.component.ts
1 import { Component, OnInit, Output, EventEmitter } from '@angular/core'; 1 import { Component, OnInit, Output, EventEmitter } from '@angular/core';
2 @Component({ 2 @Component({
3 selector: 'app-acciones', 3 selector: 'app-acciones',
4 templateUrl: './acciones.component.html', 4 templateUrl: './acciones.component.html',
5 styleUrls: ['./acciones.component.scss'] 5 styleUrls: ['./acciones.component.scss'],
6 inputs: ['saveLoading']
6 }) 7 })
7 export class AccionesComponent implements OnInit { 8 export class AccionesComponent implements OnInit {
8 9
9 @Output() guardar = new EventEmitter<any>(); 10 @Output() guardar = new EventEmitter<any>();
10 saveLoading = false; 11 saveLoading = false;
11 12
12 constructor() { } 13 constructor() { }
13 14
14 ngOnInit() { 15 ngOnInit() {
15 } 16 }
16 17
17 callSave() { 18 callSave() {
18 //llamo función guardar pasada en el componente 19 //llamo función guardar pasada en el componente
19 this.saveLoading = true; 20 this.guardar.emit();
20
21 setTimeout(() => {
22 this.saveLoading = false;
23 }, 10000);
24 } 21 }
25 } 22 }
src/app/busqueda-comprobante/busqueda-comprobantes.service.ts
1 import { Injectable } from '@angular/core'; 1 import { Injectable } from '@angular/core';
2 import { HttpClient, HttpHeaders } from '@angular/common/http'; 2 import { HttpClient } from '@angular/common/http';
3 import { AppSetings } from '../../etc/AppSetings'; 3 import { AppSetings } from '../../etc/AppSetings';
4 4
5 @Injectable() 5 @Injectable()
6 export class BusquedaComprobantesService { 6 export class BusquedaComprobantesService {
7 7
8 constructor(private http: HttpClient) { 8 constructor(private http: HttpClient) { }
9 }
10 9
11 getComprobantes() { 10 getComprobantes() {
12 return this.http.get(AppSetings.END_POINT + '/comprobantes/' + localStorage.getItem('gln')); 11 return this.http.get(AppSetings.END_POINT + '/comprobantes/' + localStorage.getItem('gln'));
13 }; 12 };
14 } 13 }
15 14
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 (click)="busquedaComprobantes()" 9 (click)="busquedaComprobantes()"
10 title="Buscar" 10 title="Buscar"
11 > 11 >
12 <i class="fa fa-search"></i> 12 <i class="fa fa-search"></i>
13 </button> 13 </button>
14 </div> 14 </div>
15 <div class="col-7 col-sm border border-white align-middle"> 15 <div class="col-7 col-sm border border-white align-middle">
16 Fecha: 16 Fecha:
17 <span 17 <span
18 ng-click="datepickerAbierto = true" 18 ng-click="datepickerAbierto = true"
19 >&nbsp;{{ fecha | date: 'dd/MM/yyyy' }}</span> 19 >&nbsp;{{ fecha | date: 'dd/MM/yyyy' }}</span>
20 </div> 20 </div>
21 <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">
22 Hora: 22 Hora:
23 <span 23 <span
24 ng-click="datepickerAbierto = true" 24 ng-click="datepickerAbierto = true"
25 >&nbsp;{{ fecha | date: 'shortTime'}}</span> 25 >&nbsp;{{ fecha | date: 'shortTime'}}</span>
26 </div> 26 </div>
27 </div> 27 </div>
28 </div> 28 </div>
29 </div> 29 </div>
30 <div class="row"> 30 <div class="row">
31 <form class="col-12 col-sm-10"> 31 <form class="col-12 col-sm-10">
32 <div class="row border"> 32 <div class="row border">
33 <div class="col-6 col-sm-3 d-flex"> 33 <div class="col-6 col-sm-3 d-flex">
34 <strong>Letra Factura:&nbsp;</strong> 34 <strong>Letra Factura:&nbsp;</strong>
35 <label>{{cabecera.TIP}}</label> 35 <label>{{cabecera.TIP}}</label>
36 </div> 36 </div>
37 <div class="col-6 col-sm-3 d-flex"> 37 <div class="col-6 col-sm-3 d-flex">
38 <strong>Tipo Factura:&nbsp;</strong> 38 <strong>Tipo Factura:&nbsp;</strong>
39 <label>{{cabecera.TCO}}</label> 39 <label>{{cabecera.TCO}}</label>
40 </div> 40 </div>
41 <div class="col-6 col-sm-3 d-flex"> 41 <div class="col-6 col-sm-3 d-flex">
42 <strong>Sucursal:&nbsp;</strong> 42 <strong>Sucursal:&nbsp;</strong>
43 <label>{{cabecera.SUC}}</label> 43 <label>{{cabecera.SUC}}</label>
44 </div> 44 </div>
45 <div class="col-6 col-sm-3 d-flex"> 45 <div class="col-6 col-sm-3 d-flex">
46 <strong>Número:&nbsp;</strong> 46 <strong>Número:&nbsp;</strong>
47 <label>{{cabecera.NCO}}</label> 47 <label>{{cabecera.NCO}}</label>
48 </div> 48 </div>
49 <div class="col-6 col-sm-3 d-flex"> 49 <div class="col-6 col-sm-3 d-flex">
50 <strong>Cuit:&nbsp;</strong> 50 <strong>Cuit:&nbsp;</strong>
51 <label>{{cabecera.CUI}}</label> 51 <label>{{cabecera.CUI}}</label>
52 </div> 52 </div>
53 <div class="col-12 col-sm-6 d-flex"> 53 <div class="col-12 col-sm-6 d-flex">
54 <strong>Nombre:&nbsp;</strong> 54 <strong>Nombre:&nbsp;</strong>
55 <label>{{cabecera.NOM}}</label> 55 <label>{{cabecera.NOM}}</label>
56 </div> 56 </div>
57 </div> 57 </div>
58 <div class="row border pr-2"> 58 <div class="row border pr-2">
59 <div class="col-4"> 59 <div class="col-4">
60 <button 60 <button
61 type="button" 61 type="button"
62 class="btn btn-outline-secondary btn-sm" 62 class="btn btn-outline-secondary btn-sm"
63 [ngClass]="{'active': estadoArticulos == 'pendiente'}" 63 [ngClass]="{'active': estadoArticulos == 'pendiente'}"
64 (click)="estadoArticulos = 'pendiente'; paginaActiva = 1; filter = '';"> 64 (click)="estadoArticulos = 'pendiente'; paginaActiva = 1; filter = '';">
65 Pendientes&nbsp;({{getCantidadArticulosByEstado('pendiente')}}) 65 Pendientes&nbsp;({{getCantidadArticulosByEstado('pendiente')}})
66 </button> 66 </button>
67 </div> 67 </div>
68 <div class="col-4"> 68 <div class="col-4">
69 <button 69 <button
70 type="button" 70 type="button"
71 class="btn btn-outline-success btn-sm" 71 class="btn btn-outline-success btn-sm"
72 [ngClass]="{'active': estadoArticulos == 'aprobado'}" 72 [ngClass]="{'active': estadoArticulos == 'aprobado'}"
73 (click)="estadoArticulos = 'aprobado'; paginaActiva = 1; filter = '';"> 73 (click)="estadoArticulos = 'aprobado'; paginaActiva = 1; filter = '';">
74 Aprobados&nbsp;({{getCantidadArticulosByEstado('aprobado')}}) 74 Aprobados&nbsp;({{getCantidadArticulosByEstado('aprobado')}})
75 </button> 75 </button>
76 </div> 76 </div>
77 <div class="col-4"> 77 <div class="col-4">
78 <button 78 <button
79 type="button" 79 type="button"
80 class="btn btn-outline-danger btn-sm" 80 class="btn btn-outline-danger btn-sm"
81 [ngClass]="{'active': estadoArticulos == 'rechazado'}" 81 [ngClass]="{'active': estadoArticulos == 'rechazado'}"
82 (click)="estadoArticulos = 'rechazado'; paginaActiva = 1; filter = '';"> 82 (click)="estadoArticulos = 'rechazado'; paginaActiva = 1; filter = '';">
83 Rechazados&nbsp;({{getCantidadArticulosByEstado('rechazado')}}) 83 Rechazados&nbsp;({{getCantidadArticulosByEstado('rechazado')}})
84 </button> 84 </button>
85 </div> 85 </div>
86 </div> 86 </div>
87 <div class="row"> 87 <div class="row">
88 <input 88 <input
89 type="text" 89 type="text"
90 class="form-control-sm col-12" 90 class="form-control-sm col-12"
91 placeholder="Busque producto por nombre, codigo" 91 placeholder="Busque producto por nombre, codigo"
92 [(ngModel)]="filter" 92 [(ngModel)]="filter"
93 [ngModelOptions]="{standalone: true}"/> 93 [ngModelOptions]="{standalone: true}"/>
94 </div> 94 </div>
95 <div class="row"> 95 <div class="row">
96 <table class="table table-dark"> 96 <table class="table table-dark">
97 <thead> 97 <thead>
98 <tr> 98 <tr>
99 <th *ngIf="estadoArticulos != 'rechazado'">Rechazar</th> 99 <th *ngIf="estadoArticulos != 'rechazado'">Rechazar</th>
100 <th>Producto</th> 100 <th>Producto</th>
101 <th>Cantidad</th> 101 <th>Cantidad</th>
102 <th *ngIf="estadoArticulos != 'aprobado'">Aceptar</th> 102 <th *ngIf="estadoArticulos != 'aprobado'">Aceptar</th>
103 </tr> 103 </tr>
104 </thead> 104 </thead>
105 <tbody> 105 <tbody>
106 <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'}">
107 <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'">
108 <i class="fa fa-window-close"></i> 108 <i class="fa fa-window-close"></i>
109 </button></th> 109 </button></th>
110 <th>{{articulo.TIO}}</th> 110 <th>{{articulo.TIO}}</th>
111 <th *ngIf="!articulo.input" (click)="articulo.input = true"> 111 <th *ngIf="!articulo.input" (click)="articulo.input = true">
112 {{articulo.recibido ? articulo.recibido + '/' : ''}}{{articulo.CAN}}</th> 112 {{articulo.recibido ? articulo.recibido + '/' : ''}}{{articulo.CAN}}</th>
113 <th *ngIf="articulo.input"> 113 <th *ngIf="articulo.input">
114 <input 114 <input
115 class="form-control-sm col-12" 115 class="form-control-sm col-12"
116 type="number" 116 type="number"
117 (keyup.enter)="articulo.input = false" 117 (keyup.enter)="articulo.input = false"
118 [(ngModel)]="articulo.recibido" 118 [(ngModel)]="articulo.recibido"
119 [ngModelOptions]="{standalone: true}" 119 [ngModelOptions]="{standalone: true}"
120 autofocus/> 120 autofocus/>
121 /{{articulo.CAN}} 121 /{{articulo.CAN}}
122 </th> 122 </th>
123 <th *ngIf="estadoArticulos != 'aprobado'"> 123 <th *ngIf="estadoArticulos != 'aprobado'">
124 <button type="button" class="" (click)="articulo.estado = 'aprobado'"> 124 <button type="button" class="" (click)="articulo.estado = 'aprobado'">
125 <i class="fa fa-check"></i> 125 <i class="fa fa-check"></i>
126 </button> 126 </button>
127 </th> 127 </th>
128 </tr> 128 </tr>
129 <tr> 129 <tr>
130 <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>
131 </tr> 131 </tr>
132 </tbody> 132 </tbody>
133 <tfoot> 133 <tfoot>
134 <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">
135 <ul class="pagination pagination-sm justify-content mb-0"> 135 <ul class="pagination pagination-sm justify-content mb-0">
136 <li class="page-item" [ngClass]="{'disabled': paginaActiva == 1}"> 136 <li class="page-item" [ngClass]="{'disabled': paginaActiva == 1}">
137 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva - 1"> 137 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva - 1">
138 <span aria-hidden="true">&laquo;</span> 138 <span aria-hidden="true">&laquo;</span>
139 <span class="sr-only">Anterior</span> 139 <span class="sr-only">Anterior</span>
140 </a> 140 </a>
141 </li> 141 </li>
142 <li 142 <li
143 class="page-item" 143 class="page-item"
144 *ngFor="let pagina of paginas; index as i" 144 *ngFor="let pagina of paginas; index as i"
145 [ngClass]="{'active': pagina == paginaActiva}" 145 [ngClass]="{'active': pagina == paginaActiva}"
146 > 146 >
147 <a 147 <a
148 class="page-link" 148 class="page-link"
149 href="javascript:void();" 149 href="javascript:void();"
150 (click)="paginaActiva = pagina" 150 (click)="paginaActiva = pagina"
151 >{{pagina}}</a> 151 >{{pagina}}</a>
152 </li> 152 </li>
153 <li class="page-item" [ngClass]="{'disabled': paginaActiva == paginas.length}"> 153 <li class="page-item" [ngClass]="{'disabled': paginaActiva == paginas.length}">
154 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva + 1"> 154 <a class="page-link" href="javascript:void();" (click)="paginaActiva = paginaActiva + 1">
155 <span aria-hidden="true">&raquo;</span> 155 <span aria-hidden="true">&raquo;</span>
156 <span class="sr-only">Siguiente</span> 156 <span class="sr-only">Siguiente</span>
157 </a> 157 </a>
158 </li> 158 </li>
159 </ul> 159 </ul>
160 </nav> 160 </nav>
161 </tfoot> 161 </tfoot>
162 </table> 162 </table>
163 </div> 163 </div>
164 </form> 164 </form>
165 <app-acciones (guardar)="guardarComprobante()"></app-acciones> 165 <app-acciones (guardar)="guardarComprobante()" [(saveLoading)]="saveLoading"></app-acciones>
166 </div> 166 </div>
167 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'; 2 import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
3 import { BusquedaComprobanteComponent } from '../busqueda-comprobante/busqueda-comprobante.component'; 3 import { BusquedaComprobanteComponent } from '../busqueda-comprobante/busqueda-comprobante.component';
4 import { ComprobanteService } from './comprobantes.service';
4 5
5 @Component({ 6 @Component({
6 templateUrl: './comprobantes.component.html', 7 templateUrl: './comprobantes.component.html',
7 styleUrls: ['./comprobantes.component.scss'] 8 styleUrls: ['./comprobantes.component.scss'],
9 providers:[ ComprobanteService ]
8 }) 10 })
9 export class ComprobantesComponent implements OnInit { 11 export class ComprobantesComponent implements OnInit {
10 12
11 constructor(private modalService: NgbModal) { } 13 constructor(private modalService: NgbModal, public comprobanteService: ComprobanteService) { }
12 14
13 ngOnInit() { } 15 ngOnInit() { }
14 16
15 filter = ''; 17 filter = '';
16 estadoArticulos = 'pendiente'; 18 estadoArticulos = 'pendiente';
17 comprobantes = [1, 2, 3]; 19 comprobantes = [1, 2, 3];
18 cabecera = {}; 20 cabecera = {};
19 cuerpo = []; 21 cuerpo = [];
20 articulosFiltro = []; 22 articulosFiltro = [];
21 paginaActiva = 1; 23 paginaActiva = 1;
22 paginas = []; 24 paginas = [];
25 saveLoading = false;
23 26
24 fecha = new Date(); 27 fecha = new Date();
25 28
26 paginar() { 29 paginar() {
27 30
28 var cantPaginas = Math.ceil(this.articulosFiltro.length / 5); 31 var cantPaginas = Math.ceil(this.articulosFiltro.length / 5);
29 this.paginas = []; 32 this.paginas = [];
30 for (let i = 0; i < cantPaginas; i++) { 33 for (let i = 0; i < cantPaginas; i++) {
31 this.paginas.push(i + 1); 34 this.paginas.push(i + 1);
32 } 35 }
33 } 36 }
34 37
35 getPaginaFiltro() { 38 getPaginaFiltro() {
36 39
37 this.articulosFiltro = this.cuerpo.filter((articulo) => { 40 this.articulosFiltro = this.cuerpo.filter((articulo) => {
38 return articulo.estado == this.estadoArticulos && 41 return articulo.estado == this.estadoArticulos &&
39 (articulo.TIO.toLocaleUpperCase().includes(this.filter.toLocaleUpperCase()) || 42 (articulo.TIO.toLocaleUpperCase().includes(this.filter.toLocaleUpperCase()) ||
40 articulo.codigoBarras == this.filter); 43 articulo.codigoBarras == this.filter);
41 }); 44 });
42 45
43 this.paginar(); 46 this.paginar();
44 47
45 return this.articulosFiltro.slice((this.paginaActiva - 1) * 5 , this.paginaActiva * 5); 48 return this.articulosFiltro.slice((this.paginaActiva - 1) * 5 , this.paginaActiva * 5);
46 } 49 }
47 50
48 getCantidadArticulosByEstado(estado: String) { 51 getCantidadArticulosByEstado(estado: String) {
49 return this.cuerpo.filter((articulo) => { 52 return this.cuerpo.filter((articulo) => {
50 return articulo.estado == estado; 53 return articulo.estado == estado;
51 }).length; 54 }).length;
52 } 55 }
53 56
54 guardarComprobante(event: any) { 57 guardarComprobante(event: any) {
55 alert('Guardando'); 58
59 if (this.getCantidadArticulosByEstado('pendiente')) {
60 alert('No deben quedar articulos pendientes');
61 }
62
63 this.comprobanteService
64 .saveComprobantes({cabecera: this.cabecera, cuerpo: this.cuerpo})
65 .subscribe(data => {
66 console.log(data);
67 });
56 } 68 }
57 69
58 busquedaComprobantes() { 70 busquedaComprobantes() {
59 this.modalService.open(BusquedaComprobanteComponent).result.then(comprobante => { 71 this.modalService.open(BusquedaComprobanteComponent).result.then(comprobante => {
60 72
61 this.cabecera = comprobante.cabecera; 73 this.cabecera = comprobante.cabecera;
62 this.cuerpo = comprobante.cuerpo; 74 this.cuerpo = comprobante.cuerpo;
63 75
64 this.cuerpo.forEach(articulo => { 76 this.cuerpo.forEach(articulo => {
65 articulo['estado'] = 'pendiente'; 77 articulo['estado'] = 'pendiente';
66 }); 78 });
67 79
68 this.getPaginaFiltro(); 80 this.getPaginaFiltro();
69 }, (reason) => { }); 81 }, (reason) => { });
70 } 82 }
71 83
72 } 84 }
73 85
src/app/comprobantes/comprobantes.service.ts
File was created 1 import { Injectable } from '@angular/core';
2 import { HttpClient } from '@angular/common/http';
3 import { AppSetings } from '../../etc/AppSetings';
4
5 @Injectable()
6 export class ComprobanteService {
7
8 constructor(private http: HttpClient) {}
9
10 saveComprobantes(comprobante: object) {
11 return this.http.post(AppSetings.END_POINT + '/comprobante', comprobante);
12 }
13 }
14
src/app/login/login.service.ts
1 import { Injectable } from '@angular/core'; 1 import { Injectable } from '@angular/core';
2 import { HttpClient, HttpHeaders } from '@angular/common/http'; 2 import { HttpClient } from '@angular/common/http';
3 import { AppSetings } from '../../etc/AppSetings'; 3 import { AppSetings } from '../../etc/AppSetings';
4 4
5 @Injectable() 5 @Injectable()
6 export class LoginService { 6 export class LoginService {
7 7
8 constructor(private http: HttpClient) { } 8 constructor(private http: HttpClient) { }
9 9
10 getLogin(json: object) { 10 getLogin(json: object) {
11 return this.http.post(AppSetings.END_POINT + '/login', json); 11 return this.http.post(AppSetings.END_POINT + '/login', json);
12 }; 12 };
13 } 13 }
14 14