Skip to content

Commit

Permalink
Merge pull request #156 from open-commercial/issue155
Browse files Browse the repository at this point in the history
Select "Retiro en Sucursal" by default if available
  • Loading branch information
belluccifranco authored Apr 10, 2023
2 parents c75a1f8 + 48aa22e commit e1a04f9
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 96 deletions.
10 changes: 8 additions & 2 deletions src/app/components/pedido/pedido.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ <h1 class="h3 mb-0 flex-fill text-truncate">
</a>
<fa-icon [icon]="['fas', 'clipboard-list']"></fa-icon> {{ title }}
</h1>
<button type="button" class="btn btn-primary" (click)="limpiarDatos()" *ngIf="action.toString() === 'NUEVO'"
ngbPopover="Limpiar datos" triggers="mouseenter:mouseleave" placement="left"
>
<fa-icon [icon]="['fas', 'broom']"></fa-icon>
<span class="visually-hidden">Limpiar datos</span>
</button>
</div>
<form [formGroup]="form" (ngSubmit)="submit()" class="mt-2" *ngIf="form">
<ngb-accordion class="ops-accordion" #accordion [closeOthers]="true" activeIds="cliente" (panelChange)="panelBeforeChange($event)">
Expand Down Expand Up @@ -142,9 +148,9 @@ <h1 class="h3 mb-0 flex-fill text-truncate">
<div class="mb-3 d-flex flex-row justify-content-center align-items-center">
<label class="form-label me-2">Seleccione el tipo de envío:</label>
<div class="btn-group d-flex flex-fill" role="group">
<input type="radio" class="btn-check" [value]="oe.RETIRO_EN_SUCURSAL" id="oe-retiro-en-sucursal" autocomplete="off" formControlName="opcionEnvio">
<input type="radio" mame="oe" class="btn-check" id="oe-retiro-en-sucursal" autocomplete="off" [disabled]="retiroEnSucursalDisabled" (click)="opcionEnvioClick(oe.RETIRO_EN_SUCURSAL)" [checked]="form.get('opcionEnvio').value === oe.RETIRO_EN_SUCURSAL">
<label class="btn btn-outline-secondary" for="oe-retiro-en-sucursal">Retiro en sucursal</label>
<input type="radio" class="btn-check" [value]="oe.ENVIO_A_DOMICILIO" id="oe-envio-a-domicilio" autocomplete="off" formControlName="opcionEnvio">
<input type="radio" mame="oe" class="btn-check" id="oe-envio-a-domicilio" autocomplete="off" (click)="opcionEnvioClick(oe.ENVIO_A_DOMICILIO)" [checked]="form.get('opcionEnvio').value === oe.ENVIO_A_DOMICILIO">
<label class="btn btn-outline-secondary" for="oe-envio-a-domicilio">Envío a domicilio</label>
</div>
</div>
Expand Down
201 changes: 109 additions & 92 deletions src/app/components/pedido/pedido.component.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FormasDePagoService } from './../../services/formas-de-pago.service';
import { FormaDePago } from './../../models/forma-de-pago';
import {FormasDePagoService} from './../../services/formas-de-pago.service';
import {FormaDePago} from './../../models/forma-de-pago';
import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core';
import {AbstractControl, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms';
import {CuentaCorrienteCliente} from '../../models/cuenta-corriente';
Expand Down Expand Up @@ -100,6 +100,8 @@ export class PedidoComponent implements OnInit, OnDestroy {
formasDePago: FormaDePago[] = [];
formaDePagoPredeterminada: FormaDePago;

retiroEnSucursalDisabled = false;

constructor(private fb: UntypedFormBuilder,
modalConfig: NgbModalConfig,
private modalService: NgbModal,
Expand Down Expand Up @@ -143,18 +145,32 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.formaDePagoPredeterminada = data[2];
},
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR),
})
;
});

this.subscription.add(this.sucursalesService.sucursal$.subscribe(s => {
if (!s.configuracionSucursal.puntoDeRetiro) {
this.form.get('opcionEnvio').setValue(OpcionEnvio.ENVIO_A_DOMICILIO);
}
this.setOpcionEnvio(s.idSucursal);
}));

