182 lines
6.1 KiB
PHP

<?php
namespace App\Http\Controllers\Repuve;
use App\Http\Controllers\Controller;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Models\Record;
use Illuminate\Support\Facades\Storage;
use Notsoweb\ApiResponse\Enums\ApiResponse;
use Codedge\Fpdf\Fpdf\Fpdf;
class RecordController extends Controller
{
public function generatePdf($id)
{
$record = Record::with('vehicle')->findOrFail($id);
$pdf = Pdf::loadView('pdfs.record', compact('record'))
->setPaper('a4', 'portrait')
->setOptions([
'defaultFont' => 'sans-serif',
'isHtml5ParserEnabled' => true,
'isRemoteEnabled' => true,
]);
return $pdf->stream('constancia-inscripcion-' . $id . '.pdf');
}
public function generatePdfVerification($id)
{
$record = Record::with('vehicle.owner', 'user')->findOrFail($id);
$pdf = Pdf::loadView('pdfs.verification', compact('record'))
->setPaper('a4', 'landscape')
->setOptions([
'defaultFont' => 'sans-serif',
'isHtml5ParserEnabled' => true,
'isRemoteEnabled' => true,
]);
return $pdf->stream('hoja-verificacion-' . $id . '.pdf');
}
public function generatePdfConstancia($id)
{
$record = Record::with('vehicle.owner', 'user')->findOrFail($id);
$pdf = Pdf::loadView('pdfs.constancia', compact('record'))
->setPaper('a4', 'landscape')
->setOptions([
'defaultFont' => 'sans-serif',
'isHtml5ParserEnabled' => true,
'isRemoteEnabled' => true,
]);
return $pdf->stream('constancia-inscripcion' . $id . '.pdf');
}
/**
* Generar PDF con las imágenes
*/
public function generatePdfImages($id)
{
try {
// Obtener el record con sus archivos
$record = Record::with(['vehicle.owner', 'files'])->findOrFail($id);
// Validar que tenga archivos
if ($record->files->isEmpty()) {
return ApiResponse::NOT_FOUND->response([
'message' => 'El expediente no tiene imágenes adjuntas.',
'record_id' => $id,
]);
}
// Crear instancia de FPDF
$pdf = new Fpdf('P', 'mm', 'A4');
$pdf->SetAutoPageBreak(false);
$pdf->SetMargins(10, 10, 10);
$totalImages = $record->files->count();
$currentImage = 0;
foreach ($record->files as $file) {
$currentImage++;
// Buscar archivo en disk 'records'
$diskRecords = Storage::disk('records');
$fileContent = null;
if ($diskRecords->exists($file->path)) {
$fileContent = $diskRecords->get($file->path);
}
// Si no se encontró el archivo, continuar
if ($fileContent === null) {
continue;
}
// Agregar nueva página
$pdf->AddPage();
// Header con folio
$pdf->SetFillColor(44, 62, 80);
$pdf->Rect(0, 0, 210, 20, 'F');
$pdf->SetTextColor(255, 255, 255);
$pdf->SetFont('Arial', 'B', 14);
$pdf->SetXY(10, 7);
$pdf->Cell(0, 6, 'FOLIO: ' . $record->folio, 0, 1, 'L');
// Obtener ruta temporal del archivo
$tempPath = tempnam(sys_get_temp_dir(), 'pdf_img_');
file_put_contents($tempPath, $fileContent);
// Obtener dimensiones de la imagen
$imageInfo = getimagesize($tempPath);
if ($imageInfo !== false) {
list($originalWidth, $originalHeight) = $imageInfo;
$imageType = $imageInfo[2];
$availableWidth = 190; // 210mm - 20mm márgenes
$availableHeight = 247; // 297mm - 20mm header - 20mm footer - 10mm márgenes
// Calcular dimensiones manteniendo proporción
$ratio = min($availableWidth / $originalWidth, $availableHeight / $originalHeight);
$newWidth = $originalWidth * $ratio;
$newHeight = $originalHeight * $ratio;
// Centrar imagen
$x = (210 - $newWidth) / 2;
$y = 25 + (($availableHeight - $newHeight) / 2);
// Determinar tipo de imagen
$imageExtension = '';
switch ($imageType) {
case IMAGETYPE_JPEG:
$imageExtension = 'JPEG';
break;
case IMAGETYPE_PNG:
$imageExtension = 'PNG';
break;
default:
// Si no es un formato soportado, continuar
unlink($tempPath);
continue 2;
}
// Insertar imagen
$pdf->Image($tempPath, $x, $y, $newWidth, $newHeight, $imageExtension);
}
// Limpiar archivo temporal
unlink($tempPath);
}
// Verificar que se agregaron páginas
if ($pdf->PageNo() == 0) {
return ApiResponse::NOT_FOUND->response([
'message' => 'No se pudieron procesar las imágenes del expediente.',
'record_id' => $id,
]);
}
// Generar PDF
$pdfContent = $pdf->Output('S');
return response($pdfContent, 200)
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'inline; filename="expediente-imagenes-' . $record->folio . '.pdf"');
} catch (\Exception $e) {
return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al generar el PDF de imágenes',
'error' => $e->getMessage(),
]);
}
}
}