diff --git a/admin/src/app/settings/page.tsx b/admin/src/app/settings/page.tsx index a5503ee..a130695 100644 --- a/admin/src/app/settings/page.tsx +++ b/admin/src/app/settings/page.tsx @@ -263,6 +263,32 @@ export default function SettingsPage() { + {/* Solicitudes de profesional */} + + + + + Solicitudes de profesional + + + + + Días de espera para reintentar tras rechazo + + setG('rejection_wait_days', Number(e.target.value))} + /> + días + + Con 0 el usuario puede reintentar inmediatamente. + + + + {savingGlobal ? 'Guardando...' : 'Guardar ajustes generales'} diff --git a/backend/src/professionals/professionals.controller.ts b/backend/src/professionals/professionals.controller.ts index 8ba7f99..1c15fe0 100644 --- a/backend/src/professionals/professionals.controller.ts +++ b/backend/src/professionals/professionals.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Patch, Param, Body, UseGuards, Req, HttpCode, HttpStatus, NotFoundException } from '@nestjs/common'; +import { Controller, Get, Post, Patch, Delete, Param, Body, UseGuards, Req, HttpCode, HttpStatus, NotFoundException } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { ProfessionalsService } from './professionals.service'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; @@ -76,6 +76,13 @@ export class ProfessionalsController { return this.pros.requestProfessional(req.user.sub, dto); } + @Delete('me') + @UseGuards(JwtAuthGuard) + @ApiBearerAuth() + async deleteMe(@Req() req) { + return this.pros.resetRejected(req.user.sub); + } + @Patch('me/schedules') @UseGuards(JwtAuthGuard) @ApiBearerAuth() diff --git a/backend/src/professionals/professionals.service.ts b/backend/src/professionals/professionals.service.ts index 22fe53d..bb5b185 100644 --- a/backend/src/professionals/professionals.service.ts +++ b/backend/src/professionals/professionals.service.ts @@ -162,12 +162,22 @@ export class ProfessionalsService { if (!prof) throw new NotFoundException('Profesional no encontrado'); await this.prisma.$transaction([ - this.prisma.professionals.update({ where: { id: professionalId }, data: { is_active: false } }), + this.prisma.professionals.update({ where: { id: professionalId }, data: { is_active: false, updated_at: new Date() } }), this.prisma.users.update({ where: { id: prof.user_id }, data: { pro_state: 3 } }), ]); return { message: 'Solicitud rechazada' }; } + async resetRejected(userId: string) { + const prof = await this.prisma.professionals.findUnique({ where: { user_id: userId } }); + if (!prof) throw new NotFoundException('No se encontró solicitud'); + await this.prisma.$transaction([ + this.prisma.professionals.delete({ where: { user_id: userId } }), + this.prisma.users.update({ where: { id: userId }, data: { pro_state: 0 } }), + ]); + return { message: 'Solicitud eliminada' }; + } + async deactivate(id: string) { const prof = await this.prisma.professionals.findUnique({ where: { id } }); if (!prof) throw new NotFoundException('Profesional no encontrado');
Con 0 el usuario puede reintentar inmediatamente.