File: /var/www/api_matriculas/app/Services/ExcelUploadLineService.php
<?php
namespace App\Services;
use App\Models\ExcelUploadLine;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class ExcelUploadLineService
{
/**
* Listar líneas con filtros
*/
public function list(Request $request)
{
$query = ExcelUploadLine::with(['upload:id,file_name,type', 'editedBy:id,name']);
// Filtros
if ($request->has('upload_id')) {
$query->where('upload_id', $request->upload_id);
}
if ($request->has('status')) {
$query->where('status', $request->status);
}
if ($request->has('editable')) {
$query->where('editable', $request->boolean('editable'));
}
if ($request->has('edited')) {
$query->where('edited', $request->boolean('edited'));
}
// Ordenamiento
$query->orderBy('upload_id')->orderBy('line_number');
// Paginación
$perPage = $request->get('per_page', 20);
$lines = $query->paginate($perPage);
return [
'lines' => $lines->items(),
'pagination' => [
'total' => $lines->total(),
'per_page' => $lines->perPage(),
'current_page' => $lines->currentPage(),
'last_page' => $lines->lastPage(),
'from' => $lines->firstItem(),
'to' => $lines->lastItem(),
],
];
}
/**
* Mostrar detalle de línea
*/
public function show($id)
{
return ExcelUploadLine::with([
'upload:id,file_name,type,status',
'editedBy:id,name,email',
'related'
])->findOrFail($id);
}
/**
* Actualizar múltiples líneas
*/
public function bulkUpdate(Request $request)
{
$validator = Validator::make($request->all(), [
'lines' => 'required|array|min:1',
'lines.*.id' => 'required|exists:excel_upload_lines,id',
'lines.*.data' => 'required|array',
]);
if ($validator->fails()) {
throw new \Exception($validator->errors()->first(), 422);
}
DB::beginTransaction();
try {
$userId = Auth::id();
$updated = [];
$errors = [];
foreach ($request->input('lines') as $lineData) {
try {
$line = ExcelUploadLine::findOrFail($lineData['id']);
if (!$line->editable) {
$errors[] = [
'line_id' => $line->id,
'line_number' => $line->line_number,
'error' => 'Línea no editable',
];
continue;
}
$line->updateData($lineData['data'], $userId);
$updated[] = $line->fresh();
} catch (\Exception $e) {
$errors[] = [
'line_id' => $lineData['id'],
'error' => $e->getMessage(),
];
}
}
DB::commit();
return [
'updated' => count($updated),
'errors' => count($errors),
'updated_lines' => $updated,
'errors_detail' => $errors,
];
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* Restaurar línea a datos originales
*/
public function restore($id)
{
$line = ExcelUploadLine::findOrFail($id);
if (!$line->wasEdited()) {
throw new \Exception('La línea no ha sido editada', 400);
}
$line->restoreOriginalData();
return $line->fresh();
}
}