this.init();
}

setOpcionEnvio(idSucursal: number, value: OpcionEnvio|null = null) {
value = value || OpcionEnvio.RETIRO_EN_SUCURSAL;
this.form.get('opcionEnvio').setValue(value);
if (!this.esSucursalPuntoDeRetiro(idSucursal)) {
if (value === OpcionEnvio.RETIRO_EN_SUCURSAL) {
this.form.get('opcionEnvio').setValue(null);
}
this.retiroEnSucursalDisabled = true;
} else {
this.retiroEnSucursalDisabled = false;
}
}

opcionEnvioClick(value: OpcionEnvio) {
this.setOpcionEnvio(this.sucursalesService.getIdSucursal(), value);
}

ngOnDestroy() {
this.subscription.unsubscribe();
}
Expand All @@ -172,8 +188,8 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.handleCCCPredeterminado();
},
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR),
})
;
});
this.setOpcionEnvio(this.sucursalesService.getIdSucursal());
} else {
if (this.action === Action.EDITAR) {
const id = Number(this.route.snapshot.paramMap.get('id'));
Expand Down Expand Up @@ -221,34 +237,34 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.pedidosService.getRenglonesDePedido(p.idPedido, this.action === Action.CLONAR)
])
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe(
(v: [CuentaCorrienteCliente, RenglonPedido[]]) => {
this.datosParaEditarOClonar.ccc = v[0];
this.datosParaEditarOClonar.renglones = v[1].map(e => ({ renglonPedido : e }));
if (this.action === Action.EDITAR) {
v[1].forEach(e => this.cantidadesInicialesPedido[e.idProductoItem] = e.cantidad);
}
this.datosParaEditarOClonar.sucursal = null;
if (p.tipoDeEnvio === TipoDeEnvio.RETIRO_EN_SUCURSAL) {
this.datosParaEditarOClonar.opcionEnvio = OpcionEnvio.RETIRO_EN_SUCURSAL;
this.datosParaEditarOClonar.sucursal = p.idSucursal ? { idSucursal: p.idSucursal } : null;
} else {
this.datosParaEditarOClonar.opcionEnvio = OpcionEnvio.ENVIO_A_DOMICILIO;
if (p.tipoDeEnvio) {
this.datosParaEditarOClonar.opcionEnvioUbicacion = p.tipoDeEnvio === TipoDeEnvio.USAR_UBICACION_FACTURACION ?
OpcionEnvioUbicacion.USAR_UBICACION_FACTURACION : OpcionEnvioUbicacion.USAR_UBICACION_ENVIO;
.subscribe({
next: (v: [CuentaCorrienteCliente, RenglonPedido[]]) => {
this.datosParaEditarOClonar.ccc = v[0];
this.datosParaEditarOClonar.renglones = v[1].map(e => ({ renglonPedido : e }));
if (this.action === Action.EDITAR) {
v[1].forEach(e => this.cantidadesInicialesPedido[e.idProductoItem] = e.cantidad);
}
}
this.inicializarForm();
}
);
this.datosParaEditarOClonar.sucursal = null;
if (p.tipoDeEnvio === TipoDeEnvio.RETIRO_EN_SUCURSAL) {
this.datosParaEditarOClonar.opcionEnvio = OpcionEnvio.RETIRO_EN_SUCURSAL;
this.datosParaEditarOClonar.sucursal = p.idSucursal ? { idSucursal: p.idSucursal } : null;
} else {
this.datosParaEditarOClonar.opcionEnvio = OpcionEnvio.ENVIO_A_DOMICILIO;
if (p.tipoDeEnvio) {
this.datosParaEditarOClonar.opcionEnvioUbicacion = p.tipoDeEnvio === TipoDeEnvio.USAR_UBICACION_FACTURACION ?
OpcionEnvioUbicacion.USAR_UBICACION_FACTURACION : OpcionEnvioUbicacion.USAR_UBICACION_ENVIO;
}
}
this.inicializarForm();
},
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR),
});
},
error: err => {
this.mensajeService.msg(err.error, MensajeModalType.ERROR);
this.router.navigate(['/pedidos']);
}
})
;
});
}

