diff --git a/src/app/modules/gestion-usuarios/actualizar-usuario/actualizar-usuario.component.ts b/src/app/modules/gestion-usuarios/actualizar-usuario/actualizar-usuario.component.ts index 95fd75b..4396dea 100644 --- a/src/app/modules/gestion-usuarios/actualizar-usuario/actualizar-usuario.component.ts +++ b/src/app/modules/gestion-usuarios/actualizar-usuario/actualizar-usuario.component.ts @@ -1,16 +1,9 @@ -import { Usuario } from './../../gestion-roles/utils/gestion-usuarios.models'; import { AutenticacionService } from './../../../services/autenticacion.service'; -import { - Component, - ElementRef, - ViewChild, - ChangeDetectorRef, -} from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import {Component,ElementRef,ViewChild,ChangeDetectorRef,} from '@angular/core'; import { HistoricoUsuariosMidService } from 'src/app/services/historico-usuarios-mid.service'; import { TercerosService } from 'src/app/services/terceros.service'; -import { UsuarioNoEncontradoComponent } from '../usuario-no-encontrado/usuario-no-encontrado.component'; +import { ModalService } from 'src/app/services/modal.service'; import { ActivatedRoute } from '@angular/router'; import { ImplicitAutenticationService } from 'src/app/services/implicit-autentication.service'; @@ -48,10 +41,10 @@ export class ActualizarUsuarioComponent { private historico_service: HistoricoUsuariosMidService, private terceros_service: TercerosService, private autenticacionService: AutenticacionService, - private dialog: MatDialog, private route: ActivatedRoute, - private cdr: ChangeDetectorRef, - private authService: ImplicitAutenticationService + private changeDetector: ChangeDetectorRef, + private authService: ImplicitAutenticationService, + private modalService: ModalService ) {} ngAfterViewInit(): void { @@ -61,18 +54,21 @@ export class ActualizarUsuarioComponent { if (documento && id_periodo) { this.documentoInput.nativeElement.value = documento; this.BuscarDocumento(documento, id_periodo); - this.cdr.detectChanges(); + this.changeDetector.detectChanges(); } }); - this.authService.getRole().then(roles => { - this.permisoEdicion = this.authService.PermisoEdicion(roles); - console.log('Permiso de edición:', this.permisoEdicion); - this.permisoConsulta = this.authService.PermisoConsulta(roles); - console.log('Permiso de consulta:', this.permisoConsulta); - }).catch(error => { - console.error('Error al obtener los roles del usuario:', error); - }); + this.authService + .getRole() + .then((roles) => { + this.permisoEdicion = this.authService.PermisoEdicion(roles); + console.log('Permiso de edición:', this.permisoEdicion); + this.permisoConsulta = this.authService.PermisoConsulta(roles); + console.log('Permiso de consulta:', this.permisoConsulta); + }) + .catch((error) => { + console.error('Error al obtener los roles del usuario:', error); + }); } BuscarTercero(documento: string) { @@ -88,14 +84,14 @@ export class ActualizarUsuarioComponent { data[0].Tercero.NombreCompleto ) { this.nombreCompleto = data[0].Tercero.NombreCompleto; - this.cdr.detectChanges(); + this.changeDetector.detectChanges(); } else { - this.usuarioNoExisteModal('Usuario no encontrado.'); + this.modalService.mostrarModal('Usuario no encontrado.','warning','error'); } this.loading = false; }, error: (err: any) => { - this.usuarioNoExisteModal('Error al buscar usuario.'); + this.modalService.mostrarModal('Error al buscar usuario.','warning','error'); this.loading = false; }, }); @@ -103,7 +99,7 @@ export class ActualizarUsuarioComponent { BuscarDocumento(documento: string, idPeriodo: number) { if (!documento) { - this.usuarioNoExisteModal('Por favor, ingresa un documento válido.'); + this.modalService.mostrarModal('Por favor, ingresa un documento válido.', 'warning','error' ); return; } this.loading = true; @@ -117,17 +113,16 @@ export class ActualizarUsuarioComponent { this.identificacion = data.documento; this.emailInput.nativeElement.value = data.email; this.BuscarTercero(this.identificacion); - - this.cdr.detectChanges(); + this.changeDetector.detectChanges(); this.InfoPeriodo(idPeriodo); } else { - this.usuarioNoExisteModal('Usuario no encontrado.'); + this.modalService.mostrarModal('Usuario no encontrado.','warning','error'); } - this.loading = false + this.loading = false; }, error: (err: any) => { - this.usuarioNoExisteModal('Error al buscar el documento.'); - this.loading = false + this.modalService.mostrarModal('Error al buscar el documento.','warning','error'); + this.loading = false; }, }); } @@ -148,9 +143,9 @@ export class ActualizarUsuarioComponent { }, error: (err: any) => { console.error('Error al cargar el periodo:', err); - this.usuarioNoExisteModal('Error al cargar el periodo.') + this.modalService.mostrarModal('Error al cargar el periodo.','warning','error'); this.loading = false; - } + }, }); } @@ -179,17 +174,18 @@ export class ActualizarUsuarioComponent { next: (response: any) => { console.log('Periodo actualizado:', response); this.loading = false; + this.modalService.mostrarModal('Periodo actualizado exitosamente.','success','Actualizado'); }, error: (err: any) => { console.error('Error al actualizar periodo:', err); - this.usuarioNoExisteModal('Error al actualizar el periodo.'); + this.modalService.mostrarModal('Error al actualizar el periodo.','warning','error'); this.loading = false; }, }); }, error: (err: any) => { console.error('Error al eliminar rol:', err); - this.usuarioNoExisteModal('Error al eliminar el rol.'); + this.modalService.mostrarModal('Error al eliminar el rol.','warning','error'); this.loading = false; }, }); @@ -198,12 +194,5 @@ export class ActualizarUsuarioComponent { } } - usuarioNoExisteModal(mensaje:string): void { - this.dialog.open(UsuarioNoEncontradoComponent, { - width: '400px', - data: { mensaje: mensaje } - }); - } - estados = ['Finalizado']; } diff --git a/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.html b/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.html index fe89636..24cdf00 100644 --- a/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.html +++ b/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.html @@ -131,12 +131,17 @@ Acciones - - + + + + + diff --git a/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.ts b/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.ts index c8f8376..c4bc23b 100644 --- a/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.ts +++ b/src/app/modules/gestion-usuarios/consulta-usuarios/consulta-usuarios.component.ts @@ -7,9 +7,8 @@ import { AutenticacionService } from 'src/app/services/autenticacion.service'; import { TercerosService } from 'src/app/services/terceros.service'; import { HistoricoUsuariosMidService } from 'src/app/services/historico-usuarios-mid.service'; import { environment } from 'src/environments/environment'; +import { ModalService } from 'src/app/services/modal.service'; -import { UsuarioNoEncontradoComponent } from '../usuario-no-encontrado/usuario-no-encontrado.component'; -import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; import { ImplicitAutenticationService } from 'src/app/services/implicit-autentication.service'; @@ -28,6 +27,7 @@ interface ApiResponse { Success: boolean; Status: number; Message: string; + Metadata: any; Data: UserData[]; } @@ -68,10 +68,10 @@ export class UsuariosComponent implements OnInit { private terceros_service: TercerosService, private autenticacionService: AutenticacionService, private historico_service: HistoricoUsuariosMidService, - private dialog: MatDialog, private router: Router, - private cdr: ChangeDetectorRef, - private authService: ImplicitAutenticationService + private changeDetector: ChangeDetectorRef, + private authService: ImplicitAutenticationService, + private modalService: ModalService ) {} ngOnInit() { @@ -140,17 +140,16 @@ export class UsuariosComponent implements OnInit { this.loading = false; if (response.Success && response.Data && response.Data.length > 0) { this.dataSource.data = response.Data; - this.total = 7; - this.cdr.detectChanges(); - console.log('data:', response.Data); + this.total = response.Metadata.Count; + this.changeDetector.detectChanges(); } else { this.loading = false; - this.usuarioNoExisteModal('No se encontraron periodos.'); + this.modalService.mostrarModal('No se encontraron periodos.', 'warning','error'); } }, error: (err: any) => { - this.usuarioNoExisteModal( - 'Ocurrió un error al intentar obtener los periodos. Inténtalo nuevamente.' + this.modalService.mostrarModal( + 'Ocurrió un error al intentar obtener los periodos. Inténtalo nuevamente.', 'warning','error' ); }, }); @@ -158,8 +157,7 @@ export class UsuariosComponent implements OnInit { BuscarDocumento(documento: string, limit: number, offset: number) { if (!documento) { - this.usuarioNoExisteModal('Por favor, ingresa un documento válido.'); - console.log('no hay documento:'); + this.modalService.mostrarModal('Por favor, ingresa un documento válido.', 'warning', 'error'); return; } this.loading = true; @@ -173,26 +171,25 @@ export class UsuariosComponent implements OnInit { this.loading = false; if (response.Success && response.Data && response.Data.length > 0) { this.dataSource.data = response.Data; - this.total = 3; - this.cdr.detectChanges(); - console.log('data:', response.Data); + this.total = response.Metadata.Count; + this.changeDetector.detectChanges(); } else { - this.usuarioNoExisteModal( - `No se encontraron periodos para el documento ingresado.` + this.modalService.mostrarModal( + `No se encontraron periodos para el documento ingresado.`, 'warning','error' ); } }, error: (err: any) => { this.loading = false; - this.usuarioNoExisteModal( - `Ocurrió un error al buscar el documento ingresado. Inténtalo nuevamente.` + this.modalService.mostrarModal( + `Ocurrió un error al buscar el documento ingresado. Inténtalo nuevamente.`, 'warning','error' ); }, }); } // BuscarCorreo(correo: string) { // if (!correo) { - // this.usuarioNoExisteModal(); + // this.modalService.mostrarModal('Por favor, ingresa un documento válido.', 'warning', 'error'); // return; // } @@ -204,11 +201,11 @@ export class UsuariosComponent implements OnInit { // this.BuscarTercero(this.identificacion); // this.documentoInput.nativeElement.value = this.identificacion; // } else { - // this.usuarioNoExisteModal(); + // this.modalService.mostrarModal(); // } // }, // error: (err: any) => { - // this.usuarioNoExisteModal(); + // this.modalService.mostrarModal(); // }, // }); // } @@ -258,14 +255,6 @@ export class UsuariosComponent implements OnInit { return currentFilter.state || ''; } - usuarioNoExisteModal(mensaje: string): void { - console.log('Mostrando modal con mensaje:', mensaje); - this.dialog.open(UsuarioNoEncontradoComponent, { - width: '400px', - data: { mensaje: mensaje }, - }); - } - // customFilterPredicate() { // return (data: UserData, filter: string): boolean => { // const filterObj = JSON.parse(filter); diff --git a/src/app/modules/gestion-usuarios/gestion-usuarios.module.ts b/src/app/modules/gestion-usuarios/gestion-usuarios.module.ts index 7d62c79..1189d4e 100644 --- a/src/app/modules/gestion-usuarios/gestion-usuarios.module.ts +++ b/src/app/modules/gestion-usuarios/gestion-usuarios.module.ts @@ -11,6 +11,7 @@ import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; import { MatDatepickerModule} from '@angular/material/datepicker'; import { MatNativeDateModule } from '@angular/material/core'; import { NgFor } from '@angular/common'; @@ -22,7 +23,6 @@ import { ActualizarUsuarioComponent } from './actualizar-usuario/actualizar-usua import { UsuariosComponent } from './consulta-usuarios/consulta-usuarios.component'; import { HistoricoUsuariosMidService } from 'src/app/services/historico-usuarios-mid.service'; import { TercerosService } from 'src/app/services/terceros.service'; -import { UsuarioNoEncontradoComponent } from './usuario-no-encontrado/usuario-no-encontrado.component'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatPaginatorModule } from '@angular/material/paginator'; @@ -31,7 +31,6 @@ import { MatPaginatorModule } from '@angular/material/paginator'; declarations: [ RegistrarUsuarioComponent, ActualizarUsuarioComponent, - UsuarioNoEncontradoComponent, UsuariosComponent, ], imports: [ @@ -45,6 +44,7 @@ import { MatPaginatorModule } from '@angular/material/paginator'; MatSelectModule, MatButtonModule, MatIconModule, + MatMenuModule, MatDatepickerModule, MatNativeDateModule, NgFor, diff --git a/src/app/modules/gestion-usuarios/registrar-usuario/registrar-usuario.component.ts b/src/app/modules/gestion-usuarios/registrar-usuario/registrar-usuario.component.ts index d9eedfd..8bde2a8 100644 --- a/src/app/modules/gestion-usuarios/registrar-usuario/registrar-usuario.component.ts +++ b/src/app/modules/gestion-usuarios/registrar-usuario/registrar-usuario.component.ts @@ -1,14 +1,9 @@ -import { - Usuario, - Rol, -} from './../../gestion-roles/utils/gestion-usuarios.models'; import { AutenticacionService } from './../../../services/autenticacion.service'; import { Component, ElementRef, ViewChild } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; import { HistoricoUsuariosMidService } from 'src/app/services/historico-usuarios-mid.service'; import { TercerosService } from 'src/app/services/terceros.service'; -import { UsuarioNoEncontradoComponent } from '../usuario-no-encontrado/usuario-no-encontrado.component'; +import { ModalService } from 'src/app/services/modal.service'; export interface RolRegistro { Nombre: string; @@ -35,7 +30,8 @@ export class RegistrarUsuarioComponent { private historico_service: HistoricoUsuariosMidService, private terceros_service: TercerosService, private autenticacionService: AutenticacionService, - private dialog: MatDialog + private modalService: ModalService + ) {} ngOnInit(): void { @@ -57,7 +53,7 @@ export class RegistrarUsuarioComponent { }, error: (err: any) => { console.error('Error al obtener roles:', err); - this.usuarioNoExisteModal('Error al obtener los roles. Por favor, intenta nuevamente.'); + this.modalService.mostrarModal('Error al obtener los roles. Por favor, intenta nuevamente.', 'warning','error'); this.loading = false; }, }); @@ -95,7 +91,7 @@ export class RegistrarUsuarioComponent { }, error: (err: any) => { console.error('Error al crear periodo:', err); - this.usuarioNoExisteModal('Error al crear el periodo para el usuario.'); + this.modalService.mostrarModal('Error al crear el periodo para el usuario.', 'warning','error'); this.loading = false; }, }); @@ -104,16 +100,18 @@ export class RegistrarUsuarioComponent { .subscribe({ next: (response: any) => { console.log('Rol creado:', response); + this.loading = false; + this.modalService.mostrarModal('Usuario, periodo y rol creados exitosamente.', 'success', 'Creado'); }, error: (err: any) => { console.error('Error al crear rol:', err); - this.usuarioNoExisteModal('Error al asignar el rol al usuario.'); + this.modalService.mostrarModal('Error al asignar el rol al usuario.', 'warning','error'); }, }); }, error: (err: any) => { console.error('Error al crear usuario:', err); - this.usuarioNoExisteModal('Error al crear el usuario. Verifica los datos e intenta nuevamente.'); + this.modalService.mostrarModal('Error al crear el usuario. Verifica los datos e intenta nuevamente.', 'warning','error'); this.loading = false; }, }); @@ -134,12 +132,12 @@ export class RegistrarUsuarioComponent { this.nombreCompleto = data[0].Tercero.NombreCompleto; this.loading = false; } else { - this.usuarioNoExisteModal('No se encontraron datos del usuario con el documento proporcionado.'); + this.modalService.mostrarModal('No se encontraron datos del usuario con el documento proporcionado.', 'warning','error'); this.loading = false; } }, error: (err: any) => { - this.usuarioNoExisteModal('No se encontraron datos del usuario ingresado'); + this.modalService.mostrarModal('No se encontraron datos del usuario ingresado', 'warning','error'); this.loading = false; }, }); @@ -147,7 +145,7 @@ export class RegistrarUsuarioComponent { BuscarDocumento(documento: string) { if (!documento) { - this.usuarioNoExisteModal('Por favor, ingresa un documento válido.'); + this.modalService.mostrarModal('Por favor, ingresa un documento válido.', 'warning','error'); return; } this.loading = true; @@ -162,12 +160,12 @@ export class RegistrarUsuarioComponent { this.emailInput.nativeElement.value = data.email; this.loading = false; } else { - this.usuarioNoExisteModal('No se encontraron datos del documento proporcionado.'); + this.modalService.mostrarModal('No se encontraron datos del documento proporcionado.', 'warning','error'); this.loading = false; } }, error: (err: any) => { - this.usuarioNoExisteModal('No se encontraron datos del usuario ingresado'); + this.modalService.mostrarModal('No se encontraron datos del usuario ingresado', 'warning','error'); this.loading = false; }, }); @@ -175,7 +173,7 @@ export class RegistrarUsuarioComponent { BuscarCorreo(correo: string) { if (!correo) { - this.usuarioNoExisteModal('Por favor, ingresa un correo válido.'); + this.modalService.mostrarModal('Por favor, ingresa un correo válido.', 'warning','error'); return; } this.loading = true; @@ -188,23 +186,15 @@ export class RegistrarUsuarioComponent { this.documentoInput.nativeElement.value = this.identificacion; this.loading = false; } else { - this.usuarioNoExisteModal('No se encontraron datos asociados al correo proporcionado.'); + this.modalService.mostrarModal('No se encontraron datos asociados al correo proporcionado.', 'warning','error'); this.loading = false; } }, error: (err: any) => { - this.usuarioNoExisteModal('Error al buscar el correo. Verifica los datos e intenta nuevamente.'); + this.modalService.mostrarModal('Error al buscar el correo. Verifica los datos e intenta nuevamente.', 'warning','error'); this.loading = false; }, }); } - usuarioNoExisteModal( mensaje: string): void { - this.dialog.open(UsuarioNoEncontradoComponent, { - width: '400px', - data: { - mensaje: mensaje - } - }); - } } diff --git a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.html b/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.html deleted file mode 100644 index d2f72b3..0000000 --- a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.scss b/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.spec.ts b/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.spec.ts deleted file mode 100644 index 3c35889..0000000 --- a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UsuarioNoEncontradoComponent } from './usuario-no-encontrado.component'; - -describe('UsuarioNoEncontradoComponent', () => { - let component: UsuarioNoEncontradoComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - declarations: [UsuarioNoEncontradoComponent] - }); - fixture = TestBed.createComponent(UsuarioNoEncontradoComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.ts b/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.ts deleted file mode 100644 index fab783b..0000000 --- a/src/app/modules/gestion-usuarios/usuario-no-encontrado/usuario-no-encontrado.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, Inject,OnInit } from '@angular/core'; -import Swal from 'sweetalert2'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; - - @Component({ - selector: 'app-usuario-no-encontrado', - templateUrl: './usuario-no-encontrado.component.html', - styleUrls: ['./usuario-no-encontrado.component.scss'] -}) - -export class UsuarioNoEncontradoComponent implements OnInit{ - mensaje: string; - - constructor(@Inject(MAT_DIALOG_DATA) public data: any) { - this.mensaje = data.mensaje; - } - ngOnInit(): void { - this.mostrarModal(); - } - mostrarModal(): void { - Swal.fire({ - html: ` -

ERROR

-

${this.mensaje}

- `, - icon: "warning", - confirmButtonText: 'OK', - confirmButtonColor: 'rgb(100, 21, 21)' - }); - } -} \ No newline at end of file diff --git a/src/app/services/autenticacion.service.ts b/src/app/services/autenticacion.service.ts index 489ba27..0d6474e 100644 --- a/src/app/services/autenticacion.service.ts +++ b/src/app/services/autenticacion.service.ts @@ -13,27 +13,23 @@ export class AutenticacionService { getEmail(endpoint: any, email: string): any { this.requestManager.setPath('AUTENTICACION'); - console.log("path:", this.requestManager); const payload = { user: email }; return this.requestManager.post(endpoint, payload); } getDocumento(endpoint: any, documento: string): any { this.requestManager.setPath('AUTENTICACION'); - console.log("path:", this.requestManager); const payload = { numero: documento }; return this.requestManager.post(endpoint, payload); } getPeriodos(endpoint: any): any { this.requestManager.setPath('AUTENTICACION'); - console.log("path:", this.requestManager); return this.requestManager.get(endpoint); } PostRol(endpoint: any, rol: string, user: string): any { this.requestManager.setPath('AUTENTICACION'); - console.log("path:", this.requestManager); const payload = { rol: rol, user: user }; return this.requestManager.post(endpoint, payload); } diff --git a/src/app/services/modal.service.ts b/src/app/services/modal.service.ts new file mode 100644 index 0000000..cf4c4a7 --- /dev/null +++ b/src/app/services/modal.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import Swal from 'sweetalert2'; + +@Injectable({ + providedIn: 'root' +}) +export class ModalService { + + constructor() { } + + mostrarModal( + mensaje: string, + icono: 'success' | 'error' | 'warning' | 'info', + titulo: string): void { + Swal.fire({ + title: titulo.toUpperCase(), + text: mensaje, + icon: icono, + confirmButtonText: 'OK', + confirmButtonColor: 'rgb(100, 21, 21)', + }); + } +} diff --git a/src/environments/environment.development.ts b/src/environments/environment.development.ts index 0196e88..bbbaf2a 100644 --- a/src/environments/environment.development.ts +++ b/src/environments/environment.development.ts @@ -2,7 +2,7 @@ export const environment = { production: false, SISTEMA_INFORMACION_ID: 1, ROLES_CONSULTA: ['JEFE_DEPENDENCIA', 'AUDITOR', 'EJECUTOR', 'ESTUDIANTE'], - ROLES_CONSULTA_EDICION: ['ADMIN_SISIFO', 'SOPORTE_OAS'], + ROLES_CONSULTA_EDICION: ['ADMIN_SISIFO', 'SOPORTE_OAS', 'ADMIN_SGA'], AUTENTICACION_MID: 'https://autenticacion.portaloas.udistrital.edu.co/apioas/autenticacion_mid/v1/', TOKEN: { AUTORIZATION_URL: "https://autenticacion.portaloas.udistrital.edu.co/oauth2/authorize",