repuve-backend-v1/app/Http/Controllers/Repuve/CancellationController.php

103 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers\Repuve;
use App\Http\Controllers\Controller;
use App\Http\Requests\Repuve\CancelConstanciaRequest;
use App\Models\Record;
use App\Models\VehicleTagLog;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Notsoweb\ApiResponse\Enums\ApiResponse;
class CancellationController extends Controller
{
/**
* Cancelar la constancia/tag
*/
public function cancelarConstancia(CancelConstanciaRequest $request)
{
try {
DB::beginTransaction();
// Buscar el expediente con sus relaciones
$record = Record::with('vehicle.tag.status')->findOrFail($request->record_id);
$vehicle = $record->vehicle;
$tag = $vehicle->tag;
// Validar que el vehículo tiene un tag asignado
if (!$tag) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'El vehículo no tiene un tag/constancia asignada.'
]);
}
// Validar que el tag está en estado activo
if (!$tag->isAssigned()) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'El tag ya no está activo. Status actual: ' . $tag->status->name
]);
}
// Validar que el registro no tenga errores previos
if ($record->error_id !== null) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'No se puede cancelar un registro que tiene errores. El vehículo no fue inscrito.',
'error_id' => $record->error_id
]);
}
// Crear registro en el log de cancelaciones
$cancellationLog = VehicleTagLog::create([
'vehicle_id' => $vehicle->id,
'tag_id' => $tag->id,
'cancellation_reason' => $request->cancellation_reason,
'cancellation_observations' => $request->cancellation_observations,
'cancellation_at' => now(),
'cancelled_by' => auth()->id(),
]);
// Actualizar estado del tag a 'cancelled' y desasignar vehículo
$tag->markAsCancelled();
DB::commit();
return ApiResponse::OK->response([
'message' => 'Constancia cancelada exitosamente',
'cancellation' => [
'id' => $cancellationLog->id,
'vehicle' => [
'id' => $vehicle->id,
'placa' => $vehicle->placa,
'niv' => $vehicle->niv,
],
'tag' => [
'id' => $tag->id,
'folio' => $tag->folio,
'old_status' => $tag->status->name,
'new_status' => 'Cancelado',
],
'cancellation_reason' => $request->cancellation_reason,
'cancellation_observations' => $request->cancellation_observations,
'cancelled_at' => $cancellationLog->cancellation_at->toDateTimeString(),
'cancelled_by' => auth()->user()->name,
]
]);
} catch (\Exception $e) {
DB::rollBack();
Log::error('Error en cancelarConstancia: ' . $e->getMessage(), [
'record_id' => $request->record_id ?? null,
'cancellation_reason' => $request->cancellation_reason ?? null,
'trace' => $e->getTraceAsString()
]);
return ApiResponse::BAD_REQUEST->response([
'message' => 'Error al cancelar la constancia',
'error' => $e->getMessage()
]);
}
}
}