handleCCCPredeterminado() {
Expand All @@ -264,13 +280,13 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingOverlayService.activate();
this.cuentasCorrienteService.getCuentaCorrienteClientePredeterminado()
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe(
ccc => {
.subscribe({
next: ccc => {
this.cccPredeterminado = ccc;
this.inicializarForm();
},
err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
)
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
} else {
this.inicializarForm();
Expand Down Expand Up @@ -310,9 +326,7 @@ export class PedidoComponent implements OnInit, OnDestroy {
}

inicializarForm() {
this.form.get('ccc').valueChanges
.subscribe(() => this.updateRenglones())
;
this.form.get('ccc').valueChanges.subscribe(() => this.updateRenglones());

this.form.get('renglonesPedido').valueChanges
.subscribe((renglones) => {
Expand All @@ -321,8 +335,7 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.cantidadesActualesPedido[r.renglonPedido.idProductoItem] = r.renglonPedido.cantidad;
});
if (!this.loadingResultados) { this.calcularResultados(); }
})
;
});

this.form.get('descuento').valueChanges
.pipe(debounceTime(700))
Expand All @@ -333,8 +346,7 @@ export class PedidoComponent implements OnInit, OnDestroy {
return;
}
if (!this.loadingResultados) { this.calcularResultados(); }
})
;
});

this.form.get('recargo').valueChanges
.pipe(debounceTime(700))
Expand All @@ -345,8 +357,7 @@ export class PedidoComponent implements OnInit, OnDestroy {
return;
}
if (!this.loadingResultados) { this.calcularResultados(); }
})
;
});

