HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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();
    }
}