- Added GitHub spec-kit for development workflow - Standardized file signatures to Descomplicar® format - Updated development configuration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
562 lines
14 KiB
Markdown
562 lines
14 KiB
Markdown
# KiviCare API - Especificações Técnicas
|
|
|
|
**Projeto**: KiviCare MCP Integration
|
|
**Versão**: 1.0.0
|
|
**Data**: 2025-01-12
|
|
**Autor**: Descomplicar® Crescimento Digital
|
|
**URL**: https://descomplicar.pt
|
|
|
|
---
|
|
|
|
## 🎯 OVERVIEW DO SISTEMA
|
|
|
|
### Descrição
|
|
KiviCare é um sistema completo de gestão de clínicas médicas implementado como plugin WordPress. O sistema gere pacientes, médicos, consultas, prescrições, faturas e relatórios médicos através de uma estrutura de base de dados com 35 tabelas especializadas.
|
|
|
|
### Funcionalidades Core
|
|
- **Gestão de Pacientes**: Registo, histórico médico, consultas
|
|
- **Gestão de Médicos**: Perfis, horários, especializações
|
|
- **Agendamento**: Consultas, lembretes, integrações (Zoom/Google Meet)
|
|
- **Consultas Médicas**: Encounters, prescrições, relatórios
|
|
- **Faturação**: Bills, pagamentos, serviços
|
|
- **Administração**: Clínicas, utilizadores, configurações
|
|
|
|
---
|
|
|
|
## 🏗️ ARQUITETURA DA BASE DE DADOS
|
|
|
|
### Tabelas Principais (Core)
|
|
|
|
#### 🏥 **wp_kc_clinics** - Gestão de Clínicas
|
|
```sql
|
|
- id (bigint, PK)
|
|
- name (varchar 191)
|
|
- email (varchar 191)
|
|
- telephone_no (varchar 191)
|
|
- specialties (longtext)
|
|
- address (text)
|
|
- city, state, country (varchar 191)
|
|
- postal_code (varchar 191)
|
|
- status (tinyint)
|
|
- clinic_admin_id (bigint)
|
|
- clinic_logo, profile_image (bigint)
|
|
- extra (longtext)
|
|
```
|
|
|
|
#### 👨⚕️ **wp_kc_appointments** - Agendamentos
|
|
```sql
|
|
- id (bigint, PK)
|
|
- appointment_start_date (date)
|
|
- appointment_start_time (time)
|
|
- appointment_end_date (date)
|
|
- appointment_end_time (time)
|
|
- visit_type (varchar 191)
|
|
- clinic_id (bigint) → FK wp_kc_clinics
|
|
- doctor_id (bigint) → FK wp_users
|
|
- patient_id (bigint) → FK wp_users
|
|
- description (text)
|
|
- status (tinyint)
|
|
- created_at (datetime)
|
|
- appointment_report (longtext)
|
|
```
|
|
|
|
#### 🩺 **wp_kc_patient_encounters** - Consultas Médicas
|
|
```sql
|
|
- id (bigint, PK)
|
|
- encounter_date (date)
|
|
- clinic_id (bigint) → FK wp_kc_clinics
|
|
- doctor_id (bigint) → FK wp_users
|
|
- patient_id (bigint) → FK wp_users
|
|
- appointment_id (bigint) → FK wp_kc_appointments
|
|
- description (text)
|
|
- status (tinyint)
|
|
- added_by (bigint)
|
|
- created_at (datetime)
|
|
- template_id (bigint)
|
|
```
|
|
|
|
#### 💊 **wp_kc_prescription** - Prescrições
|
|
```sql
|
|
- id (bigint, PK)
|
|
- encounter_id (bigint) → FK wp_kc_patient_encounters
|
|
- patient_id (bigint) → FK wp_users
|
|
- name (text) - Nome do medicamento
|
|
- frequency (varchar 199)
|
|
- duration (varchar 199)
|
|
- instruction (text)
|
|
- added_by (bigint)
|
|
- created_at (datetime)
|
|
- is_from_template (tinyint)
|
|
```
|
|
|
|
#### 💰 **wp_kc_bills** - Faturação
|
|
```sql
|
|
- id (bigint, PK)
|
|
- encounter_id (bigint) → FK wp_kc_patient_encounters
|
|
- appointment_id (bigint) → FK wp_kc_appointments
|
|
- title (varchar 191)
|
|
- total_amount (varchar 50)
|
|
- discount (varchar 50)
|
|
- actual_amount (varchar 50)
|
|
- status (bigint)
|
|
- payment_status (varchar 10)
|
|
- created_at (datetime)
|
|
- clinic_id (bigint)
|
|
```
|
|
|
|
### Tabelas de Relacionamentos
|
|
|
|
#### 🔗 **wp_kc_doctor_clinic_mappings**
|
|
```sql
|
|
- doctor_id → wp_users
|
|
- clinic_id → wp_kc_clinics
|
|
```
|
|
|
|
#### 🔗 **wp_kc_patient_clinic_mappings**
|
|
```sql
|
|
- patient_id → wp_users
|
|
- clinic_id → wp_kc_clinics
|
|
```
|
|
|
|
#### 🔗 **wp_kc_appointment_service_mapping**
|
|
```sql
|
|
- appointment_id → wp_kc_appointments
|
|
- service_id → wp_kc_services
|
|
```
|
|
|
|
### Tabelas Especializadas
|
|
|
|
#### ⚕️ **wp_kc_services** - Serviços Médicos
|
|
```sql
|
|
- id, type, name, price, status, created_at
|
|
```
|
|
|
|
#### 📋 **wp_kc_medical_history** - Histórico Médico
|
|
```sql
|
|
- encounter_id, patient_id, type, title, added_by
|
|
```
|
|
|
|
#### 🔧 **wp_kc_custom_fields** - Campos Personalizados
|
|
```sql
|
|
- name, type, status, created_at
|
|
```
|
|
|
|
#### 📞 **wp_kc_appointment_reminder_mapping** - Lembretes
|
|
```sql
|
|
- appointment_id, status, created_at
|
|
```
|
|
|
|
#### 🎥 **Integrações Video**
|
|
- `wp_kc_appointment_zoom_mappings`
|
|
- `wp_kc_appointment_google_meet_mappings`
|
|
- `wp_kc_gcal_appointment_mapping`
|
|
|
|
---
|
|
|
|
## 🎛️ ENDPOINTS API PROPOSTOS
|
|
|
|
### **Authentication**
|
|
```http
|
|
POST /wp-json/kivicare/v1/auth/login
|
|
POST /wp-json/kivicare/v1/auth/refresh
|
|
POST /wp-json/kivicare/v1/auth/logout
|
|
```
|
|
|
|
### **Clínicas**
|
|
```http
|
|
GET /wp-json/kivicare/v1/clinics
|
|
POST /wp-json/kivicare/v1/clinics
|
|
GET /wp-json/kivicare/v1/clinics/{id}
|
|
PUT /wp-json/kivicare/v1/clinics/{id}
|
|
DELETE /wp-json/kivicare/v1/clinics/{id}
|
|
```
|
|
|
|
### **Pacientes**
|
|
```http
|
|
GET /wp-json/kivicare/v1/patients
|
|
POST /wp-json/kivicare/v1/patients
|
|
GET /wp-json/kivicare/v1/patients/{id}
|
|
PUT /wp-json/kivicare/v1/patients/{id}
|
|
GET /wp-json/kivicare/v1/patients/{id}/history
|
|
GET /wp-json/kivicare/v1/patients/{id}/encounters
|
|
GET /wp-json/kivicare/v1/patients/{id}/prescriptions
|
|
```
|
|
|
|
### **Médicos**
|
|
```http
|
|
GET /wp-json/kivicare/v1/doctors
|
|
GET /wp-json/kivicare/v1/doctors/{id}
|
|
GET /wp-json/kivicare/v1/doctors/{id}/schedule
|
|
GET /wp-json/kivicare/v1/doctors/{id}/appointments
|
|
PUT /wp-json/kivicare/v1/doctors/{id}/schedule
|
|
```
|
|
|
|
### **Agendamentos**
|
|
```http
|
|
GET /wp-json/kivicare/v1/appointments
|
|
POST /wp-json/kivicare/v1/appointments
|
|
GET /wp-json/kivicare/v1/appointments/{id}
|
|
PUT /wp-json/kivicare/v1/appointments/{id}
|
|
DELETE /wp-json/kivicare/v1/appointments/{id}
|
|
GET /wp-json/kivicare/v1/appointments/available-slots
|
|
```
|
|
|
|
### **Consultas Médicas**
|
|
```http
|
|
GET /wp-json/kivicare/v1/encounters
|
|
POST /wp-json/kivicare/v1/encounters
|
|
GET /wp-json/kivicare/v1/encounters/{id}
|
|
PUT /wp-json/kivicare/v1/encounters/{id}
|
|
GET /wp-json/kivicare/v1/encounters/{id}/prescriptions
|
|
POST /wp-json/kivicare/v1/encounters/{id}/prescriptions
|
|
```
|
|
|
|
### **Faturação**
|
|
```http
|
|
GET /wp-json/kivicare/v1/bills
|
|
POST /wp-json/kivicare/v1/bills
|
|
GET /wp-json/kivicare/v1/bills/{id}
|
|
PUT /wp-json/kivicare/v1/bills/{id}
|
|
POST /wp-json/kivicare/v1/bills/{id}/payment
|
|
```
|
|
|
|
### **Serviços**
|
|
```http
|
|
GET /wp-json/kivicare/v1/services
|
|
POST /wp-json/kivicare/v1/services
|
|
PUT /wp-json/kivicare/v1/services/{id}
|
|
DELETE /wp-json/kivicare/v1/services/{id}
|
|
```
|
|
|
|
### **Relatórios**
|
|
```http
|
|
GET /wp-json/kivicare/v1/reports/appointments
|
|
GET /wp-json/kivicare/v1/reports/revenue
|
|
GET /wp-json/kivicare/v1/reports/patients
|
|
GET /wp-json/kivicare/v1/reports/doctors
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 SEGURANÇA E AUTENTICAÇÃO
|
|
|
|
### WordPress Authentication
|
|
- **JWT Token** baseado em wp_users
|
|
- **Role-based access**: administrator, doctor, patient, receptionist
|
|
- **Capability checks** por endpoint
|
|
- **Nonce verification** para operações críticas
|
|
|
|
### Permissions Matrix
|
|
```php
|
|
'administrator' => ['all_operations'],
|
|
'doctor' => ['read_own_patients', 'create_encounters', 'prescriptions'],
|
|
'patient' => ['read_own_data', 'book_appointments'],
|
|
'receptionist' => ['manage_appointments', 'basic_patient_data']
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 MODELOS DE DADOS
|
|
|
|
### Patient Profile
|
|
```json
|
|
{
|
|
"id": 123,
|
|
"name": "João Silva",
|
|
"email": "joao@email.com",
|
|
"phone": "+351912345678",
|
|
"birth_date": "1985-05-15",
|
|
"gender": "M",
|
|
"address": {
|
|
"street": "Rua da Saúde, 123",
|
|
"city": "Lisboa",
|
|
"postal_code": "1000-001"
|
|
},
|
|
"medical_history": [
|
|
{
|
|
"type": "chronic_disease",
|
|
"title": "Diabetes Tipo 2",
|
|
"date": "2020-01-15"
|
|
}
|
|
],
|
|
"last_visit": "2024-12-15",
|
|
"clinic_id": 1
|
|
}
|
|
```
|
|
|
|
### Appointment
|
|
```json
|
|
{
|
|
"id": 456,
|
|
"start_date": "2024-12-20",
|
|
"start_time": "14:30:00",
|
|
"end_date": "2024-12-20",
|
|
"end_time": "15:00:00",
|
|
"visit_type": "consultation",
|
|
"status": "scheduled",
|
|
"patient": {
|
|
"id": 123,
|
|
"name": "João Silva"
|
|
},
|
|
"doctor": {
|
|
"id": 789,
|
|
"name": "Dr. Maria Santos"
|
|
},
|
|
"clinic": {
|
|
"id": 1,
|
|
"name": "Clínica Central"
|
|
},
|
|
"services": ["consultation_general"],
|
|
"notes": "Consulta de rotina"
|
|
}
|
|
```
|
|
|
|
### Medical Encounter
|
|
```json
|
|
{
|
|
"id": 789,
|
|
"encounter_date": "2024-12-20",
|
|
"patient_id": 123,
|
|
"doctor_id": 789,
|
|
"appointment_id": 456,
|
|
"diagnosis": "Gripe comum",
|
|
"symptoms": ["febre", "tosse", "dor de garganta"],
|
|
"prescriptions": [
|
|
{
|
|
"medication": "Paracetamol 500mg",
|
|
"frequency": "8/8h",
|
|
"duration": "7 dias",
|
|
"instructions": "Tomar com água após refeições"
|
|
}
|
|
],
|
|
"next_visit": "2024-12-27",
|
|
"status": "completed"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 IMPLEMENTAÇÃO TÉCNICA
|
|
|
|
### Plugin WordPress Structure
|
|
```
|
|
kivicare-api/
|
|
├── kivicare-api.php (main plugin file)
|
|
├── includes/
|
|
│ ├── class-kivicare-api.php
|
|
│ ├── class-rest-controller.php
|
|
│ └── endpoints/
|
|
│ ├── class-clinics-endpoint.php
|
|
│ ├── class-patients-endpoint.php
|
|
│ ├── class-appointments-endpoint.php
|
|
│ ├── class-encounters-endpoint.php
|
|
│ └── class-bills-endpoint.php
|
|
├── models/
|
|
│ ├── class-clinic.php
|
|
│ ├── class-patient.php
|
|
│ ├── class-appointment.php
|
|
│ └── class-encounter.php
|
|
└── utils/
|
|
├── class-auth-helper.php
|
|
├── class-data-validator.php
|
|
└── class-db-helper.php
|
|
```
|
|
|
|
### Core Classes
|
|
```php
|
|
class KiviCare_API_Clinics_Endpoint extends WP_REST_Controller {
|
|
protected $namespace = 'kivicare/v1';
|
|
protected $rest_base = 'clinics';
|
|
|
|
public function register_routes() {
|
|
register_rest_route($this->namespace, '/' . $this->rest_base, [
|
|
'methods' => WP_REST_Server::READABLE,
|
|
'callback' => [$this, 'get_items'],
|
|
'permission_callback' => [$this, 'get_items_permissions_check']
|
|
]);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Database Queries Optimization
|
|
```php
|
|
class KiviCare_DB_Helper {
|
|
public static function get_patient_full_data($patient_id) {
|
|
global $wpdb;
|
|
|
|
$query = "
|
|
SELECT p.*, pm.clinic_id, c.name as clinic_name
|
|
FROM {$wpdb->users} p
|
|
LEFT JOIN {$wpdb->prefix}kc_patient_clinic_mappings pm ON p.ID = pm.patient_id
|
|
LEFT JOIN {$wpdb->prefix}kc_clinics c ON pm.clinic_id = c.id
|
|
WHERE p.ID = %d
|
|
";
|
|
|
|
return $wpdb->get_row($wpdb->prepare($query, $patient_id));
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 TESTES E VALIDAÇÃO
|
|
|
|
### Unit Tests
|
|
```php
|
|
class Test_KiviCare_Appointments extends WP_UnitTestCase {
|
|
public function test_create_appointment() {
|
|
$appointment_data = [
|
|
'patient_id' => 1,
|
|
'doctor_id' => 2,
|
|
'clinic_id' => 1,
|
|
'start_date' => '2024-12-20',
|
|
'start_time' => '14:30:00'
|
|
];
|
|
|
|
$result = KiviCare_Appointments::create($appointment_data);
|
|
$this->assertIsInt($result);
|
|
$this->assertGreaterThan(0, $result);
|
|
}
|
|
}
|
|
```
|
|
|
|
### API Integration Tests
|
|
```bash
|
|
# Test Authentication
|
|
curl -X POST http://site.local/wp-json/kivicare/v1/auth/login \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username":"doctor","password":"password"}'
|
|
|
|
# Test Get Appointments
|
|
curl -X GET http://site.local/wp-json/kivicare/v1/appointments \
|
|
-H "Authorization: Bearer TOKEN"
|
|
|
|
# Test Create Appointment
|
|
curl -X POST http://site.local/wp-json/kivicare/v1/appointments \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer TOKEN" \
|
|
-d '{"patient_id":1,"doctor_id":2,"start_date":"2024-12-20"}'
|
|
```
|
|
|
|
---
|
|
|
|
## 📈 PERFORMANCE E ESCALABILIDADE
|
|
|
|
### Database Indexes
|
|
```sql
|
|
ALTER TABLE wp_kc_appointments
|
|
ADD INDEX idx_doctor_date (doctor_id, appointment_start_date);
|
|
|
|
ALTER TABLE wp_kc_patient_encounters
|
|
ADD INDEX idx_patient_date (patient_id, encounter_date);
|
|
|
|
ALTER TABLE wp_kc_bills
|
|
ADD INDEX idx_clinic_status (clinic_id, status);
|
|
```
|
|
|
|
### Caching Strategy
|
|
```php
|
|
class KiviCare_Cache {
|
|
public static function get_patient_encounters($patient_id) {
|
|
$cache_key = "patient_encounters_{$patient_id}";
|
|
$encounters = wp_cache_get($cache_key, 'kivicare');
|
|
|
|
if (false === $encounters) {
|
|
$encounters = self::fetch_from_db($patient_id);
|
|
wp_cache_set($cache_key, $encounters, 'kivicare', 3600);
|
|
}
|
|
|
|
return $encounters;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔧 CONFIGURAÇÃO E DEPLOYMENT
|
|
|
|
### Plugin Activation
|
|
```php
|
|
register_activation_hook(__FILE__, 'kivicare_api_activate');
|
|
|
|
function kivicare_api_activate() {
|
|
// Verificar se KiviCare plugin está ativo
|
|
if (!is_plugin_active('kivicare-clinic-&-patient-management-system/kivicare-clinic-&-patient-management-system.php')) {
|
|
wp_die('KiviCare Plugin é necessário para ativar a API.');
|
|
}
|
|
|
|
// Criar capabilities
|
|
$role = get_role('doctor');
|
|
$role->add_cap('manage_kivicare_api');
|
|
|
|
// Flush rewrite rules
|
|
flush_rewrite_rules();
|
|
}
|
|
```
|
|
|
|
### Environment Configuration
|
|
```php
|
|
// wp-config.php additions
|
|
define('KIVICARE_API_VERSION', '1.0.0');
|
|
define('KIVICARE_API_DEBUG', false);
|
|
define('KIVICARE_API_CACHE_TTL', 3600);
|
|
define('KIVICARE_JWT_SECRET', 'your-secret-key');
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 CHECKLIST DE IMPLEMENTAÇÃO
|
|
|
|
### Fase 1 - Core API (Semana 1-2)
|
|
- [ ] Plugin base e estrutura
|
|
- [ ] Authentication endpoints
|
|
- [ ] Clinics CRUD endpoints
|
|
- [ ] Patients CRUD endpoints
|
|
- [ ] Basic error handling
|
|
|
|
### Fase 2 - Appointments & Encounters (Semana 3-4)
|
|
- [ ] Appointments CRUD endpoints
|
|
- [ ] Slot availability logic
|
|
- [ ] Patient encounters endpoints
|
|
- [ ] Prescription management
|
|
|
|
### Fase 3 - Billing & Advanced (Semana 5-6)
|
|
- [ ] Bills and payments endpoints
|
|
- [ ] Services management
|
|
- [ ] Reporting endpoints
|
|
- [ ] Advanced filtering and search
|
|
|
|
### Fase 4 - Testing & Documentation (Semana 7-8)
|
|
- [ ] Unit tests completos
|
|
- [ ] Integration tests
|
|
- [ ] API documentation
|
|
- [ ] Performance optimization
|
|
|
|
---
|
|
|
|
## 🔮 ROADMAP FUTURO
|
|
|
|
### v1.1 - Integrações
|
|
- Sincronização com calendários externos
|
|
- Integração com sistemas de pagamento
|
|
- Notificações push/email automatizadas
|
|
|
|
### v1.2 - Analytics
|
|
- Dashboard de métricas médicas
|
|
- Relatórios financeiros avançados
|
|
- Business intelligence integrado
|
|
|
|
### v1.3 - Mobile
|
|
- App mobile nativo
|
|
- Offline synchronization
|
|
- Patient portal app
|
|
|
|
---
|
|
|
|
**Assinatura**: Descomplicar® Crescimento Digital
|
|
**URL**: https://descomplicar.pt
|
|
**Contacto**: Desenvolvimento técnico especializado
|
|
|
|
---
|
|
|
|
*Especificações técnicas detalhadas para implementação de API KiviCare com arquitetura WordPress robusta e escalável.* |