this.form.get('opcionEnvio').valueChanges.subscribe(oe => {
if (oe === OpcionEnvio.RETIRO_EN_SUCURSAL) {
Expand Down Expand Up @@ -419,7 +430,7 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.form.get('descuento').setValue(data.descuento);
this.form.get('recargo').setValue(data.recargo);

this.form.get('opcionEnvio').setValue(data.opcionEnvio ? data.opcionEnvio : null);
this.setOpcionEnvio(this.sucursalesService.getIdSucursal(), data.opcionEnvio ? data.opcionEnvio : null)
this.form.get('opcionEnvioUbicacion').setValue(data.opcionEnvioUbicacion ? data.opcionEnvioUbicacion : null);

if (data.pagos && Array.isArray(data.pagos) && data.pagos.length) {
Expand Down Expand Up @@ -452,17 +463,20 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingOverlayService.activate();
this.productosService.getDisponibilidadEnStock(ppvs)
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe((pfs: ProductoFaltante[]) => {
if (!pfs.length) {
this.doSubmit();
} else {
this.agregarErroresDisponibilidad(pfs);
this.accordion.expand('productos');
this.mensajeService.msg(
'Uno o mas productos no poseen stock disponible. Por favor, verifique la sección Productos.',
MensajeModalType.ERROR
);
}
.subscribe({
next: (pfs: ProductoFaltante[]) => {
if (!pfs.length) {
this.doSubmit();
} else {
this.agregarErroresDisponibilidad(pfs);
this.accordion.expand('productos');
this.mensajeService.msg(
'Uno o mas productos no poseen stock disponible. Por favor, verifique la sección Productos.',
MensajeModalType.ERROR
);
}
},
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR),
})
;
}
Expand All @@ -477,31 +491,28 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.saving = false;
this.loadingOverlayService.deactivate();
}))
.subscribe(
() => {
.subscribe({
next: () => {
this.reset();
const msg = np.idPedido ? 'Pedido actualizado correctamente!' : 'Pedido enviado correctamente!';
this.mensajeService.msg(msg, MensajeModalType.INFO).then(() => {
this.router.navigate(['/pedidos']);
});
},
err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
)
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
}

agregarErroresDisponibilidad(pfs: ProductoFaltante[]) {
const productosIds = pfs.map(pf => pf.idProducto);

productosIds.forEach(id => {
const aux = pfs.filter(pf => pf.idProducto === id);
if (aux.length) {
const cantSolicitada = aux[0].cantidadSolicitada;
const cantDisponible = aux.reduce((total: number, pf: ProductoFaltante) => total + pf.cantidadDisponible, 0);
const errorDisponibilidad = ['Solicitado', ' ', cantSolicitada, ' --UM--', ' - Disponible ', cantDisponible, ' --UM--'].join('');

const errorDisponibilidadPorSucursal = aux.map(pf => [pf.nombreSucursal, ': ', pf.cantidadDisponible, ' --UM--'].join(''));

const control = this.searchRPInRenglones(id);
if (control) {
const v: RenglonPedido = control.get('renglonPedido').value;
Expand Down Expand Up @@ -665,20 +676,22 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingOverlayService.activate();
this.productosService.getDisponibilidadEnStock(ppvs)
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe((pfs: ProductoFaltante[]) => {
if (!pfs.length) {
const nrp: NuevoRenglonPedido = {
idProductoItem: p.idProducto,
cantidad: cant,
};

this.addRenglonPedido(nrp);
} else {
this.mensajeService.msg(
'No se puede solicitar mas stock para dicho producto. Por favor, verifique la sección Productos.',
MensajeModalType.ERROR
);
}
.subscribe({
next: (pfs: ProductoFaltante[]) => {
if (!pfs.length) {
const nrp: NuevoRenglonPedido = {
idProductoItem: p.idProducto,
cantidad: cant,
};
this.addRenglonPedido(nrp);
} else {
this.mensajeService.msg(
'No se puede solicitar mas stock para dicho producto. Por favor, verifique la sección Productos.',
MensajeModalType.ERROR
);
}
},
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
}
Expand All @@ -688,10 +701,10 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingOverlayService.activate();
this.pedidosService.calcularRenglones([nrp], cliente.idCliente)
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe(
data => this.handleRenglonPedido(data[0]),
err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
)
.subscribe({
next: data => this.handleRenglonPedido(data[0]),
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
}

Expand Down Expand Up @@ -770,10 +783,10 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingResultados = false;
this.loadingOverlayService.deactivate();
}))
.subscribe(
(r: Resultados) => this.form.get('resultados').setValue(r),
err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
)
.subscribe({
next: (r: Resultados) => this.form.get('resultados').setValue(r),
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
}

Expand All @@ -799,14 +812,14 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.loadingOverlayService.activate();
this.pedidosService.calcularRenglones(renglones, cliente.idCliente)
.pipe(finalize(() => this.loadingOverlayService.deactivate()))
.subscribe(
rps => {
.subscribe({
next: rps => {
const nuevosRenglones = [];
rps.forEach((rp: RenglonPedido) => nuevosRenglones.push({ renglonPedido: rp }));
this.renglonesPedido.setValue(nuevosRenglones);
},
err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
)
error: err => this.mensajeService.msg(err.error, MensajeModalType.ERROR)
})
;
}
}
Expand Down Expand Up @@ -847,8 +860,8 @@ export class PedidoComponent implements OnInit, OnDestroy {
);
}

esSucursalSeleccionadaPuntoDeRetiro() {
return !!this.sucursales.filter(s => s.idSucursal === this.sucursalesService.getIdSucursal()).length;
esSucursalPuntoDeRetiro(idSucursal: number): boolean {
return !!this.sucursales.filter(s => s.idSucursal === idSucursal).length;
}

toggleDescuento() {
Expand All @@ -862,5 +875,9 @@ export class PedidoComponent implements OnInit, OnDestroy {
this.form.get('descuento').disable();
}
}
}

limpiarDatos() {
this.storageService.removeItem(this.localStorageKey);
location.reload();
}
}
Loading

0 comments on commit e1a04f9

Please sign in to comment.