promocion.component.ts 4.35 KB
import { Component, OnInit, HostListener } from '@angular/core';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
import { IArticulo } from 'src/app/interfaces/IArticulo';
import { ArticuloService } from 'src/app/services/articulo/articulo.service';
import { PromocionService } from 'src/app/services/promocion/promocion.service';
import { Subject } from 'rxjs';
import { APP_SETTINGS } from 'src/etc/AppSettings';
import { InactiveScreenService } from 'src/app/services/inactive-screen/inactive-screen.service';
import { SinonimoService } from 'src/app/services/sinonimo/sinonimo.service';
import { ISinonimo } from 'src/app/interfaces/ISinonimo';
import { SinonimoComponent } from '../sinonimo/sinonimo.component';
import * as _ from 'lodash';

@Component({
  selector: 'app-promocion',
  templateUrl: './promocion.component.html',
  styleUrls: ['./promocion.component.scss']
})
export class PromocionComponent implements OnInit {
  articulosPromo: IArticulo[] = [];
  promociones: IArticulo[] = [];
  onClose: Subject<any>;
  urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
  loading = true;
  modalSinonimo: BsModalRef;
  isPromoSelected = false;

  constructor(
    private modalPromocion: BsModalRef,
    private modalService: BsModalService,
    private articuloService: ArticuloService,
    private promocionService: PromocionService,
    private sinonimoService: SinonimoService,
    private inactiveScreen: InactiveScreenService,
  ) {
    this.onClose = new Subject();
  }

  ngOnInit() {
    this.getPromociones();
  }

  selectPromo(promo: IArticulo) {
    if (this.isPromoSelected) return;
    this.isPromoSelected = true;
    this.articuloService.getById(promo.id)
      .subscribe((resPromo: IArticulo) => {
        promo = resPromo;
        this.sinonimoService.getSinonimos(promo.CodSec, promo.CodArt)
          .subscribe((res: ISinonimo[]) => {
            if (res.length) {
              const sinonimos = [];
              const gruposArticulos = _.groupBy(res[0].productos, 'ID_SIN');
              Object.keys(gruposArticulos).forEach((key, i) => {
                sinonimos.push({ productos: gruposArticulos[key], });
                for (const a of promo.productos) {
                  if (key === a.idSinonimo.toString()) {
                    sinonimos[i].cantidad = sinonimos[i].cantidadRestante = a.cantidad;
                    continue;
                  }
                }
              });
              res = sinonimos;
              this.openModalSinonimos(res, promo);
            } else {
              promo.cantidad = 1;
              this.articuloService.setArticulo(promo);
              this.onClose.next();
              this.modalPromocion.hide();
            }
          }, err => console.error(err));
      }, err => console.error(err));
    this.mediaPantalla();
  }

  openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) {
    if (this.modalSinonimo) return;
    this.modalSinonimo = this.modalService.show(SinonimoComponent, {
      initialState: {
        sinonimos: sinonimosData,
        articulo
      },
      class: 'modal-dialog-centered',
      ignoreBackdropClick: true,
    });

    this.modalSinonimo.content.onClose
      .subscribe((res: any) => {
        this.modalSinonimo = null;
        if (!res) {
          this.onClose.next();
          this.modalPromocion.hide();
          return;
        }
        articulo.productos = res.articulos;
        this.articuloService.setArticulo(articulo);
        this.onClose.next();
        this.modalPromocion.hide();
      });
  }

  getPromociones() {
    const sector = this.articulosPromo[0].CodSec;
    const codigo = this.articulosPromo[0].CodArt;
    this.promocionService.getPromociones(sector, codigo)
      .subscribe((res: IArticulo[]) => {
        res = res.filter(a => a.ExiVta > 0);
        this.loading = false;
        this.promociones = res;
      }, error => { console.error(error); });
  }

  @HostListener('document:click', ['$event'])
  eventListener(event: Event) {
    clearTimeout(this.inactiveScreen.timerReposo);
    this.inactiveScreen.startTimeOutInactividad();
  }

  @HostListener('scroll', ['$event'])
  scrollEvent(event: Event) {
    clearTimeout(this.inactiveScreen.timerReposo);
    this.inactiveScreen.startTimeOutInactividad();
  }

  mediaPantalla() {
    if ($('body').hasClass('media-pantalla')) {
      $('.modal-content').addClass('media-pantalla');
    }
  }
}