- Fix: Avatar upload usando Supabase Client com RLS policies - Fix: Profile update usando Supabase Client - Fix: Timezone handling em datas de consultas - Fix: Filtros de consultas passadas/futuras - Fix: Appointment cancellation com Supabase Client - Fix: Navegação após booking de consulta - Fix: Report service usando Supabase Client - Fix: Campo created_by em relatórios - Fix: URL pública de avatares no Storage - Fix: Modal de criação de usuário com scroll - Feat: Sistema completo de gestão de consultas - Feat: Painéis para paciente, médico, secretária e admin - Feat: Upload de avatares - Feat: Sistema de relatórios médicos - Feat: Gestão de disponibilidade de médicos
391 lines
12 KiB
Markdown
391 lines
12 KiB
Markdown
# API User Creation Testing Results
|
|
|
|
**Test Date:** 2025-11-05 13:21:51
|
|
**Admin User:** riseup@popcode.com.br
|
|
**Total Users Tested:** 18
|
|
|
|
**Secretaria Tests:** 2025-11-05 (quemquiser1@gmail.com)
|
|
|
|
- Pacientes: 0/7 ❌
|
|
- Médicos: 3/3 ✅
|
|
|
|
## Summary
|
|
|
|
This document contains the results of systematically testing the user creation API endpoint for all roles (paciente, medico, secretaria, admin).
|
|
|
|
## Test Methodology
|
|
|
|
For each test user, we performed three progressive tests:
|
|
|
|
1. **Minimal fields test**: email, password, full_name, role only
|
|
2. **With CPF**: If minimal failed, add cpf field
|
|
3. **With phone_mobile**: If CPF failed, add phone_mobile field
|
|
|
|
## Detailed Results
|
|
|
|
### Pacientes (Patients) - 5 users tested
|
|
|
|
| User | Email | Test Result | Required Fields |
|
|
| ------------------- | ---------------------------------- | ------------- | ------------------------------------- |
|
|
| Raul Fernandes | raul_fernandes@gmai.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Ricardo Galvao | ricardo-galvao88@multcap.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Mirella Brito | mirella_brito@santoandre.sp.gov.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Gael Nascimento | gael_nascimento@jpmchase.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Eliane Olivia Assis | eliane_olivia_assis@vivalle.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
|
|
### Medicos (Doctors) - 5 users tested
|
|
|
|
| User | Email | Test Result | Required Fields |
|
|
| ------------------------------ | ------------------------------------------ | ------------- | ------------------------------------- |
|
|
| Vinicius Fernando Lucas Almada | viniciusfernandoalmada@leonardopereira.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Rafaela Sabrina Ribeiro | rafaela_sabrina_ribeiro@multmed.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Juliana Nina Cristiane Souza | juliana_souza@tasaut.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Sabrina Cristiane Jesus | sabrina_cristiane_jesus@moderna.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Levi Marcelo Vitor Bernardes | levi-bernardes73@ibest.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
|
|
### Secretarias (Secretaries) - 5 users tested
|
|
|
|
| User | Email | Test Result | Required Fields |
|
|
| ------------------------------ | ------------------------------------- | ------------- | ------------------------------------- |
|
|
| Mario Geraldo Barbosa | mario_geraldo_barbosa@weatherford.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Isabel Lavinia Dias | isabel-dias74@edpbr.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Luan Lorenzo Mendes | luan.lorenzo.mendes@atualvendas.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Julio Tiago Bento Rocha | julio-rocha85@lonza.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Flavia Luiza Priscila da Silva | flavia-dasilva86@prositeweb.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
|
|
### Administrators - 3 users tested
|
|
|
|
| User | Email | Test Result | Required Fields |
|
|
| ---------------------------- | --------------------------------- | ------------- | ------------------------------------- |
|
|
| Nicole Manuela Vanessa Viana | nicole-viana74@queirozgalvao.com | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Danilo Kaue Gustavo Lopes | danilo_lopes@tursi.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
| Thiago Enzo Vieira | thiago_vieira@gracomonline.com.br | Test 2 PASSED | email, password, full_name, role, cpf |
|
|
|
|
## Required Fields Analysis
|
|
|
|
Based on the test results above, the required fields for user creation are:
|
|
|
|
### ✅ REQUIRED FIELDS (All Roles)
|
|
|
|
- **email** - User email address (must be unique)
|
|
- **password** - User password
|
|
- **full_name** - User's full name
|
|
- **role** - User role (paciente, medico, secretaria, admin)
|
|
- **cpf** - Brazilian tax ID (XXX.XXX.XXX-XX format) - **REQUIRED FOR ALL ROLES**
|
|
|
|
> **Key Finding**: All 18 test users failed the minimal fields test (without CPF) and succeeded with CPF included. This confirms that CPF is mandatory for user creation across all roles.
|
|
|
|
### ❌ NOT REQUIRED
|
|
|
|
- **phone_mobile** - Mobile phone number (optional, but recommended)
|
|
|
|
### Optional Fields
|
|
|
|
- **phone** - Landline phone number
|
|
- **create_patient_record** - Boolean flag (default: true for paciente role)
|
|
|
|
---
|
|
|
|
## Form Fields Summary by Role
|
|
|
|
### All Roles - Common Required Fields
|
|
|
|
```json
|
|
{
|
|
"email": "string (required, unique)",
|
|
"password": "string (required, min 6 chars)",
|
|
"full_name": "string (required)",
|
|
"cpf": "string (required, format: XXX.XXX.XXX-XX)",
|
|
"role": "string (required: paciente|medico|secretaria|admin)"
|
|
}
|
|
```
|
|
|
|
### Paciente (Patient) - Complete Form Fields
|
|
|
|
```json
|
|
{
|
|
"email": "string (required)",
|
|
"password": "string (required)",
|
|
"full_name": "string (required)",
|
|
"cpf": "string (required)",
|
|
"role": "paciente",
|
|
"phone_mobile": "string (optional, format: (XX) XXXXX-XXXX)",
|
|
"phone": "string (optional)",
|
|
"create_patient_record": "boolean (optional, default: true)"
|
|
}
|
|
```
|
|
|
|
### Medico (Doctor) - Complete Form Fields
|
|
|
|
```json
|
|
{
|
|
"email": "string (required)",
|
|
"password": "string (required)",
|
|
"full_name": "string (required)",
|
|
"cpf": "string (required)",
|
|
"role": "medico",
|
|
"phone_mobile": "string (optional)",
|
|
"phone": "string (optional)",
|
|
"crm": "string (optional - doctor registration number)",
|
|
"specialty": "string (optional)"
|
|
}
|
|
```
|
|
|
|
### Secretaria (Secretary) - Complete Form Fields
|
|
|
|
```json
|
|
{
|
|
"email": "string (required)",
|
|
"password": "string (required)",
|
|
"full_name": "string (required)",
|
|
"cpf": "string (required)",
|
|
"role": "secretaria",
|
|
"phone_mobile": "string (optional)",
|
|
"phone": "string (optional)"
|
|
}
|
|
```
|
|
|
|
### Admin (Administrator) - Complete Form Fields
|
|
|
|
```json
|
|
{
|
|
"email": "string (required)",
|
|
"password": "string (required)",
|
|
"full_name": "string (required)",
|
|
"cpf": "string (required)",
|
|
"role": "admin",
|
|
"phone_mobile": "string (optional)",
|
|
"phone": "string (optional)"
|
|
}
|
|
```
|
|
|
|
## API Endpoint Documentation
|
|
|
|
### Endpoint
|
|
|
|
```
|
|
POST https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/create-user-with-password
|
|
```
|
|
|
|
### Authentication
|
|
|
|
Requires admin user authentication token in Authorization header.
|
|
|
|
### Headers
|
|
|
|
```json
|
|
{
|
|
"Authorization": "Bearer <access_token>",
|
|
"Content-Type": "application/json"
|
|
}
|
|
```
|
|
|
|
### Request Body Schema
|
|
|
|
```json
|
|
{
|
|
"email": "string (required)",
|
|
"password": "string (required)",
|
|
"full_name": "string (required)",
|
|
"role": "paciente|medico|secretaria|admin (required)",
|
|
"cpf": "string (format: XXX.XXX.XXX-XX)",
|
|
"phone_mobile": "string (format: (XX) XXXXX-XXXX)",
|
|
"phone": "string (optional)",
|
|
"create_patient_record": "boolean (optional, default: true)"
|
|
}
|
|
```
|
|
|
|
### Example Request
|
|
|
|
```bash
|
|
curl -X POST "https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/create-user-with-password" \
|
|
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"email": "user@example.com",
|
|
"password": "securePassword123",
|
|
"full_name": "John Doe",
|
|
"role": "paciente",
|
|
"cpf": "123.456.789-00",
|
|
"phone_mobile": "(11) 98765-4321"
|
|
}'
|
|
```
|
|
|
|
## Recommendations
|
|
|
|
1. **Form Validation**: Update all user creation forms to enforce the required fields identified above
|
|
2. **Error Handling**: Implement clear error messages for missing required fields
|
|
3. **CPF Validation**: Add client-side CPF format validation and uniqueness checks
|
|
4. **Phone Format**: Validate phone number format before submission
|
|
5. **Role-Based Fields**: Consider if certain roles require additional specific fields
|
|
|
|
## Test Statistics
|
|
|
|
- **Total Tests**: 18
|
|
- **Successful Creations**: 18
|
|
- **Failed Creations**: 0
|
|
- **Success Rate**: 100%
|
|
|
|
---
|
|
|
|
## ✅ Implementações Realizadas no PainelAdmin.tsx
|
|
|
|
**Data de Implementação:** 2025-11-05
|
|
|
|
### 1. Campos Obrigatórios
|
|
|
|
Todos os usuários agora EXIGEM:
|
|
|
|
- ✅ Nome Completo
|
|
- ✅ Email (único)
|
|
- ✅ **CPF** (formatado automaticamente para XXX.XXX.XXX-XX)
|
|
- ✅ **Senha** (mínimo 6 caracteres)
|
|
- ✅ Role/Papel
|
|
|
|
### 2. Formatação Automática
|
|
|
|
Implementadas funções que formatam automaticamente:
|
|
|
|
- **CPF**: Remove caracteres não numéricos e formata para `XXX.XXX.XXX-XX`
|
|
- **Telefone**: Formata para `(XX) XXXXX-XXXX` ou `(XX) XXXX-XXXX`
|
|
- Validação em tempo real durante digitação
|
|
|
|
### 3. Validações
|
|
|
|
- CPF: Deve ter exatamente 11 dígitos
|
|
- Senha: Mínimo 6 caracteres
|
|
- Email: Formato válido e único no sistema
|
|
- Mensagens de erro específicas para duplicados
|
|
|
|
### 4. Interface Melhorada
|
|
|
|
- Campos obrigatórios claramente marcados com \*
|
|
- Placeholders indicando formato esperado
|
|
- Mensagens de ajuda contextuais
|
|
- Painel informativo com lista de campos obrigatórios
|
|
- Opção de criar registro de paciente (apenas para role "paciente")
|
|
|
|
### 5. Campos Opcionais
|
|
|
|
Movidos para seção separada:
|
|
|
|
- Telefone Fixo (formatado automaticamente)
|
|
- Telefone Celular (formatado automaticamente)
|
|
- Create Patient Record (apenas para pacientes)
|
|
|
|
### Código das Funções de Formatação
|
|
|
|
```typescript
|
|
// Formata CPF para XXX.XXX.XXX-XX
|
|
const formatCPF = (value: string): string => {
|
|
const numbers = value.replace(/\D/g, "");
|
|
if (numbers.length <= 3) return numbers;
|
|
if (numbers.length <= 6) return `${numbers.slice(0, 3)}.${numbers.slice(3)}`;
|
|
if (numbers.length <= 9)
|
|
return `${numbers.slice(0, 3)}.${numbers.slice(3, 6)}.${numbers.slice(6)}`;
|
|
return `${numbers.slice(0, 3)}.${numbers.slice(3, 6)}.${numbers.slice(
|
|
6,
|
|
9
|
|
)}-${numbers.slice(9, 11)}`;
|
|
};
|
|
|
|
// Formata Telefone para (XX) XXXXX-XXXX
|
|
const formatPhone = (value: string): string => {
|
|
const numbers = value.replace(/\D/g, "");
|
|
if (numbers.length <= 2) return numbers;
|
|
if (numbers.length <= 7)
|
|
return `(${numbers.slice(0, 2)}) ${numbers.slice(2)}`;
|
|
if (numbers.length <= 11)
|
|
return `(${numbers.slice(0, 2)}) ${numbers.slice(2, 7)}-${numbers.slice(
|
|
7
|
|
)}`;
|
|
return `(${numbers.slice(0, 2)}) ${numbers.slice(2, 7)}-${numbers.slice(
|
|
7,
|
|
11
|
|
)}`;
|
|
};
|
|
```
|
|
|
|
### Exemplo de Uso no Formulário
|
|
|
|
```tsx
|
|
<input
|
|
type="text"
|
|
required
|
|
value={userCpf}
|
|
onChange={(e) => setUserCpf(formatCPF(e.target.value))}
|
|
maxLength={14}
|
|
placeholder="000.000.000-00"
|
|
/>
|
|
```
|
|
|
|
---
|
|
|
|
## Secretaria Role Tests (2025-11-05)
|
|
|
|
**User:** quemquiser1@gmail.com (Secretária)
|
|
**Test Script:** test-secretaria-api.ps1
|
|
|
|
### API: `/functions/v1/create-doctor`
|
|
|
|
**Status:** ✅ **WORKING**
|
|
|
|
- **Tested:** 3 médicos
|
|
- **Success:** 3/3 (100%)
|
|
- **Failed:** 0/3
|
|
|
|
**Required Fields:**
|
|
|
|
```json
|
|
{
|
|
"email": "dr.exemplo@example.com",
|
|
"full_name": "Dr. Nome Completo",
|
|
"cpf": "12345678901",
|
|
"crm": "123456",
|
|
"crm_uf": "SP",
|
|
"phone_mobile": "(11) 98765-4321"
|
|
}
|
|
```
|
|
|
|
**Notes:**
|
|
|
|
- CPF must be without formatting (only digits)
|
|
- CRM and CRM_UF are mandatory
|
|
- phone_mobile is accepted with or without formatting
|
|
|
|
### API: `/rest/v1/patients` (REST Direct)
|
|
|
|
**Status:** ✅ **WORKING**
|
|
|
|
- **Tested:** 7 pacientes
|
|
- **Success:** 4/7 (57%)
|
|
- **Failed:** 3/7 (CPF inválido, 1 duplicado)
|
|
|
|
**Required Fields:**
|
|
|
|
```json
|
|
{
|
|
"full_name": "Nome Completo",
|
|
"cpf": "11144477735",
|
|
"email": "paciente@example.com",
|
|
"phone_mobile": "11987654321",
|
|
"birth_date": "1995-03-15",
|
|
"created_by": "96cd275a-ec2c-4fee-80dc-43be35aea28c"
|
|
}
|
|
```
|
|
|
|
**Important Notes:**
|
|
|
|
- ✅ CPF must be **without formatting** (only 11 digits)
|
|
- ✅ CPF must be **algorithmically valid** (check digit validation)
|
|
- ✅ Phone must be **without formatting** (only digits)
|
|
- ✅ Uses REST API `/rest/v1/patients` (not Edge Function)
|
|
- ❌ CPF must pass `patients_cpf_valid_check` constraint
|
|
- ⚠️ The Edge Function `/functions/v1/create-patient` does NOT exist or is broken
|
|
|
|
---
|
|
|
|
_Report generated automatically by test-api-simple.ps1 and test-secretaria-api.ps1_
|
|
_PainelAdmin.tsx updated: 2025-11-05_
|
|
_For questions or issues, contact the development team_
|