From add95d6c9ac4ea3b9b739719da79a3f9d29b79a1 Mon Sep 17 00:00:00 2001 From: MarianoCampetella Date: Thu, 12 Sep 2024 15:12:06 -0300 Subject: [PATCH] feat(MAT-174): Validar profesional con Renaper --- src/app/app.module.ts | 4 +- .../profesionales/header-profesional.html | 4 + .../listar-profesionales-detalle.html | 2 + .../profesionales/profesional.component.ts | 130 +++++++++++------- .../solicitar-turno-renovacion.component.ts | 49 +++---- src/app/interfaces/IProfesional.ts | 1 + src/app/services/validacion.service.ts | 16 +++ 7 files changed, 135 insertions(+), 71 deletions(-) create mode 100644 src/app/services/validacion.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d64f0fe2..cb0f6f16 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -18,6 +18,7 @@ import { ScrollComponent } from './components/base/plex-scroll.component'; // Servicios import { AgendaService } from './services/agenda.service'; +import { ValidacionService } from './services/validacion.service'; import { CambioDniService } from './services/cambioDni.service'; import { PaisService } from './services/pais.service'; import { ProvinciaService } from './services/provincia.service'; @@ -210,7 +211,8 @@ import { FiltrosRenovacionComponent } from './components/profesionales/filtros-r ListadoTurnosPdfComponent, ZonaSanitariaService, DriveService, - PdfService + PdfService, + ValidacionService ], bootstrap: [AppComponent] }) diff --git a/src/app/components/profesionales/header-profesional.html b/src/app/components/profesionales/header-profesional.html index 0614704d..a871eb1d 100644 --- a/src/app/components/profesionales/header-profesional.html +++ b/src/app/components/profesionales/header-profesional.html @@ -14,6 +14,10 @@ No tiene supervisor + + {{profesional.validadoRenaper ? "VALIDADO":"NO VALIDADO"}} + +
editar Deshabilitar diff --git a/src/app/components/profesionales/listar-profesionales-detalle.html b/src/app/components/profesionales/listar-profesionales-detalle.html index 1b583176..f4428fed 100644 --- a/src/app/components/profesionales/listar-profesionales-detalle.html +++ b/src/app/components/profesionales/listar-profesionales-detalle.html @@ -8,6 +8,8 @@ {{ profesional.profesionalMatriculado?'MATRICULADO':'NO MATRICULADO' }} + + {{profesional.validadoRenaper ? 'VALIDADO':'NO VALIDADO' }}
{{ profesional.apellido + ', '+ profesional.nombre}}
{{ profesional.documento }}
diff --git a/src/app/components/profesionales/profesional.component.ts b/src/app/components/profesionales/profesional.component.ts index 01aa1795..78072d2c 100644 --- a/src/app/components/profesionales/profesional.component.ts +++ b/src/app/components/profesionales/profesional.component.ts @@ -17,8 +17,9 @@ import { Auth } from '@andes/auth'; import { ActivatedRoute, Router } from '@angular/router'; import { TurnoService } from '../../services/turno.service'; import { catchError, map, switchMap } from 'rxjs/operators'; -import { of, Observable } from 'rxjs'; +import { of, Observable, forkJoin } from 'rxjs'; import * as moment from 'moment'; +import { ValidacionService } from './../../services/validacion.service'; @Component({ selector: 'app-profesional', @@ -56,6 +57,7 @@ export class ProfesionalComponent implements OnInit { @Input() public profesional: IProfesional = { id: null, habilitado: true, + validadoRenaper: false, nombre: null, apellido: null, tipoDocumento: null, @@ -89,36 +91,36 @@ export class ProfesionalComponent implements OnInit { ultimaActualizacion: new Date(), activo: true }, - { - tipo: 'legal', - valor: null, - codigoPostal: null, - ubicacion: { - localidad: null, - provincia: null, - pais: { - 'id': '57f3b5c469fe79a598e6281f', - 'nombre': 'Argentina' - }, - }, - ultimaActualizacion: new Date(), - activo: true - }, - { - tipo: 'profesional', - valor: null, - codigoPostal: null, - ubicacion: { - localidad: null, - provincia: null, - pais: { - 'id': '57f3b5c469fe79a598e6281f', - 'nombre': 'Argentina' - }, - }, - ultimaActualizacion: new Date(), - activo: true - }], + { + tipo: 'legal', + valor: null, + codigoPostal: null, + ubicacion: { + localidad: null, + provincia: null, + pais: { + 'id': '57f3b5c469fe79a598e6281f', + 'nombre': 'Argentina' + }, + }, + ultimaActualizacion: new Date(), + activo: true + }, + { + tipo: 'profesional', + valor: null, + codigoPostal: null, + ubicacion: { + localidad: null, + provincia: null, + pais: { + 'id': '57f3b5c469fe79a598e6281f', + 'nombre': 'Argentina' + }, + }, + ultimaActualizacion: new Date(), + activo: true + }], fotoArchivo: null, firmas: null, profesionalMatriculado: false, @@ -167,7 +169,8 @@ export class ProfesionalComponent implements OnInit { public auth: Auth, private router: Router, private route: ActivatedRoute, - private location: Location + private location: Location, + private validacionService: ValidacionService ) { } ngOnInit() { @@ -305,18 +308,34 @@ export class ProfesionalComponent implements OnInit { } return null; }), + switchMap(candidato => { + const profValid = this.validacionService.post({ documento: this.profesional.documento, sexo: this.profesional.sexo }) + return forkJoin([profValid, of(candidato)]); + }), switchMap(responseActualizar => { - if (responseActualizar !== null) { - // hubo match - if (responseActualizar) { - // actualizar candidato - return this._profesionalService.patchProfesional(this.profesional.id, this.profesional); + console.log(responseActualizar[0]); + // Verificamos si esta validado por renaper. En caso de ser extranjero se registra sin problemas. + if (this.profesional.nacionalidad.nombre !== 'Argentina' || !responseActualizar[0].error || responseActualizar[0].menssage) { + // Si el profesional es extranjero entonces no puede ser validado por renaper. + if (this.profesional.nacionalidad.nombre === 'Argentina') { + this.profesional.validadoRenaper = true; } - this.profesional.id = undefined; - return of(null); // no actualiza + if (responseActualizar[1] !== null) { + // hubo match + if (responseActualizar[1]) { + // actualizar candidato + return this._profesionalService.patchProfesional(this.profesional.id, this.profesional); + } + this.profesional.id = undefined; + } + // no hubo match + this.profesional.validadoRenaper = true; + return this._profesionalService.saveProfesional({ profesional: this.profesional }); + } else { // No existe profesional con ese dni y sexo + this.plex.info('warning', 'Revise los datos ingresados.', 'Profesional no encontrado en renaper.'); + this.deshabilitarBoton = false; } - // no hubo match - return this._profesionalService.saveProfesional({ profesional: this.profesional }); + return of(null); }), switchMap(profesionalSaved => { if (!profesionalSaved) { @@ -482,13 +501,32 @@ export class ProfesionalComponent implements OnInit { elem.tipo = ((typeof elem.tipo === 'string') ? elem.tipo : (Object(elem.tipo).id)); return elem; }); - this._profesionalService.putProfesional(this.profesional) - .subscribe(resp => { + + this.validacionService.post({ + documento: this.profesional.documento, + sexo: this.profesional.sexo + }).pipe( + switchMap(resultado => { + if (resultado.error || resultado.message) { + this.plex.info('warning', 'Revise los datos ingresados', 'Profesional no encontrado'); + return of(null); + } else { + this.profesional.validadoRenaper = true; + return this._profesionalService.putProfesional(this.profesional); + } + }), + catchError(() => { + this.plex.info('danger', 'Error durante la validación'); + return of(null); + }) + ).subscribe(resp => { + if (resp) { this.profesional = resp; - this.plex.toast('success', 'Se modificó con éxito!', 'informacion', 1000); this.editado.emit(true); - }); - this.volverProfesional(); + this.plex.toast('success', 'Se modificó con éxito!', 'informacion', 1000); + this.volverProfesional(); + } + }); } else { this.plex.toast('danger', 'Falta completar los campos requeridos', 'informacion', 1000); } diff --git a/src/app/components/turnos/solicitar-turno-renovacion.component.ts b/src/app/components/turnos/solicitar-turno-renovacion.component.ts index e61f9be8..522fe732 100644 --- a/src/app/components/turnos/solicitar-turno-renovacion.component.ts +++ b/src/app/components/turnos/solicitar-turno-renovacion.component.ts @@ -38,6 +38,7 @@ export class SolicitarTurnoRenovacionComponent implements OnInit { @Input() public profesional: IProfesional = { id: null, habilitado: true, + validadoRenaper: false, nombre: null, apellido: null, tipoDocumento: null, @@ -70,30 +71,30 @@ export class SolicitarTurnoRenovacionComponent implements OnInit { ultimaActualizacion: new Date(), activo: true }, - { - tipo: 'legal', - valor: null, - codigoPostal: null, - ubicacion: { - localidad: null, - provincia: null, - pais: null, - }, - ultimaActualizacion: new Date(), - activo: true - }, - { - tipo: 'profesional', - valor: null, - codigoPostal: null, - ubicacion: { - localidad: null, - provincia: null, - pais: null, - }, - ultimaActualizacion: new Date(), - activo: true - } + { + tipo: 'legal', + valor: null, + codigoPostal: null, + ubicacion: { + localidad: null, + provincia: null, + pais: null, + }, + ultimaActualizacion: new Date(), + activo: true + }, + { + tipo: 'profesional', + valor: null, + codigoPostal: null, + ubicacion: { + localidad: null, + provincia: null, + pais: null, + }, + ultimaActualizacion: new Date(), + activo: true + } ], fotoArchivo: null, firmas: null, diff --git a/src/app/interfaces/IProfesional.ts b/src/app/interfaces/IProfesional.ts index 397fb035..7ccd4691 100644 --- a/src/app/interfaces/IProfesional.ts +++ b/src/app/interfaces/IProfesional.ts @@ -5,6 +5,7 @@ import { export interface IProfesional { id: String; habilitado: Boolean; + validadoRenaper?: Boolean; nombre: String; apellido: String; tipoDocumento: String; diff --git a/src/app/services/validacion.service.ts b/src/app/services/validacion.service.ts new file mode 100644 index 00000000..aa46e42b --- /dev/null +++ b/src/app/services/validacion.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { Server } from '@andes/shared'; +import { Observable } from 'rxjs'; + + +@Injectable() +export class ValidacionService { + + private url = '/core-v2/mpi/validacion'; + constructor(private server: Server) { } + + post(params: any): Observable { + return this.server.post(this.url, params, { showError: false }); + } + +} \ No newline at end of file