220 lines
6.0 KiB
Markdown
220 lines
6.0 KiB
Markdown
# Intervention with All Data - Implementation Summary
|
|
|
|
## Overview
|
|
|
|
Created a comprehensive `createInterventionalldata` method in the InterventionController that handles creating an intervention along with all related entities (deceased, client, contact, location, documents) in a single atomic transaction.
|
|
|
|
## Files Created/Modified
|
|
|
|
### 1. Form Request
|
|
|
|
**File**: `app/Http/Requests/StoreInterventionWithAllDataRequest.php`
|
|
|
|
- Comprehensive validation for all entities
|
|
- Step-level error grouping (deceased, client, contact, location, documents, intervention)
|
|
- French error messages
|
|
- File validation for document uploads
|
|
|
|
### 2. Controller Method
|
|
|
|
**File**: `app/Http/Controllers/Api/InterventionController.php`
|
|
|
|
- Added `createInterventionalldata()` method
|
|
- Database transaction wrapping all operations
|
|
- Step-by-step creation flow:
|
|
1. Create deceased
|
|
2. Create client
|
|
3. Create contact (if provided)
|
|
4. Prepare location data
|
|
5. Create intervention
|
|
6. Handle document uploads
|
|
- Automatic rollback on any error
|
|
- Comprehensive logging
|
|
|
|
### 3. API Route
|
|
|
|
**File**: `routes/api.php`
|
|
|
|
- Added endpoint: `POST /api/interventions/with-all-data`
|
|
- Protected by authentication middleware
|
|
|
|
### 4. Repository Improvements
|
|
|
|
**Files**:
|
|
|
|
- `app/Repositories/DeceasedRepositoryInterface.php` (created)
|
|
- `app/Repositories/DeceasedRepository.php` (updated)
|
|
|
|
**Changes**:
|
|
|
|
- DeceasedRepository now extends BaseRepository
|
|
- Implements BaseRepositoryInterface
|
|
- Inherits transaction support from BaseRepository
|
|
- Consistent with other repository implementations
|
|
|
|
## API Endpoint
|
|
|
|
### POST /api/interventions/with-all-data
|
|
|
|
#### Request Structure:
|
|
|
|
```json
|
|
{
|
|
"deceased": {
|
|
"last_name": "Required",
|
|
"first_name": "Optional",
|
|
"birth_date": "Optional",
|
|
"death_date": "Optional",
|
|
"place_of_death": "Optional",
|
|
"notes": "Optional"
|
|
},
|
|
"client": {
|
|
"name": "Required",
|
|
"vat_number": "Optional",
|
|
"siret": "Optional",
|
|
"email": "Optional",
|
|
"phone": "Optional",
|
|
"billing_address_line1": "Optional",
|
|
"billing_postal_code": "Optional",
|
|
"billing_city": "Optional",
|
|
"billing_country_code": "Optional",
|
|
"notes": "Optional",
|
|
"is_active": "Optional"
|
|
},
|
|
"contact": {
|
|
"first_name": "Optional",
|
|
"last_name": "Optional",
|
|
"email": "Optional",
|
|
"phone": "Optional",
|
|
"role": "Optional"
|
|
},
|
|
"location": {
|
|
"name": "Optional",
|
|
"address": "Optional",
|
|
"city": "Optional",
|
|
"postal_code": "Optional",
|
|
"country_code": "Optional",
|
|
"access_instructions": "Optional",
|
|
"notes": "Optional"
|
|
},
|
|
"documents": [
|
|
{
|
|
"file": "File upload",
|
|
"name": "Required",
|
|
"description": "Optional"
|
|
}
|
|
],
|
|
"intervention": {
|
|
"type": "Required",
|
|
"scheduled_at": "Optional",
|
|
"duration_min": "Optional",
|
|
"status": "Optional",
|
|
"assigned_practitioner_id": "Optional",
|
|
"order_giver": "Optional",
|
|
"notes": "Optional",
|
|
"created_by": "Optional"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Success Response (201):
|
|
|
|
```json
|
|
{
|
|
"message": "Intervention créée avec succès",
|
|
"data": {
|
|
"intervention": { ... },
|
|
"deceased": { ... },
|
|
"client": { ... },
|
|
"contact_id": 123,
|
|
"documents_count": 2
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Error Response (422 - Validation):
|
|
|
|
```json
|
|
{
|
|
"message": "Données invalides",
|
|
"errors": {
|
|
"deceased": ["Le nom de famille est obligatoire."],
|
|
"client": ["Le nom du client est obligatoire."],
|
|
"intervention": ["Le type d'intervention est obligatoire."]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Transaction Flow
|
|
|
|
```
|
|
DB::beginTransaction()
|
|
1. Create Deceased
|
|
2. Create Client
|
|
3. Create Contact (if provided)
|
|
4. Prepare Location Notes
|
|
5. Create Intervention
|
|
6. Handle Document Uploads (pending implementation)
|
|
DB::commit()
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Validation Errors
|
|
|
|
- Caught separately with proper HTTP status (422)
|
|
- Grouped by step for better UX
|
|
- French error messages
|
|
|
|
### General Errors
|
|
|
|
- Caught with proper HTTP status (500)
|
|
- Full exception logged with trace
|
|
- Input data logged (excluding files)
|
|
- Transaction automatically rolled back
|
|
|
|
## Data Integrity
|
|
|
|
1. **BaseRepository Transaction Support**: All repository create operations use transactions
|
|
2. **Controller-level Transaction**: Main transaction wraps all operations
|
|
3. **Automatic Rollback**: Any exception triggers automatic rollback
|
|
4. **Validation Before Transaction**: All data validated before any DB operations
|
|
|
|
## Benefits
|
|
|
|
1. **Atomicity**: All-or-nothing operation - prevents partial data creation
|
|
2. **Data Integrity**: No orphaned records if any step fails
|
|
3. **Performance**: Single HTTP request for complex operation
|
|
4. **User Experience**: One form instead of multiple steps
|
|
5. **Validation**: Comprehensive client and server-side validation
|
|
6. **Logging**: Full audit trail for debugging
|
|
|
|
## Next Steps
|
|
|
|
1. **Document Upload Implementation**: Complete file upload and storage logic
|
|
2. **Location Model**: Consider creating a proper Location model instead of notes
|
|
3. **Client Location Association**: Link interventions to actual locations
|
|
4. **File Storage**: Implement proper file storage with intervention folders
|
|
5. **Email Notifications**: Add notifications to relevant parties
|
|
6. **Audit Trail**: Add more detailed logging for compliance
|
|
|
|
## Testing
|
|
|
|
To test the endpoint:
|
|
|
|
```bash
|
|
# Create intervention with all data
|
|
curl -X POST http://localhost/api/interventions/with-all-data \
|
|
-H "Authorization: Bearer {token}" \
|
|
-H "Content-Type: application/json" \
|
|
-d @intervention-data.json
|
|
```
|
|
|
|
## Notes
|
|
|
|
- All date fields should use ISO format (Y-m-d H:i:s)
|
|
- Document files should be sent as multipart/form-data
|
|
- Location data is currently appended to intervention notes (can be enhanced)
|
|
- Contact creation is optional - only created if data provided
|
|
- Default status is "demande" if not specified
|