103 lines
3.8 KiB
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()
|
|
]);
|
|
}
|
|
}
|
|
}
|