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/PeriodService.php
<?php

namespace App\Services;

use App\Http\Resources\PeriodResource;
use App\Repositories\PeriodRepository;
use Exception;

class PeriodService
{
    protected $periodRepository;

    public function __construct(PeriodRepository $periodRepository)
    {
        $this->periodRepository = $periodRepository;
    }

    public function list($allData = true)
    {
        $registers = $this->periodRepository->getAll();
        if ($registers->count() < 1) {
            return [];
        }

        return $registers->map(fn($row) => new PeriodResource($row, $allData));
    }

    public function store($request)
    {
        $validateField = $this->periodRepository->getByYear($request->period_year);
        if ($validateField) {
            throw new Exception("Ya existe un periodo para ese año", 409);
        }

        $register = $this->periodRepository->create((object)$request);
        if (!$register) {
            throw new Exception("Ocurrió un problema al registrar el periodo", 500);
        }

        return $this->show($register->id, false);
    }

    public function update($request, $id)
    {
        $register = $this->show($id, true);

        if ($request->has('period_year')) {
            $validateField = $this->periodRepository->getByYear($request->period_year, $id);
            if ($validateField) {
                throw new Exception("Ya existe un periodo para ese año", 409);
            }
        }

        $updated = $this->periodRepository->update($register, $request);
        if (!$updated) {
            throw new Exception("Ocurrió un problema al actualizar el periodo", 500);
        }

        return $updated;
    }

    public function show($id, $allData = false)
    {
        $register = $this->periodRepository->getById($id);
        if (!$register) {
            throw new Exception("Periodo no existe o fue eliminado", 400);
        }

        return $allData ? $register : (object)(new PeriodResource($register))->resolve();
    }

    public function delete($id)
    {
        $register = $this->show($id, true);
        $register->deleted = 1;
        $register->deleted_at = now();
        $register->user_deleted = auth()->id();

        if (!$register->save()) {
            throw new Exception("Ocurrió un problema al eliminar el periodo", 500);
        }

        return true;
    }

    public function activate($id)
    {
        $period = $this->periodRepository->activate($id);

        return (object)[
            'message' => "Periodo {$period->period} activado correctamente.",
            'period'  => $period
        ];
    }

    public function deactivate($id)
    {
        $period = $this->periodRepository->deactivate($id);

        return (object)[
            'message' => "Periodo {$period->period} desactivado correctamente.",
            'period'  => $period
        ];
    }

    public function getPeriodActivate()
    {
        $data = $this->periodRepository->getActive();
        return $this->formatPeriodData($data);
    }

    public function getPeriodDataById($id)
    {
        $data = $this->periodRepository->getById($id);
        return $this->formatPeriodData($data);
    }

    private function formatPeriodData($data)
    {
        if (empty($data)) {
            return null;
        }
        return [
            'id'          => $data->id,
            'period_year' => $data->period_year,
            'period'      => $data->period,
            'start_date'  => $data->start_date,
            'end_date'    => $data->end_date,
            'status'      => $data->status,
            'finished'    => $data->finished,
            'segments' => $data->enrollmentPeriods->map(fn($seg) => [
                'id'          => $seg->id,
                'description' => $seg->description,
                'start_date'  => $seg->start_date,
                'end_date'    => $seg->end_date,
                'status'      => $seg->status,
            ])
        ];
    }

    public function getPeriodsForParent()
    {
        $parentId = auth()->user()->parent->id ?? 0;
        $periods = $this->periodRepository->getPeriodsForParent($parentId);
        if ($periods->count() < 1) {
            return [];
        }
        return $periods->map(fn($row) => new PeriodResource($row));
    }
}