This commit is contained in:
2025-10-08 19:48:48 +02:00
parent cdcd34fa0f
commit 76e3053e50
14 changed files with 587 additions and 52 deletions
@@ -6,6 +6,7 @@ use App\Models\ServiceRequest;
use App\Models\Setting;
use App\Models\Communication;
use App\Mail\ServiceRequestNotification;
use App\Mail\PickupConfirmation;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
@@ -115,11 +116,11 @@ class ServiceRequestController extends Controller
$validated = $request->validate([
'actual_repair_date' => 'nullable|date|after:today',
'actual_repair_time' => 'nullable|date_format:H:i',
'status' => 'nullable|in:pending,confirmed,completed,cancelled',
'status' => 'nullable|in:pending,confirmed,mail_sent,completed,cancelled',
], [
'actual_repair_date.after' => 'Werkelijke reparatie datum moet in de toekomst liggen',
'actual_repair_time.date_format' => 'Werkelijke reparatie tijd moet een geldig tijdformaat hebben (HH:MM)',
'status.in' => 'Status moet een van de volgende waarden hebben: in afwachting, bevestigd, voltooid, geannuleerd',
'status.in' => 'Status moet een van de volgende waarden hebben: in afwachting, bevestigd, bevestigd mail verstuurd, voltooid, geannuleerd',
]);
$serviceRequest->update($validated);
@@ -252,6 +253,74 @@ class ServiceRequestController extends Controller
}
}
/**
* Send pickup confirmation email to customer
*/
public function sendPickupConfirmation(ServiceRequest $serviceRequest): JsonResponse
{
try {
if (empty($serviceRequest->email)) {
return response()->json([
'message' => 'Geen e-mailadres beschikbaar voor deze service aanvraag'
], 400);
}
if (empty($serviceRequest->actual_repair_date) || empty($serviceRequest->actual_repair_time)) {
return response()->json([
'message' => 'Werkelijke reparatie datum en tijd zijn vereist'
], 400);
}
// Get the custom message from settings
$customMessage = Setting::getValue('pickup_confirmation_email_text', 'Uw fiets is klaar en kan worden opgehaald.');
// Format the pickup date and time
$pickupDate = \Carbon\Carbon::parse($serviceRequest->actual_repair_date)->format('d-m-Y');
$pickupTime = $serviceRequest->actual_repair_time;
// Send email
Mail::to($serviceRequest->email)->send(
new PickupConfirmation(
$serviceRequest,
$customMessage,
$pickupDate,
$pickupTime
)
);
// Update status to 'mail_sent'
$serviceRequest->update(['status' => 'mail_sent']);
// Store communication record
$communication = Communication::create([
'service_request_id' => $serviceRequest->id,
'type' => 'email',
'message' => 'Ophaalbevestiging verzonden - Datum: ' . $pickupDate . ', Tijd: ' . $pickupTime,
'direction' => 'admin_to_customer',
'recipient' => $serviceRequest->email,
'sent_at' => now(),
]);
Log::info('Ophaalbevestiging e-mail verzonden naar klant', [
'service_request_id' => $serviceRequest->id,
'email' => $serviceRequest->email,
'pickup_date' => $pickupDate,
'pickup_time' => $pickupTime
]);
return response()->json([
'message' => 'Ophaalbevestiging succesvol verzonden',
'communication' => $communication,
'service_request' => $serviceRequest->fresh()
]);
} catch (\Exception $e) {
return response()->json([
'message' => 'Ophaalbevestiging verzenden mislukt',
'error' => $e->getMessage()
], 500);
}
}
/**
* Get communication history
*/
@@ -261,7 +330,7 @@ class ServiceRequestController extends Controller
$communications = $serviceRequest->communications()
->orderBy('created_at', 'desc')
->get();
return response()->json($communications);
} catch (\Exception $e) {
return response()->json([
+58
View File
@@ -0,0 +1,58 @@
<?php
namespace App\Mail;
use App\Models\ServiceRequest;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PickupConfirmation extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public ServiceRequest $serviceRequest,
public string $customMessage,
public string $pickupDate,
public string $pickupTime
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Uw fiets is klaar voor ophalen - ' . $this->serviceRequest->name,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'emails.pickup-confirmation',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}
+2 -4
View File
@@ -24,10 +24,8 @@ class ServiceRequest extends Model
];
protected $casts = [
'requested_date' => 'date',
'requested_time' => 'datetime:H:i',
'actual_repair_date' => 'date',
'actual_repair_time' => 'datetime:H:i',
'requested_date' => 'date:Y-m-d',
'actual_repair_date' => 'date:Y-m-d',
];
public function communications()