diff --git a/src/app/components/factura-venta-actions-bar/factura-venta-actions-bar.component.ts b/src/app/components/factura-venta-actions-bar/factura-venta-actions-bar.component.ts index 259899e4..17c6c7d3 100644 --- a/src/app/components/factura-venta-actions-bar/factura-venta-actions-bar.component.ts +++ b/src/app/components/factura-venta-actions-bar/factura-venta-actions-bar.component.ts @@ -19,7 +19,7 @@ import { Router } from '@angular/router'; import { FacturaVenta } from './../../models/factura-venta'; import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; -export type fvActionButtonName = 'show'|'email'|'show-remito'|'new-remito'|'create-nota-credito'; +type FacturaVentaActionButtonName = 'show'|'email'|'show-remito'|'new-remito'|'create-nota-credito'; @Component({ selector: 'app-factura-venta-actions-bar', @@ -31,9 +31,9 @@ export class FacturaVentaActionsBarComponent implements OnInit { @Input() set facturaVenta(value: FacturaVenta) { this.pFacturaVenta = value; } get facturaVenta(): FacturaVenta { return this.pFacturaVenta; } - private pHiddenButtons: fvActionButtonName[] = []; - @Input() set hiddenButtons(value: fvActionButtonName[]) { this.pHiddenButtons = value; } - get hiddenButtons(): fvActionButtonName[] { return this.pHiddenButtons; } + private pHiddenButtons: FacturaVentaActionButtonName[] = []; + @Input() set hiddenButtons(value: FacturaVentaActionButtonName[]) { this.pHiddenButtons = value; } + get hiddenButtons(): FacturaVentaActionButtonName[] { return this.pHiddenButtons; } @Output() afterAutorizar = new EventEmitter(); @Output() afterNoAutorizar = new EventEmitter(); @@ -75,7 +75,7 @@ export class FacturaVentaActionsBarComponent implements OnInit { } ngOnInit(): void { - Object.keys(this.hiddenButtonsValues).forEach((k: fvActionButtonName) => { + Object.keys(this.hiddenButtonsValues).forEach((k: FacturaVentaActionButtonName) => { this.hiddenButtonsValues[k] = this.hiddenButtons.indexOf(k) >= 0; }); } diff --git a/src/app/components/pedido-actions-bar/pedido-actions-bar.component.html b/src/app/components/pedido-actions-bar/pedido-actions-bar.component.html new file mode 100644 index 00000000..717db330 --- /dev/null +++ b/src/app/components/pedido-actions-bar/pedido-actions-bar.component.html @@ -0,0 +1,43 @@ + diff --git a/src/app/components/pedido-actions-bar/pedido-actions-bar.component.ts b/src/app/components/pedido-actions-bar/pedido-actions-bar.component.ts new file mode 100644 index 00000000..b35b6b6c --- /dev/null +++ b/src/app/components/pedido-actions-bar/pedido-actions-bar.component.ts @@ -0,0 +1,140 @@ +import { AuthService } from './../../services/auth.service'; +import { finalize } from 'rxjs/operators'; +import { PedidosService } from './../../services/pedidos.service'; +import { LoadingOverlayService } from './../../services/loading-overlay.service'; +import { StorageKeys, StorageService } from './../../services/storage.service'; +import { MensajeModalType } from './../mensaje-modal/mensaje-modal.component'; +import { MensajeService } from './../../services/mensaje.service'; +import { Router } from '@angular/router'; +import { Rol } from './../../models/rol'; +import { EstadoPedido } from './../../models/estado-pedido'; +import { Pedido } from './../../models/pedido'; +import { Component, OnInit, Input } from '@angular/core'; + +type PedidoActionButtonName = 'show'|'download'|'edit'|'clone'|'delete'|'invoice'|'show-invoice'; + +@Component({ + selector: 'app-pedido-actions-bar', + templateUrl: './pedido-actions-bar.component.html' +}) +export class PedidoActionsBarComponent implements OnInit { + private pPedido: Pedido; + @Input() set pedido(value: Pedido) { this.pPedido = value; } + get pedido(): Pedido { return this.pPedido; } + + private pHiddenButtons: PedidoActionButtonName[] = []; + @Input() set hiddenButtons(value: PedidoActionButtonName[]) { this.pHiddenButtons = value; } + get hiddenButtons(): PedidoActionButtonName[] { return this.pHiddenButtons; } + + hiddenButtonsValues = { + 'show': false, + 'download': false, + 'edit': false, + 'clone': false, + 'delete': false, + 'invoice': false, + 'show-invoice': false, + } + + allowedRolesToDelete: Rol[] = [ Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR ]; + hasRolToDelete = false; + + allowedRolesToEdit: Rol[] = [ Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR ]; + hasRolToEdit = false; + + puedeEliminarPedido = false; + puedeEditarPedido = false; + puedeFacturarPedido = false; + puedeVerFacturas = false; + + constructor(private router: Router, + private authService: AuthService, + private mensajeService: MensajeService, + private loadingOverlayService: LoadingOverlayService, + private pedidosService: PedidosService, + private storageService: StorageService) { + this.hasRolToDelete = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToDelete); + this.hasRolToEdit = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToEdit); + } + + ngOnInit(): void { + this.puedeEliminarPedido = this.hasRolToDelete && this.pedido.estado === EstadoPedido.ABIERTO; + this.puedeEditarPedido = this.hasRolToEdit && this.pedido.estado === EstadoPedido.ABIERTO; + this.puedeFacturarPedido = this.hasRolToEdit && this.pedido.estado === EstadoPedido.ABIERTO; + this.puedeVerFacturas = [EstadoPedido.CERRADO].indexOf(this.pedido.estado) >= 0; + + Object.keys(this.hiddenButtonsValues).forEach((k: PedidoActionButtonName) => { + this.hiddenButtonsValues[k] = this.hiddenButtons.indexOf(k) >= 0; + }); + } + + verPedido() { + this.router.navigate(['/pedidos/ver', this.pedido.idPedido]); + } + + cancelarPedido() { + if (!this.puedeEliminarPedido) { + this.mensajeService.msg('No posee permiso para cancelar un pedido.', MensajeModalType.ERROR); + return; + } + + const msg = `¿Está seguro que desea cancelar el pedido #${this.pedido.nroPedido}?`; + + this.mensajeService.msg(msg, MensajeModalType.CONFIRM).then((result) => { + if (result) { + this.loadingOverlayService.activate(); + this.pedidosService.cancelarPedido(this.pedido.idPedido) + .pipe(finalize(() => this.loadingOverlayService.deactivate())) + .subscribe({ + next: () => { location.reload(); }, + error: err => this.mensajeService.msg(`Error: ${err.error}`, MensajeModalType.ERROR), + }) + ; + } + }, () => { return; }); + } + + editarPedido() { + if (!this.puedeEditarPedido) { + this.mensajeService.msg('No posee permiso para editar un pedido.', MensajeModalType.ERROR); + return; + } + this.storageService.removeItem(StorageKeys.PEDIDO_EDITAR); + this.router.navigate(['/pedidos/editar', this.pedido.idPedido]); + } + + clonarPedido() { + this.storageService.removeItem(StorageKeys.PEDIDO_NUEVO); + this.router.navigate(['/pedidos/nuevo'], { queryParams: { idToClone: this.pedido.idPedido }}); + } + + facturarPedido() { + if (!this.puedeFacturarPedido) { + this.mensajeService.msg('No posee permiso para facturar un pedido.', MensajeModalType.ERROR); + return; + } + this.storageService.removeItem(StorageKeys.PEDIDO_FACTURAR); + this.router.navigate(['/facturas-venta/de-pedido', this.pedido.idPedido]); + } + + verFacturas() { + if (this.puedeVerFacturas) { + this.router.navigate(['/facturas-venta'], { queryParams: { nroPedido: this.pedido.nroPedido }}); + } + } + + downloadPedidoPdf() { + this.loadingOverlayService.activate(); + this.pedidosService.getPedidoPdf(this.pedido.idPedido) + .pipe(finalize(() => this.loadingOverlayService.deactivate())) + .subscribe({ + next: (res) => { + const file = new Blob([res], {type: 'application/pdf'}); + const fileURL = URL.createObjectURL(file); + window.open(fileURL, '_blank'); + }, + error: () => this.mensajeService.msg('Error al generar el reporte', MensajeModalType.ERROR), + }) + ; + } +} diff --git a/src/app/components/pedidos/pedidos.component.html b/src/app/components/pedidos/pedidos.component.html index 5e102354..56ecffc4 100644 --- a/src/app/components/pedidos/pedidos.component.html +++ b/src/app/components/pedidos/pedidos.component.html @@ -45,10 +45,10 @@

- + {{ item.estado }} @@ -75,44 +75,7 @@

-
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • - + diff --git a/src/app/components/pedidos/pedidos.component.ts b/src/app/components/pedidos/pedidos.component.ts index 0767115b..1adc0c49 100644 --- a/src/app/components/pedidos/pedidos.component.ts +++ b/src/app/components/pedidos/pedidos.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { PedidosService } from '../../services/pedidos.service'; -import { Pedido } from '../../models/pedido'; import { Pagination } from '../../models/pagination'; import { EstadoPedido } from '../../models/estado-pedido'; -import { finalize, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { UntypedFormBuilder } from '@angular/forms'; import { Rol } from '../../models/rol'; import { HelperService } from '../../services/helper.service'; @@ -12,7 +11,6 @@ import { SucursalesService } from '../../services/sucursales.service'; import { Usuario } from '../../models/usuario'; import { AuthService } from '../../services/auth.service'; import { MensajeService } from '../../services/mensaje.service'; -import { MensajeModalType } from '../mensaje-modal/mensaje-modal.component'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; import { Observable } from 'rxjs'; @@ -21,7 +19,6 @@ import { Producto } from '../../models/producto'; import { ClientesService } from '../../services/clientes.service'; import { UsuariosService } from '../../services/usuarios.service'; import { ProductosService } from '../../services/productos.service'; -import { StorageKeys, StorageService } from '../../services/storage.service'; import { LoadingOverlayService } from '../../services/loading-overlay.service'; import { ListadoDirective } from '../../directives/listado.directive'; @@ -35,12 +32,6 @@ export class PedidosComponent extends ListadoDirective implements OnInit { rol = Rol; usuario: Usuario; - estados = [ - { value: EstadoPedido.ABIERTO, text: EstadoPedido[EstadoPedido.ABIERTO] }, - { value: EstadoPedido.CANCELADO, text: EstadoPedido[EstadoPedido.CANCELADO] }, - { value: EstadoPedido.CERRADO, text: EstadoPedido[EstadoPedido.CERRADO] }, - ]; - allowedRolesToDelete: Rol[] = [ Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR ]; hasRolToDelete = false; @@ -57,19 +48,14 @@ export class PedidosComponent extends ListadoDirective implements OnInit { private clientesService: ClientesService, private usuariosService: UsuariosService, private productosService: ProductosService, - private storageService: StorageService, public loadingOverlayService: LoadingOverlayService) { super(route, router, sucursalesService, loadingOverlayService, mensajeService); - } - - getEstadoValue(e: EstadoPedido): any { - return EstadoPedido[e]; + this.hasRolToDelete = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToDelete); + this.hasRolToEdit = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToEdit); } ngOnInit() { super.ngOnInit(); - this.hasRolToDelete = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToDelete); - this.hasRolToEdit = this.authService.userHasAnyOfTheseRoles(this.allowedRolesToEdit); } populateFilterForm(ps) { @@ -196,83 +182,10 @@ export class PedidosComponent extends ListadoDirective implements OnInit { } } - verPedido(pedido: Pedido) { - this.router.navigate(['/pedidos/ver', pedido.idPedido]); - } - - puedeElimarPedido(p: Pedido) { - return this.hasRolToDelete && p.estado === EstadoPedido.ABIERTO; - } - - puedeEditarPedido(p: Pedido) { - return this.hasRolToEdit && p.estado === EstadoPedido.ABIERTO; - } - - puedeFacturarPedido(p: Pedido) { - return this.hasRolToEdit && (p.estado === EstadoPedido.ABIERTO); - } - - puedeVerFacturas(p: Pedido) { - return [EstadoPedido.CERRADO].indexOf(p.estado) >= 0; - } - crearPedido() { this.router.navigate(['/pedidos/nuevo']); } - cancelarPedido(pedido: Pedido) { - if (!this.puedeElimarPedido(pedido)) { - this.mensajeService.msg('No posee permiso para cancelar un pedido.', MensajeModalType.ERROR); - return; - } - - const msg = `¿Está seguro que desea cancelar el pedido #${pedido.nroPedido}?`; - - this.mensajeService.msg(msg, MensajeModalType.CONFIRM).then((result) => { - if (result) { - this.loadingOverlayService.activate(); - this.pedidosService.cancelarPedido(pedido.idPedido) - .pipe(finalize(() => this.loadingOverlayService.deactivate())) - .subscribe( - () => { - location.reload(); - }, - err => this.mensajeService.msg(`Error: ${err.error}`, MensajeModalType.ERROR), - ) - ; - } - }, () => { return; }); - } - - editarPedido(pedido: Pedido) { - if (!this.puedeEditarPedido(pedido)) { - this.mensajeService.msg('No posee permiso para editar un pedido.', MensajeModalType.ERROR); - return; - } - this.storageService.removeItem(StorageKeys.PEDIDO_EDITAR); - this.router.navigate(['/pedidos/editar', pedido.idPedido]); - } - - clonarPedido(pedido: Pedido) { - this.storageService.removeItem(StorageKeys.PEDIDO_NUEVO); - this.router.navigate(['/pedidos/nuevo'], { queryParams: { idToClone: pedido.idPedido }}); - } - - facturarPedido(pedido: Pedido) { - if (!this.puedeFacturarPedido(pedido)) { - this.mensajeService.msg('No posee permiso para facturar un pedido.', MensajeModalType.ERROR); - return; - } - this.storageService.removeItem(StorageKeys.PEDIDO_FACTURAR); - this.router.navigate(['/facturas-venta/de-pedido', pedido.idPedido]); - } - - verFacturas(pedido: Pedido) { - if (this.puedeVerFacturas(pedido)) { - this.router.navigate(['/facturas-venta'], { queryParams: { nroPedido: pedido.nroPedido }}); - } - } - getClienteInfoAsync(id: number): Observable { return this.clientesService.getCliente(id).pipe(map((c: Cliente) => c.nombreFiscal)); } diff --git a/src/app/components/ver-pedido/ver-pedido.component.html b/src/app/components/ver-pedido/ver-pedido.component.html index bd006223..2c2b781c 100644 --- a/src/app/components/ver-pedido/ver-pedido.component.html +++ b/src/app/components/ver-pedido/ver-pedido.component.html @@ -1,21 +1,35 @@ -
    +
    -
    -

    +
    +

    - Pedido #{{ pedido.nroPedido }} + Pedido

    - +
    - + + + + + @@ -54,7 +68,7 @@

    - + diff --git a/src/app/components/ver-pedido/ver-pedido.component.ts b/src/app/components/ver-pedido/ver-pedido.component.ts index 0e989934..c5c68fc7 100644 --- a/src/app/components/ver-pedido/ver-pedido.component.ts +++ b/src/app/components/ver-pedido/ver-pedido.component.ts @@ -1,3 +1,4 @@ +import { EstadoPedido } from './../../models/estado-pedido'; import { Component, OnInit } from '@angular/core'; import { Pedido } from '../../models/pedido'; import { PedidosService } from '../../services/pedidos.service'; @@ -8,8 +9,6 @@ import { RenglonPedido } from '../../models/renglon-pedido'; import { TipoDeEnvio } from '../../models/tipo-de-envio'; import { Location } from '@angular/common'; import { LoadingOverlayService } from '../../services/loading-overlay.service'; -import {MensajeModalType} from '../mensaje-modal/mensaje-modal.component'; -import {MensajeService} from '../../services/mensaje.service'; @Component({ selector: 'app-ver-pedido', @@ -22,11 +21,15 @@ export class VerPedidoComponent implements OnInit { tipoDeEnvio = TipoDeEnvio; + nombreCliente = ''; + envioLabel = ''; + + estado = EstadoPedido; + constructor(private route: ActivatedRoute, private pedidosService: PedidosService, private location: Location, - public loadingOverlayService: LoadingOverlayService, - private mensajeService: MensajeService) { } + public loadingOverlayService: LoadingOverlayService) { } ngOnInit() { const id = Number(this.route.snapshot.paramMap.get('id')); @@ -39,35 +42,23 @@ export class VerPedidoComponent implements OnInit { .subscribe((v: [Pedido, RenglonPedido[]]) => { this.pedido = v[0]; this.renglones = v[1]; + + this.nombreCliente = this.getNombreCliente(); + this.envioLabel = this.getEnvioLabel(); }) ; } - getNombreCliente() { + private getNombreCliente() { let ret = ''; if (this.pedido && this.pedido.cliente) { const c = this.pedido.cliente; - ret = `#${c.nroCliente} - ${c.nombreFiscal}` + (c.nombreFantasia ? ` - ${c.nombreFantasia}` : ''); + ret = `${c.nroCliente} - ${c.nombreFiscal}` + (c.nombreFantasia ? ` - ${c.nombreFantasia}` : ''); } return ret; } - downloadPedidoPdf(pedido: Pedido) { - this.loadingOverlayService.activate(); - this.pedidosService.getPedidoPdf(pedido.idPedido) - .pipe(finalize(() => this.loadingOverlayService.deactivate())) - .subscribe( - (res) => { - const file = new Blob([res], {type: 'application/pdf'}); - const fileURL = URL.createObjectURL(file); - window.open(fileURL, '_blank'); - }, - () => this.mensajeService.msg('Error al generar el reporte', MensajeModalType.ERROR), - ) - ; - } - - getEnvioLabel() { + private getEnvioLabel() { if (!this.pedido || !this.pedido.tipoDeEnvio) { return ''; } diff --git a/src/app/modules/share.module.ts b/src/app/modules/share.module.ts index c0656883..a44102c5 100755 --- a/src/app/modules/share.module.ts +++ b/src/app/modules/share.module.ts @@ -40,6 +40,7 @@ import { ImgPickerComponent } from '../components/img-picker/img-picker.componen import { TotalesComponent } from '../components/totales/totales.component'; import { ListaTableComponent } from '../components/lista-table/lista-table.component'; import { FacturaVentaActionsBarComponent } from '../components/factura-venta-actions-bar/factura-venta-actions-bar.component'; +import { PedidoActionsBarComponent } from '../components/pedido-actions-bar/pedido-actions-bar.component'; @NgModule({ declarations: [ @@ -62,6 +63,7 @@ import { FacturaVentaActionsBarComponent } from '../components/factura-venta-act TotalesComponent, ListaTableComponent, FacturaVentaActionsBarComponent, + PedidoActionsBarComponent, ], imports: [ CommonModule, @@ -92,6 +94,7 @@ import { FacturaVentaActionsBarComponent } from '../components/factura-venta-act TotalesComponent, ListaTableComponent, FacturaVentaActionsBarComponent, + PedidoActionsBarComponent, ] }) export class ShareModule {
    Datos del pedido
    Cliente{{ getNombreCliente() }}
    + {{ pedido.nroPedido }} + + {{ pedido.estado }} + +
    Cliente{{ nombreCliente }}
    Fecha{{ pedido.fecha | date:'dd/MM/yyyy HH:mm' }}
    Fecha de Vencimiento{{ pedido.fechaVencimiento | date:'dd/MM/yyyy HH:mm' }}
    Usuario{{ pedido.nombreUsuario }}
    Tipo de Envio{{ getEnvioLabel() }}{{ envioLabel }}
    Sucursal